毕业设计电子时钟程序.doc_第1页
毕业设计电子时钟程序.doc_第2页
毕业设计电子时钟程序.doc_第3页
毕业设计电子时钟程序.doc_第4页
毕业设计电子时钟程序.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include #define uchar unsigned char #define uint unsigned int#define LCD_PORT P0sbit RS = P10;sbit RW = P11;sbit EN = P12;sbit KEY1 = P13;sbit KEY2 = P14;sbit KEY3 = P15;sbit KEY4 = P16;sbit LED1 = P20;sbit LED2 = P21;sbit BEEP = P22;sbit HW = P33;sbit DS = P34;void Delay(uint t);void Delay_Ms(uint t);void WriteData(uchar DAT);void WriteCommand(uchar COM);void LcdPost(uchar X,uchar Y);void DisplayChar(uchar X,uchar Y,uchar DAT);void DisplayString(uchar X,uchar Y,uchar *p);void InitLcd1602();void reset();bit read_bit();void write_all(uchar date);unsigned char read_all();void tempchange();unsigned int get_temp();void Welcome_Page();void Clean_Screen();void Display_Temper(uint temper);void Display(uchar x,uchar y,uint num);void Display_Date();void Display_Week();void Display_Ring();void Display_Lcd();void Check_Ring();void Check_Temperature();void Key_Scan();void Key_Service();void Beep();void Alarm_Led(uchar num);void Alarm_Ringing();void Timer0_Init();void HW_Init();void System_Init();unsigned char date;unsigned char year,month,day,week,hour,min,sec,ring;unsigned char ring_hour,ring_min,ring_sec;unsigned int temperature;unsigned char flag=0,ring_flag=0;unsigned char hw_data4=0;bit temper_alarm = 0;bit hw_flag = 0;bit set_date = 0;bit set_ring = 0;bit add_flag = 0;bit sub_flag = 0;bit ring_open = 0;bit isRingTime = 0;bit key_on = 0;bit hw_on = 0;void main()System_Init(); /系统初始化while(1)if(set_ring=0)&(set_date=0)Display_Lcd();Check_Ring();Check_Temperature();Key_Scan();void Delay(uint t) /延时微秒函数while(t-);void Delay_Ms(uint t) /延时毫秒函数unsigned int x,y;for(x=t;x0;x-)for(y=110;y0;y-);void WriteData(uchar DAT) /写数据到LCDRS = 1;RW = 0;LCD_PORT = DAT;EN = 1;Delay_Ms(5);EN = 0;void WriteCommand(uchar COM) /写指令到LCDRS = 0;RW = 0;LCD_PORT = COM;EN = 1;Delay_Ms(5);EN = 0;void LcdPost(uchar X,uchar Y) /设置显示坐标函数uchar addr;if(X = 0)addr = 0x80 + Y; else if(X = 1)addr = 0x80 + 0x40 + Y; WriteCommand(addr);void DisplayChar(uchar X,uchar Y,uchar DAT) /显示一个字符LcdPost(X,Y);WriteData(DAT);void DisplayString(uchar X,uchar Y,uchar *p) /显示一个字符串LcdPost(X,Y);while(*p != 0)WriteData(*p);p+;void InitLcd1602()WriteCommand(0x38); /设置16*2显示,5*7点阵,8位数据接口WriteCommand(0x0c); /开显示及光标设置WriteCommand(0x06); /光标移动设置WriteCommand(0x01); /显示清屏Welcome_Page(); /显示欢迎界面Delay_Ms(1000); /延时1000毫秒Clean_Screen(); /清屏void reset()/初始化子程序uint i;DS=0;i=90;while(i0)i-;/低电平后延时750微秒左右DS=1;i=4;while(i0)i-;/高电平后延时40微秒左右等待DS18B20的低电平答复bit read_bit()/读一位数据子程序uint i;bit date;/位变量数据DS=0;i+;/拉低到0后延时6微秒左右DS=1;i+;/拉高到1后延时4微秒左右date=DS;/读数据线上的状态位i=4;while(i0)i-;/延时30微秒左右return(date);/把状态位返回给调用函数unsigned char read_all()/读八位数据(一字节)子程序uchar i,j;for(i=1;i=8;i+)j=read_bit();/把读到的状态位赋给J的第一位j=1;/把date往右移动一位(即把上一次的数据往右移动一位)(无论date原来是什么,新移入的位是0)date=j|date;/J与date进行按位或运算(其实是让刚刚读到的状态位写到date的最高位中)/循环的读状态位,并写入最高位,并每次向右移到,最后八个状态位刚好由低位到高位写入date的八位return(date);/把读到的完整数据返回给调用函数void write_all(uchar date)/写一个字节子程序uint i,j;bit text;/要发送的数据,默认值为0for(j=1;j1;/date右移一位,丢弃第一位状态位,使第二位状态位移到第一位,好让下次赋给text的是date的第二位if(text)/如果要发送数据为1DS=0;i+;i+;/低电平后延时8微秒左右DS=1;/发送数据1,并同时把数据线拉到高电平1i=8;while(i0)i-;/延时70微秒左右返回下一次读数据else/如果要发送数据为0DS=0;i=8;while(i0)i-;/使数据线置低电平15微秒,并发送数据0,保持45微秒,总共70微秒左右DS=1;i+;i+;/使数据线返回高电平1,并延时8微秒左右,确保下次读数据前数据线为高电平1void tempchange()/开始获取温度并转换reset();Delay_Ms(1);/确保DS18B20进入工作write_all(0xcc);/跳过读ROM命令write_all(0x44);/写温度转换指令unsigned int get_temp()/读取寄存器中存储的温度数据uchar a,b;unsigned int temp;double f_temp;EA=0;tempchange();reset();Delay_Ms(1);/确保DS18B20进入工作write_all(0xcc);/跳过读ROM命令write_all(0xbe);/要都RAM中的数据a=read_all();/读低八位数据b=read_all();/读高八位数据temp=b;temp320)temper_alarm = 1;elsetemper_alarm = 0;BEEP = 1;if(temper_alarm)Alarm_Ringing();Alarm_Led(1);void Beep() /蜂鸣器响一下BEEP = 0;Delay_Ms(50);BEEP = 1;void Alarm_Led(uchar num)if(num=1)LED1 = 0;Delay_Ms(100);LED1 = 1;Delay_Ms(100);else if(num=2)LED2 = 0;Delay_Ms(100);LED2 = 1;Delay_Ms(100);void Alarm_Ringing() /闹钟响BEEP = 0;Delay_Ms(20);BEEP = 1;Delay_Ms(20);void Key_Scan()/*红外键盘扫描*/if(key_on=0)&(hw_flag=1)&(isRingTime=0)hw_flag = 0;hw_on = 1;switch(hw_data3)case 0xbb: /左移键 | 进入设置闹钟界面if(set_date=0)TR0 = 0;ring_flag+;set_ring = 1;if(ring_flag=5)ring_flag=0;set_ring=0;TR0 = 1;Display_Ring();break;case 0xea: / + 键if(set_date|set_ring)add_flag = 1;break; case 0xf8: / - 键if(set_date|set_ring) sub_flag = 1;break;case 0xbc: /PLAY键 WriteCommand(0x0c);isRingTime = 0;set_date = 0;set_ring = 0;ring_flag = 0;flag = 0;TR0 = 1;key_on = 0;hw_on = 0;break;default: break;/*独立键盘扫描*/else if(set_ring=0)&(KEY1=0)&(isRingTime=0)&(hw_on=0)/设置日期界面Delay_Ms(5);if(set_ring=0)&(KEY1=0)while(!KEY1);TR0 = 0;flag+;key_on = 1;hw_on = 0;set_date = 1;set_ring = 0;if(flag=8)flag=0;set_date=0;key_on=0;TR0 = 1;else if(set_date=0)&(KEY4=0)&(isRingTime=0)&(hw_on=0) /设置闹钟界面Delay_Ms(5);if(set_date=0)&(KEY4=0)while(!KEY4);TR0 = 0;ring_flag+;key_on = 1;hw_on = 0;set_ring = 1;set_date = 0;if(ring_flag=5)ring_flag=0;set_ring=0;key_on=0;TR0 = 1;Display_Ring();/*/if(set_date|set_ring)&(hw_on=0)if(KEY2=0&(hw_on=0) /按键加Delay_Ms(5);if(KEY2=0)while(!KEY2);add_flag = 1;else if(KEY3=0&(hw_on=0) /按键减Delay_Ms(5);if(KEY3=0)while(!KEY3);sub_flag = 1;else if(set_date=1)&(set_ring=0)&(KEY4=0)&(hw_on=0)/设置日期时,按KEY4键退出Delay_Ms(5);if(set_date=1)&(set_ring=0)&(KEY4=0)while(!KEY4);WriteCommand(0x0c);set_date = 0;flag = 0;key_on = 0;hw_on = 0;TR0 = 1;else if(set_date=0)&(set_ring=1)&(KEY1=0)&(hw_on=0) /设置闹钟时,按KEY1键退出Delay_Ms(5);if(set_date=0)&(set_ring=1)&(KEY1=0)while(!KEY1);WriteCommand(0x0c);set_ring = 0;ring_flag = 0;key_on = 0;hw_on = 0;TR0 = 1;Key_Service();void Key_Service()if(flag!=0)&(ring_flag=0)switch(flag)case 0:WriteCommand(0x0c);break;case 1: LcdPost(1,13);break;case 2: LcdPost(1,10);break;case 3: LcdPost(1,7);break;case 4: LcdPost(0,14);break;case 5: LcdPost(0,11);break;case 6: LcdPost(0,8);break;case 7: LcdPost(0,1);break;default:WriteCommand(0x0c);flag = 0;break;WriteCommand(0x0f);if(add_flag)add_flag = 0;switch(flag)case 1:sec+;if(sec=60)sec = 0;Display(1,12,sec);break;case 2:min+;if(min=60)min = 0;Display(1,9,min);break;case 3:hour+;if(hour=24)hour = 0;Display(1,6,hour);break;case 4:day+;if(month=2)if(year%4=0)&(year%100!=0)|(year%400=0) /闰年 if(day=29)day = 1;elseif(day=30)day = 1;if(month=1)|(month=3)|(month=5)|(month=7)|(month=8)|(month=10)|(month=12)if(day=32)day=1;if(month=4)|(month=6)|(month=9)|(month=10)|(month=11)if(day=31)day=1;Display(0,13,day);break;case 5:month+;if(month=13)month=1;if(year%4=0)&(year%100!=0)|(year%400=0) /闰年if(day28)day = 28;elseif(day29)day = 29;if(month=4)|(month=6)|(month=9)|(month=10)|(month=11)if(day30)day=30;Display(0,10,month);break;case 6:year+;if(year=100)year = 0;Display(0,7,year);break;case 7:week+;if(week=8)week = 1;Display_Week();break;default:break;if(sub_flag)sub_flag = 0;switch(flag)case 1:sec-;if(sec=-1)sec = 59;Display(1,12,sec);break;case 2:min-;if(min=-1)min = 59;Display(1,9,min);break;case 3:hour-;if(hour=-1)hour = 23;Display(1,6,hour);break;case 4:day-;if(month=2)if(year%4=0)&(year%100!=0)|(year%400=0) /闰年if(day=0)day = 28;elseif(day=0)day = 29;if(month=1)|(month=3)|(month=5)|(month=7)|(month=8)|(month=10)|(month=12)if(day=0)day=31;if(month=4)|(month=6)|(month=9)|(month=10)|(month=11)if(day=0)day=30;Display(0,13,day);break;case 5:month-;if(month=0)month = 12;if(year%4=0)&(year%100!=0)|(year%400=0) /闰年if(day28)day = 28;elseif(day29)day = 29;if(month=4)|(month=6)|(month=9)|(month=10)|(month=11)if(day30)day=30;Display(0,10,month);break;case 6:year-;if(year=-1)year = 99;Display(0,7,year);break;case 7:week-;if(week=0)week = 7;Display_Week();break;default:break;/*/if(ring_flag!=0)&(flag=0)switch(ring_flag)case 0:WriteCommand(0x0c);break;case 1: LcdPost(1,13);break;case 2: LcdPost(1,10);break;case 3: LcdPost(1,7);break;case 4: LcdPost(1,15);break;default:WriteCommand(0x0c);ring_flag = 0;break;WriteCommand(0x0f);if(add_flag)add_flag = 0;switch(ring_flag)case 1:ring_sec+;if(ring_sec=60)ring_sec = 0;Display(1,12,ring_sec);break;case 2:ring_min+;if(ring_min=60)ring_min = 0;Display(1,9,ring_min);break;case 3:ring_hour+;if(ring_hour=24)ring_hour = 0;Display(1,6,ring_hour);break;case 4:ring_open = ring_open;if(ring_open) /闹钟开/关DisplayChar(1,15,Y);elseDisplayChar(1,15,N);break;default:break;if(sub_flag)sub_flag = 0;switch(ring_flag)case 1:ring_sec-;if(ring_sec=-1)ring_sec = 59;Display(1,12,ring_sec);break;case 2:ring_min-;if(ring_min=-1)ring_min = 59;Display(1,9,ring_min);break;case 3:ring_hour-;if(ring_hour=-1)ring_hour = 23;Display(1,6,ring_hour);break;case 4:ring_open = ring_open;if(ring_open) /闹钟开/关DisplayChar(1,15,Y);elseDisplayChar(1,15,N);break;default:break;void Timer0_Init()/定时器0初始化TMOD |= 0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;TR0=1;ET0=1;EA=1;void HW_Init() /红外中断初始化TMOD |= 0X10;/定时器1的方式1,16位计数器,用来计数时间TH1=0;TL1=0;EA=1;/首先开启总中断EX1=1; /开启外部中断 1IT1=1; /设置成下降沿触发方式TR1=1;void System_Init()year = 13;month = 5;day = 1;week = 2;hour = 23;min = 59;sec = 50;ring_hour = 0;ring_min = 0;ring_sec = 0;InitLcd1602(); /初始化液晶Timer0_Init(); /初始化中断HW_Init(); /初始化红外void Timer0_interrupt() interrupt 1unsigned int count;TH0=(65536-10000)/256;TL0=(65536-10000)%256;count+;/if(isRingTime)/BEEP=BEEP;LED2=LED2;/if(temper_al

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论