12864+ds1302+ds18b20实现指针时钟,数字时钟,温度,日期同步显示
51单片机+ds1302+DS18b20温度时钟(电路图+C语言程序)

时钟电路图:*■11PCB板:酱时井務ft是用诵m-pdfMerisi 口叵因Fjr 齐舱 C :s ® 工细理沖缶皿ndm - * TfS ' 4' 包田U i > 'ir ft ZS:MZ fH钟些fl是用说町-Pdf Wirrcf闻礒雜sbit dis_ bitlsbit dis_ bit2sbit dis_ bit3sbit dis_ bit4sbit dis_ bit5sbit dis_ bit6sbit ledl _bitsbit led2 ! bit=P2A7; II定义数码管控制口=P2A6; II定义数码管控制口=卩2八4; II定义数码管控制口=卩2八3; II定义数码管控制口=P2A1; II定义数码管控制口=P2A0; II定义数码管控制口=P2A2; II定时LED勺控制口=P2A5; II定时LED勺控制口单片机程序:/*===================================================================调试要求:1. MCU:AT89S52 芯片或AT89C522. 晶振:12MHz功能:多功能时钟+温度计/#inelude <reg52. h>#inelude vintrins . h>訂开始 LJ-雲匕®务如1痒3月计ttVl. •呈T』d"吐拠席射■ w耳pg文宇■[豹…SS时軽件思冃说#define uehar #define uint unsigned char unsigned intsbit s1_bit =P1A 0; // 定义S1 控制口 sbit s2_bit =P01; // 定义 S2控制口 sbit s3_bit =P02; // 定义 S3控制口 sbit dq_ds18b20 =P3A3;// 定义控制 DS18B20 sbit speak =P3A7; //定义蜂鸣器控制口sbit clk_ds1302 =P3A6; // 定义控制 DS1302勺时钟线 sbit io_ds1302 =P3A5;//定义控制DS1302勺串行数据 sbit rest_ds1302 =P3A4;#define smg_data P0 //定义数码管数据口void delay_3us(); //3US 的延时程序 void delay_8us(ui nt t);//8US 延时基准程序void delay_50us(ui nt t); //void display1(uchar dis_data); void display2(uchar dis_data); void display3(uchar dis_data); void display4(uchar dis_data); void display5(uchar dis_data); void display6(uchar dis_data);void init_t0(); //定时器0初始化函数 void dis_led(); //LED 处理函数 void judge_s1(); //S1 按键处理函数void judge_s2(); //S2 按键处理函数 void judge_s3(); //S3 按键处理函数void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1); 示子程序 void dis_sa n( uchar s6,uchar s5,uchar s4,uchar s3,uchar s1,uchar san); 〃闪烁显示子程序 void judge_dis(); //显示处理函数 void judge_clock(); // 显示处理函数 void set_ds1302(); // 设置时间void get_ds1302();// 读取当前时间void w_1byte_ds1302(uchar t); // 向 DS130写一个字节的数据 uchar r_1byte_ds1302(); // 从DS130读一个字节的数据//DS18B20测温函数定义延时50*T 微妙函数的声明//数码管1显示子程序 //数码管2显示子程序 //数码管3显示子程序 //数码管4显示子程序 //数码管5显示子程序 //数码管6显示子程序//显 s2,ucharvoid w_1byte_ds18b20(uchar value); // 向DS18B2写一个字节ucharr_1byte_ds18b20( void ); // 从DS18B2读取一个字节的数据voidrest_ds18b20( void ); //DS18B20复位程序void readtemp_ds18b20( void ); // 读取温度void dis_temp(); //温度显示函数//共阳数码管断码表const uchar tabl1[16] ={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,// 0 1 2 3 4 50x82,0xf8,0x80,0x90,0x86,0x87,0xFF,//6 7 8 9 E T B0xc6,0xbf,0xff };// C -const uchar tabl3[] ={ 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09 };uchar t0_crycle;uchar hour_co un t, minu te_c oun t,sec on d_co un t,msec ond_count;uchar clock_hour,clock_m inu te;uchar coun tdow n_sec ond;uchar coun tdow n_hour,co un tdow n_min ute;uchar clock_en; //闹钟关闭和开启的标志,1开启,0关闭uchar flag1,sec on d_flag,za ncun 1,za ncun 2,za ncun3;uchar zancun4 ,za ncun 5,za ncun 6,za ncun7;uchar clock_flag,co un tdow n_flag;uchar msec on d_mi nute,msec on d_sec on d,mseco nd_mseco nd,mseco nd_flag; // 秒表相关参数uint speak_c ount;uchar templ,temph,temp_flag;uchar t_b,t_s,t_g,t_x,temp_flag2; //从左到右分别存储温度百位,十位,个位,小数位uchar tab23[3]; 〃二{0x40,0x59,0x23,0x28,0x11,0x06,0x09};// 上电时默认的时间//主程序void main(){P3 =0x00;flag1 =0;zancun3 =0;msecond_minute =0; //置秒表相关参数为0msecond_second =0;msec on d_msec ond =0;speak =1;//关闭蜂鸣器speak_co unt =0;clock_hour =0;clock_m inute =0;clock_flag =0;countdown_flag =0; //倒计时标志位为0clock_en =0;//开机时默认关闭闹钟ini t_t0();TRO =1;//// set_ds1302();〃设置DS1302勺初始时间//接下来开始编写让数码管显示的程序while (1){get_ds1302();judge_dis(); // 显示处理judge_s1();judge_s2();judge_s3();judge_clock(); //闹钟处理程序} _}void timerO() interrupt 1{TH0=(65536-50000)/256;TL0=(65536 - 50000)%256; t0_crycle ++;if (t0_crycle ==2) // 0.1 秒{t0_crycle =0;msec on d_flag =1;msec ond_count ++;if (msecond_count==10)//1 秒{ _msec on d_co unt =0;sec on d_flag =1;}}}//**************************************************//显示处理函数void judge_dis(){if (flag1 ==0){if (second_flag ==1){ _zancun7 ++;sec on d_flag =0;} _if (zancun7 <1){if (temp_flag2 ==1){ 一readtemp_ds18b20(); // 读取温度temp_flag2 =0;厂dis_temp(); //温度显示函数}if (zancun7 >=1){temp_flag2 =1;zancun4 =hour_count &0xf0;zancun4 >>=4;zancun5 =minute_count&0xf0;zancun5 >>=4;zancun6 =sec on d_co unt&0xf0;zancun6 >>=4;dis(za ncun4 ,hour_co unt &0x0f,za ncun5,minu te_co unt &0x0f,za ncun 6,sec ond_ cou nt &0x0f);dis_led();if (zancun7 ==5)zancun7 =0;}}if (flag1 !=0){switch (flag1){case 1:dis(5,10,11,1,12,12); // 显示SET1led1_bit =1;led2_bit =1;break;case 2:dis(5,10,11,2,12,12); // 显示SET2break;case 3:dis(5,10,11,3,12,12); // 显示SET3break;case 4:dis(5,10,11,4,12,12); // 显示SET4break;case 5:dis(5,10,11,5,12,12); // 显示SET5break;case 6:dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,12,1); break;case 7:dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,12,2); break;case 8:dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,12,3); break;case 9: //进入修改时间,时间分位个位闪烁dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,12,4); break;case 10: //进入修改闹钟,闹钟小时十位闪烁dis_san(zancunl / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,zancun3,1); break;case 11://进入修改闹钟,闹钟小时个位闪烁dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2%0,12,zancun3,2); break;case 12: //进入修改闹钟,闹钟小时十位闪烁dis_sa n(zan cu n1 / 10,za ncun1 %10,za ncun 2/ 10,za ncu n2%0,12,za ncun 3,3);break;case 13: //进入修改闹钟,闹钟小时个位闪烁dis_sa n(zan cu n1 / 10,za ncun1 %10,za ncun 2/ 10,za ncu n2%0,12,za ncun 3,4);break;case 14: //进入修改闹钟的开关dis_sa n(zan cu n1 / 10,za ncun1 %10,za ncun 2/ 10,za ncu n2%0,12,za ncun 3,6);break;case 15:dis_sa n(zancun1 / 10,za ncun1 %10,za ncun 2/ 10,za ncun 2%0,za ncun3/ 10,za ncun 3%10,1);break;case 16:dis_san(zancun1 / 10,zancunl %10,zancun2/10,zancun2%0,zancun3/ 10,zancun3%10,2);break;case 17:dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2%0,zancun3/ 10,zancun 3%10,3);break;case 18:dis_sa n(zancun1 / 10,za ncun1 %10,za ncun 2/ 10,za ncun 2%0,za ncun3/ 10,za ncun 3%10,4);break;case 19:dis_sa n(zancun1 / 10,za ncun1 %10,za ncun 2/ 10,za ncun 2%0,za ncun3/ 10,za ncun 3%10,5);break;case 20:dis_sa n(zancun1 / 10,za ncun1 %10,za ncun 2/ 10,za ncun 2%0,za ncun3/ 10,za ncun 3%10,6);break;case 21:if (second_flag ==1){ _sec on d_flag =0;countdown_second --;if (countdown_second ==255){ _coun tdow n_sec ond =59;countdown_minute --;if (countdown_minute ==255){ _coun tdow n_min ute =59;countdown_hour --;if (countdown_hour ==255){flag1 =22;coun tdow n_min ute =0;coun tdow n_hour =0;coun tdow n_sec ond =0;coun tdow n_flag=1;_ } } } }dis(countdown_hour / 10,countdown_hour %10,countdown_minute / 10,countdown _minute%10,countdown_second/ 10,countdown_second%10); //break; case 22:{ speak =1;}dis(countdown_hour / 10,countdown_hour %10,countdown_minute / 10,countdown _minute%10,countdown_second/ 10,countdown_second%10); //break; case 23: dis(msecond_minute / 10,msecond_minute%10,msecond_second/ 10,msecond_sec on d%10,mseco nd_msec on d%0,12);break; case 24:if (msecond_flag ==1) { _msec on d_flag =0; msec on d_msec ond ++;if (msecond_msecon (==10){msec on d_msec ond =0; msec on d_sec ond ++;if (msecond_second==60) { _msecond_second =0; msec ond_minute ++;if (countdown_flag { _speak=0;if (second_flag { _sec on d_flag coun tdow n_flag} _ } else>0 &&countdown_flag <7)==1) =0; ++;if (msecond_minute==1OO) { _msec ond_minute =99;flagl =23;}}}}dis(msecond_minute / 10,msecond_minute%10,msecond_second/ 10,msecond_sec on d%10,mseco nd_msec on d%0,12);break;case 25:dis(zancun3 / 10,zancun3 %0,zancun2 / 10,zancun2 %10,zancun1 /10,zancun1 %0 );break;default :break;}}}//**************************************************〃S1按键处理函数void judge_s1(){ _s1_bit =1;//置IO为1,准备读入收据if (s1_bit ==0)//判断是否有按键按下{delay_50us(1); //延时,去除机械抖动if (s1_bit ==0){switch (flag1){case 0:case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 10:case 11:case 12:case 13:case 15:case 16:case 17:case 18:case 19: flag1++;break;case 9: flag1=6;break;case 14: flag1=10;break;case 20: flag1=15;break;case 5:case 21:case 22:case 23: //系统从秒表状态复位case 24: //系统从秒表状态复位case 25: //系统从计数器复位flag1 =0;break;default :break;}while (s1_bit ==0){ _judge_dis();}〃等待按键释放}}}〃************************************************** 〃S2按键处理函数void judge_s2(){ _s2_bit =1; //置IO为1,准备读入收据if (s2_bit ==0)//判断是否有按键按下=0;{delay_50us(1); //延时,去除机械抖动 if (s2_bit ==0) { switch (flagl) { flag1 =6; zancun4 =hour_count &0xf0;zancun4 >>=4; zancun6 =hour_count &0x0f;zancun1=zancun4*10+zancun6; //zancun 1=hour_co unt; zancun5 =minute_count &0xf0; zancun5 >>=4; zancun6 =minute_count &0x0f; zancun2 =za ncun5* 10+za ncun6; case 1: //在显示SET 状态下按S2牛,进入修改时间 // zancun2=minu te_co unt; break; case 2: //在显示SET2犬态下按S2,进入设置闹钟 zancunl =clock_hour; zancun2 =clock_m inu te; flagl =10; break; case 6: //修改时钟小时十位状态下按 case 7: //修改时钟小时个位状态下按 case 8: //修改时钟分钟十位状态下按 case 9: //修改时钟分钟个位状态下按 〃zancun4=za ncun 1/10; 测S:SM tab23[2] =zancun1/10* 16+za ncu n1%10; tab23[1] hour_c ount minu te_c ount sec ond_co unt tab23[0]set_ds1302(); flag1//zancun 5=za ncun2&0 xf0; //zancun 5>>=4; =zancun2/10* 16+za ncu n2%10; =tab23[2]; =tab23[1]; =0; //设置DS130的初始时间 =0;break; case 10: //修改闹钟小时十位状态下按S2case 11: //修改闹钟小时个位状态下按S2case 12: //修改闹钟分钟十位状态下按S2 case 13: //修改闹钟分钟个位状态下按S2 case 14: //修改闹钟使能状态下按S2clock_hour clock_m inute clock_e n flag1=zancun1; =zancun2; =zancun3;=0;break;case 3:flagl =15;zancunl =co un tdow n_hour;zancun2 =co un tdow n_minu te;zancun3 =co un tdow n_sec ond;break;case 15:case 16:case 17:case 18:case 19:case 20:coun tdow n_hour =zancun1;coun tdow n_minute =za ncun2;coun tdow n_sec ond =za ncun3;flag1 =21;coun tdow n_flag =0;break;case 22:flag1 =21;break;case 21:flag1 =22;break;case 4:flag1 =23; //秒表暂停msec ond_minute =0;msecond_second =0;msec on d_msec ond =0;break;case 23:flag1 =24;break;case 24:flag1 =23;break;case 5:flagl =25;//进入计数器模式zancunl =0;zancun2 =0;zancun3 =0;break; default :break;}while (s2_bit ==0){ _judge_dis();}//等待按键释放}}}//**************************************************//S3按键处理函数void judge_s3(){ _s3_bit =1;//置IO为1,准备读入收据if (s3_bit ==0)//判断是否有按键按下{delay_50us(1); //延时,去除机械抖动if (s3_bit ==0){ _switch (flag1){case 6: //修改时间小时的十位数zancun1 +=10;if (zancun1 >=24)zancun1 =zancun 1%10;break;case 7: //修改时间小时的个位数za ncun1 =za ncu n1/10* 10+(za ncun1 %10+1) %10;if (zancun1 >=24)zancun1 =20;break;case 8: //修改时间分钟的十位数zancun2 +=10;if (zancun2 >=60)zancun2-=60;break;case 9: //修改时间分钟的个位数za ncun2 =za ncun2/10* 10+(za ncun2 %10+1) %10;break;case 10: //修改闹钟小时的十位数zancunl +=10;if (zancunl >=24)zancunl =zancun 1%10; break;case 11: //修改闹钟小时的个位数zancunl =za ncu n1/10* 10+(za ncun1 %10+1) %10;if (zancun1 >=24)zancun1 =20;break;case 12: //修改闹钟分钟的十位数zancun2 +=10;if (zancun2 >=60)zancun2-=60; break;case 13: //修改闹钟分钟的个位数zan cu n2 =za ncun2/10* 10+(za ncun2 %10+1) %10;break;case 14:zancun3 A=1;break;case 15: //修改倒计时小时的十位数zancun1 +=10;if (zancun1 >=100)zancun 1 -=100; break;case 16: //修改倒计时小时的个位数zancun1 =za ncu n1/10* 10+(za ncun1 %10+1) %10;break;case 17: //修改倒计时分钟的十位数zancun2 +=10;if (zancun2 >=60)zancun2-=60; break;case 18: //修改倒计时分钟的个位数zan cu n2 =za ncun2/10* 10+(za ncun2 %10+1) %10;break;case 19: //修改倒计时秒的十位数zancun3 +=10;if (zancun3 >=60)zancun3-=60; break;case 20: //修改倒计时秒的个位数zan cu n3 =za ncun3/10* 10+(za ncun3 %10+1) %10;break;case 21:case 22: //coun tdow n_hour =zancun1;coun tdow n_minute =za ncun2;coun tdow n_sec ond =za ncun3;flagl =21;break;case 23:case 24: //秒表复位flag1 =24;msec ond_minute =0;msecond_second =0;msec on d_msec ond =0;break;case 25:zancun1 ++;if (zancun1 ==100){zancun1 =0;zancun2 ++;if (zancun2 ==100){zancun2 =0;zancun3 ++;}}break;default : break;}while (s3_bit ==0){ _judge_dis();}〃等待按键释放}}} //显示处理函数void judge_clock() {zancun4 =hour_count &0xf0;zancun4 >>=4;zancun6 =hour_count &0x0f;zancun4 *=10;zancun4 +=za ncun6;zancun5=minute_count &0xf0;if (san ==1){zancun5 >>=4;zancun6 =minute_count &0x0f;zancun5 *=10;zancun5 +=za ncun6;if (msecond_count<=5) {speak =0; speak_co unt ++;}else{speak =1;}}else{speak =1;}}〃****************************************////闪烁显示子程序void dis_sa n( uchar s6,uchar s5,uchar s4,uchar s3,uchars1,uchar san){if (clock_hour ==zancun4 &&clock_minute ==zancun5){ 一 一if (clock_en { _ speak_co unt clock_flag speak_co unt} _ } else{clock_flag =0;} _if{ (clock_flag ==1 ==1&&clock_flag ==0)=0; //开启蜂鸣器=1;=0;&&speak_count <400)s2,ucharif (msecond_count<5) { _ display1(s6);}}else{display1(s6);}if (san ==2){if (msecond_count<5) { _ display2(s5);}}else{display2(s5);}if (san ==3){if (msecond_count<5) { _ display3(s4);}}else{display3(s4);}if (san ==4){if (msecond_count<5) { _ display4(s3);}}else{display4(s3);}if (san ==5){if (msecond_count<5){ _ display5(s2);}}else{display5(s2);}if (san ==6){if (msecond_count<5){ _ display6(s1);}}else{ display6(s1);}}〃****************************************//时钟显示程序void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1) { display1(s6);display2(s5);display3(s4);display4(s3);display5(s2);display6(s1);}〃********************************************************************************************void init_tO(){ _TMOD0x01;〃设定定时器工作方式1,定时器定时50毫秒TH0=(65536-50000)/256;TL0=(65536- 50000)%256;EA=1; //开总中断ET0=1; //允许定时器0中断t0_crycle =0; //定时器中断次数计数单元}//LED处理函数void dis_led(){if (msecond_count<5){ _Ied1_bit =1;Ied2_bit =1;}else{led1_bit =0;led2_bit =0;}}〃***************************************************************//功能:把数据1显示在数码管1上void display6(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit6 =0; // 锁存数据delay_50us(40); dis_bit6 =1;}〃***************************************************************//功能:把数据1显示在数码管1上void display5(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit5 =0; // 锁存数据delay_50us(40);dis_bit5 =1;} _〃***************************************************************//功能:把数据1显示在数码管1上void display4(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit4 =0; // 锁存数据delay_50us(40);dis_bit4 =1;} 〃***************************************************************//功能:把数据1显示在数码管1上void display3(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit3 =0; // 锁存数据delay_50us(40);dis_bit3 =1;}〃***************************************************************//功能:把数据1显示在数码管1上void display1(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit1 =0; // 锁存数据delay_50us(40);dis_bit1 =1;}〃***************************************************************//功能:把数据1显示在数码管1上void display2(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit2 =0; // 锁存数据delay_50us(40);dis_bit2 =1;}〃******************************************************************* *******************************// 函数名称:void delay_50US(unsigned int t)//功能:延时50*t(us)void delay_50us(uint t){ _unsigned char j;for (;t >0;t --){for (j =19;j >0;j --);}}〃******************************************************************* ************〃8微秒延时基准程序void delay_8us(uint t){while (-- t);}************〃3微秒延时程序void delay_3us() {}〃******************************************************************* ************//子程序功能:向DS18B2写一字节的数据void w_1byte_ds18b20(uchar value){uchar i =0;for (i =0;i <8;i ++){dq_ds18b20 =1;delay_3us();dq_ds18b20 =0; delay_8us(2);if ( value & 0x01) dq_ds18b20 =1; 〃DQ = 1 delay_50us(1); // 延时50us 以上delay_8us(2);value >>=1;}dq_ds18b20 =1; //DQ = 1}//读一个字节uchar r_1byte_ds18b20( void){ 一一uchar i =0;uchar value = 0;for (i =0;i <8;i ++){value >>=1;dq_ds18b20 =0;// DQ_L;delay_3us();dq_ds18b20 =1; 〃DQ_H;delay_8us(2);if (dq_ds18b20==1) value |= 0x80;delay_8us(6); // 延时40us}dq_ds18b20 =1;return value ;}11 ・**************************************************〃ds18b20复位子程序void rest_ds18b20( void){rest:delay_3us(); // 稍做延时delay_3us();dq_ds18b20 =1;delay_3us();dq_ds18b20 =0;// DQ_L; delay_50us(11); 〃480us<T<960usdq_ds18b20 =1; // 拉高总线delay_8us(5);if (dq_ds18b20==1){return ;}delay_50us(2); // 延时90usif (dq_ds18b20==1){return ;}else{goto rest;}}〃****************************************************//读取温度void readtemp_ds18b20( void){ _uchar temp32;rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0x44); // 启动温度转换delay_8us(2);rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度templ =r_1byte_ds18b20();temph =r_1byte_ds18b20();if ((temph &0xf0)) //判断温度的正负性{temp_flag =0; //温度为负数标志temph =-temph;tempi =-templ;t_x =tabl3[templ & OxOf]; // 计算温度的小数temp32 =temph & OxOf;temp32 <<=4;tempi >>=4;temp32 =temp32 | tempi;t_b =temp32/100%10; //计算温度的百位数据t_s =temp32/10%0;〃计算温度的十位数据t_g =temp32%0;〃计算温度的个位数据5else //为正数{t_x =tabl3[templ & 0x0f]; // 计算温度的小数temp32 =temph & 0x0f;temp32 <<=4;templ >>=4;temp32 =temp32 | templ;t_b =temp32/100%10; //计算温度的百位数据t_s =temp32/10%0;〃计算温度的十位数据t_g =temp32%0;〃计算温度的个位数据temp_flag =1;} _}void dis_temp() //温度显示函数{ _if (temp_flag =1){ _if (t_b ==0){dis(12,12,t_s,t_g,13,12);}else{dis(12,t_b,t_s,t_g,13,12);}}else{dis(14,t_b,t_s,t_g,13,12);}}/ / """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" / / , ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ############ //;子程序名:w_1byte_ds1302//;功能:向DS130写一个字节的数据void w_1byte_ds1302(uchar t){uchar i;for (i =0;i <8;i ++){if (t & 0x01){io_ds1302=1;}else{io_ds1302 =0;}clk_ds1302 =1;delay_3us();delay_3us();clk_ds1302 =0;delay_3us();delay_3us();t >>=1;}}/ / , ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ######//;子程序名:r_1byte_ds1302()//;功能:从DS130读一个字节的数据uchar r_1byte_ds1302(){ 一一uchar i,temp11 =0;io_ds1302 =1;//置10为1,准备读入数据for (i =0;i <8;i ++){temp11 >>=1;if (io_ds1302) temp11 |= 0x80;clk_ds1302 =1;delay_3us();delay_3us();clk_ds1302 =0;delay_3us();}return (temp11);}/ / """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/ / , JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ """""""""""""""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff//;子程序名:setbds1302//;功能:设置DS130初始时间,并启动计时void set_ds1302(){uchar i,j;rest_ds1302 =0;delay_3us();clk_ds1302 =0;delay_3us();rest_ds1302 =1;delay_3us();w_1byte_ds1302(0x8e); // 写控制命令字delay_3us();w_1byte_ds1302(0x00); // 写保护关闭clk_ds1302 =1;delay_3us();for (i =0,j =0x80;i <7;i ++,j +=2){rest_ds1302 =0;delay_3us();clk_ds1302 =0;delay_3us();rest_ds1302 =1;delay_3us();w_1byte_ds1302(j);delay_3us();w_1byte_ds1302(tab23[i]);delay_3us();delay_3us();clk_ds1302 =1;delay_3us();rest_ds1302 =0;delay_3us();delay_3us();} _rest_ds1302 =0;delay_3us();clk_ds1302 =0;delay_3us();rest_ds1302 =1;delay_3us();w_1byte_ds1302(0x8e); delay_3us();w_1byte_ds1302(0x80); clk_ds1302 =1;delay_3us();rest_ds1302 =0;delay_3us();}/ / """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" / / , ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff //;子程序名:get1302void get_ds1302(){ _uchar temp11[7],i,j;for (i =0;i <7;i ++){temp11[i] =0;}for (i =0,j =0x81;i <7;i ++,j +=2){rest_ds1302 =0;delay_3us();clk_ds1302 =0;delay_3us();delay_3us();w_1byte_ds1302(j);temp11[i] =r_1byte_ds1302();delay_3us();clk_ds1302 =1;delay_3us();rest_ds1302 =0;delay_3us();} _if (temp11[0] != 0xff){second_count =temp11[0]; }if (temp11[1] != 0xff) // 数据验证{minute_count =temp11[1]; }if (temp11[2] != 0xff) // 数据验证{hour_count =temp11[2]; }// date=temp[3];//mon th=temp[4];// week=temp[5];//year=temp[6];}/*===================================================================调试要求:1. MCU:AT89S52 芯片或AT89C522. 晶振:12MHz功能:多功能时钟+温度计/#inelude <reg52. h>#inelude vintrins . h>sbit dis_bit1 =P2A 7; //定义数码管控制口sbit dis_bit2 =卩2八6;//定义数码管控制口sbit dis_bit3 =卩2八4;//定义数码管控制口sbit dis_bit4 =卩2八3;//定义数码管控制口sbit dis_bit5 =卩2八1; //定义数码管控制口sbit dis_bit6 =P2A0; //定义数码管控制口sbit led1_bit =卩2八2; // 定时 LED 勺控制口sbit led2_bit =卩2八5; // 定时 LED 勺控制口sbit s1_bit =P1A0; // 定义S1 控制口sbit s2_bit =P01; // 定义 S2空制口sbit s3_bit =P02; // 定义 S3控制口sbit dq_ds18b20 =P3A3;// 定义控制 DS18B20 sbit speak =P3A7; //定义蜂鸣器控制口sbit clk_ds1302 =P3A6; // 定义控制 DS1302勺时钟线 sbit io_ds1302 =P3A5;//定义控制DS1302勺串行数据sbit rest_ds1302 =P3A4;#define smg_data P0 //定义数码管数据口 void delay_3us(); //3US 的延时程序 void delay_8us(ui nt t); //8US 延时基准程序void delay_50us(ui nt t); // void display1(uehardis_data); voiddisplay2(uehar dis_data); void display3(uehar dis_data); void display4(uehar dis_data); void display5(uehar dis_data); void display6(uehar dis_data);void init_t0(); //定时器0初始化函数void dis_led(); //LED 处理函数void judge_s1();//S1 按键处理函数 void judge_s2(); //S2 按键处理函数void judge_s3(); //S3 按键处理函数 void dis(uehar s6,uehar s5,uehar s4,uehar s3,uehar s2,uehar s1); 示子程序 void dis_sa n( uchar s6,uehar s5,uehar s4,uehar s3,uehars1,uchar san); 〃闪烁显示子程序void judge_dis(); //显示处理函数void judge_clock(); // 显示处理函数void set_ds1302(); // 设置时间void get_ds1302(); // 读取当前时间#define uehar#define uintunsigned char unsigned int延时50*T 微妙函数的声明//数码管1显示子程序 //数码管2显示子程序 //数码管3显示子程序//数码管4显示子程序//数码管5显示子程序//数码管6显示子程序 //显s2,ueharvoid w_1byte_ds1302(uchar t); // 向DS130写一个字节的数据uchar r_1byte_ds1302(); // 从DS130读一个字节的数据〃*******************************************************************//DS18B20测温函数定义void w_1byte_ds18b20(uchar value); // 向DS18B2写一个字节ucharr_1byte_ds18b20( void ); // 从DS18B2读取一个字节的数据voidrest_ds18b20( void ); //DS18B20复位程序void readtemp_ds18b20( void ); // 读取温度void dis_temp(); //温度显示函数//共阳数码管断码表const uchar tabl1[16] ={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,// 0 1 2 3 4 50x82,0xf8,0x80,0x90,0x86,0x87,0xFF,//6 7 8 9 E T B0xc6,0xbf,0xff };// C -const uchar tabl3[] ={ 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09 };uchar t0_crycle;uchar hour_co un t, minu te_c oun t,sec on d_co un t,msec ond_count;uchar clock_hour,clock_m inu te;uchar coun tdow n_sec ond;uchar coun tdow n_hour,co un tdow n_min ute;uchar clock_en; //闹钟关闭和开启的标志,1开启,0关闭uchar flag1,sec on d_flag,za ncun 1,za ncun 2,za ncun3;uchar zancun4 ,za ncun 5,za ncun 6,za ncun7;uchar clock_flag,co un tdow n_flag;uchar msec on d_mi nute,msec on d_sec on d,mseco nd_mseco nd,mseco nd_flag; // 秒表相关参数uint speak_c ount;uchar templ,temph,temp_flag;uchar t_b,t_s,t_g,t_x,temp_flag2; //从左到右分别存储温度百位,十位,个位,小数位上电时默认的uchar tab23[3]; 〃二{0x40,0x59,0x23,0x28,0x11,0x06,0x09};//时间//主程序void main(){P3 =0x00;flag1 =0;zancun3 =0;msecond_minute =0; //置秒表相关参数为0msecond_second =0;msec on d_msec ond =0;speak =1;//关闭蜂鸣器speak_co unt =0;clock_hour =0;clock_m inute =0;clock_flag =0;countdown_flag =0; //倒计时标志位为0clock_en =0;//开机时默认关闭闹钟ini t_t0();TR0 =1;//// set_ds1302();〃设置DS130的初始时间//接下来开始编写让数码管显示的程序while (1){get_ds1302();judge_dis(); // 显示处理judge_s1();judge_s2();judge_s3();judge_clock(); //闹钟处理程序} _}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536- 50000)%256;t0_crycle ++;if (t0_crycle ==2) // 0.1 秒{t0_crycle =0;msec on d_flag =1;msec ond_count ++;if (msecond_count==10)//1 秒。
51单片机 12864 st7920液晶 DS1302 DS18B20 万年历 显示出了温度值 温度符号时间

st7920显示驱动、ds1302驱动、ds18b20驱动 显示时间,温度
******************************************************************************/
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
bit flag, Bell_Swh,Hourb,Minb,Kgb;//闹钟调时闪烁标志位
0x3C,0x0F,0x00,0x64,0x01,0xFF,0xF0,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x3F,0x1F,0x00,0x60,0x0F,0xFF,0xFC,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7E,0x01,0x81,0xF8,0x00,0x0F,0x01,0xE0,0x00,0x00,0x00,0x00,0x01,0xE6,0x00,
0x00,0x0E,0x03,0x43,0xEF,0xFC,0x0F,0x80,0xC0,0x00,0x00,0x00,0x00,0x03,0x7F,0x00,
bit sec=0,min=0,hour=0,year=0,mon=0,day=0,weekk=0; //闪烁标志位
unsigned char id;
DS1302可调时钟+DS18B20温度数码管切换显示

DS1302可调时钟+DS18B20温度数码管切换显示(2013-01-04 15:30:28)转载▼标签:校园#include#include#define uchar unsigned char#define uint unsigned int#define Write_Protect 0x8e //写保护#define OutPut P2 //显示输出sbit DQ=P1^7; //ds18b20单总线定义为P1.7sbit Beep=P3^2; //蜂鸣器输出端定义为P3.2sbit RST=P1^2; //复位端口定义在P1.2引脚sbit IO=P1^1; //数据输出端定义在P1.1引脚sbit SCLK=P1^0; //时钟输出端口定义在P1.0引脚sbit key=P1^3; //时间调节控制键sbit key1=P1^5; //每按一次位加一sbit key2=P1^4; //每按一次位减一sbit key3=P1^6; //显示切换uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志uchar code Wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位选数据uchar code Duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0--9共阴代码code uchar Waddr[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};code uchar Raddr[]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};uchar timeset[]={0x01,0x02,0x03,0x04,0x05,0x00,0x01};uchar time_buf[7];uchar time_disp[7];uchar dispdat[8];uchar Btdis=0,k=0,z;bit btx,btx1,btx2,btx3,bt1,bt2,bt3;bit Btread;void ex_model(); //显示模式切换void delaynms(uchar n){uchar i,j;for(i=n;i>0;i--)for(j=125;j>0;j--);}void Ds1302_Write_Byte(unsigned char addr, unsigned char d){unsigned char i;RST=1;//写入目标地址:addraddr = addr & 0xFE; //最低位置零for (i = 0; i < 8; i++){if (addr & 0x01){IO=1;}else{IO=0;}SCLK=1;SCLK=0;addr = addr >> 1; }//写入数据:dfor (i = 0; i < 8; i++){if (d & 0x01){IO=1;}else{IO=0;}SCLK=1;SCLK=0;d = d >> 1;}RST=0; //停止DS1302总线}uchar Ds1302_Read_Byte(unsigned char addr){unsigned char i;unsigned char temp;RST=1;//写入目标地址:addraddr = addr | 0x01; //最低位置高for (i = 0; i < 8; i ++){if (addr & 0x01)IO=1;}else{IO=0;}SCLK=1;SCLK=0;addr = addr >> 1;}//输出数据:tempfor (i = 0; i < 8; i++){temp = temp >> 1;if (IO){temp |= 0x80;}else{temp &= 0x7F;SCLK=1;SCLK=0;}RST=0; //停止DS1302总线return temp;}void Write1302(uchar dat){uchar i;SCLK=0;for(i=0;i<8;i++){IO=dat&0x01;SCLK=1;SCLK=0;dat=dat>>1;}}uchar Readset1302(uchar Cmd){uchar dat;SCLK=0;RST=1;Write1302(Cmd);SCLK=1;RST=0;return dat;}void Ds1302_Write_Time(void){unsigned char i,tmp;uchar flag;flag=Readset1302(0x81);if(flag&0x80) //判断时钟芯片是否停止,为1时时钟停止{//掉电保存for(i=0;i<7;i++) //BCD 处理{tmp=timeset[i]/10;//timeset[]={0x01,0x02,0x03,0x04,0x05,0x06,0x01}time_buf[i]=timeset[i]; //time_buf[7]time_buf[i]=time_buf[i]+tmp*16;}Ds1302_Write_Byte(0x8e,0x00); //关闭写保护Ds1302_Write_Byte(Waddr[6],time_buf[6]); //周Ds1302_Write_Byte(Waddr[5],time_buf[0]); //年Ds1302_Write_Byte(Waddr[4],time_buf[1]); //月Ds1302_Write_Byte(Waddr[3],time_buf[2]); //日Ds1302_Write_Byte(Waddr[2],time_buf[3]); //时Ds1302_Write_Byte(Waddr[1],time_buf[4]); //分Ds1302_Write_Byte(Waddr[0],time_buf[5]); //秒Ds1302_Write_Byte(0x8e,0x80); //打开写保护}}void Ds1302_Read_Time(void){unsigned char i,tmp;// Ds1302_Write_Byte(0x8e,0x00); //关闭写保护time_buf[0]=Ds1302_Read_Byte(Raddr[5]); //年time_buf[1]=Ds1302_Read_Byte(Raddr[4]); //月time_buf[2]=Ds1302_Read_Byte(Raddr[3]); //日time_buf[3]=Ds1302_Read_Byte(Raddr[2]); //时time_buf[4]=Ds1302_Read_Byte(Raddr[1]); //分time_buf[5]=(Ds1302_Read_Byte(Raddr[0]))&0x7F; //秒time_buf[6]=Ds1302_Read_Byte(Raddr[6]); //周// Ds1302_Write_Byte(0x8e,0x80); //打开写保护for(i=0;i<8;i++) //BCD 处理{tmp=time_buf[i]/16;//time_buf[]={年,月,日,时,分,秒,周}time_buf[i]=time_buf[i];time_disp[i]=time_buf[i]+tmp*10;}}void Ds1302_Init(void){RST=0;//RST脚置低SCLK=0;//SCK脚置低Ds1302_Write_Byte(0x80,0x00);}void display(){uchar i;if(Btdis==0){if(bt2==0){dispdat[0]=Duan[time_disp[3]/10]; //时dispdat[1]=Duan[time_disp[3]];}else{dispdat[0]=0xff;dispdat[1]=0xff;}dispdat[2]=0xbf; //"-"if(bt3==0){dispdat[3]=Duan[time_disp[4]/10]; //分dispdat[4]=Duan[time_disp[4]];}else{dispdat[3]=0xff;dispdat[4]=0xff;}dispdat[5]=0xbf;dispdat[6]=Duan[time_disp[5]/10]; //秒dispdat[7]=Duan[time_disp[5]];}if(Btdis==1){if(bt1==0){dispdat[0]=Duan[time_disp[0]/10]; //年dispdat[1]=Duan[time_disp[0]];}else{dispdat[0]=0xff;dispdat[1]=0xff;}dispdat[2]=0xbf; //"-"if(bt2==0){dispdat[3]=Duan[time_disp[1]/10]; //月dispdat[4]=Duan[time_disp[1]];}else{dispdat[3]=0xff;dispdat[4]=0xff;}dispdat[5]=0xbf;if(bt3==0){dispdat[6]=Duan[time_disp[2]/10]; //日dispdat[7]=Duan[time_disp[2]];}else{dispdat[6]=0xff;dispdat[7]=0xff;}}if(Btdis==2){dispdat[0]=0xff;if(bt1==0){dispdat[1]=Duan[time_disp[6]]; //周}else{dispdat[1]=0xff;}dispdat[2]=0xbf; //"-" dispdat[3]=0xbf;dispdat[4]=0xbf;dispdat[5]=0xbf;dispdat[6]=Duan[time_disp[5]/10];dispdat[7]=Duan[time_disp[5]];}if(Btdis==3){ds1820disp();}for(i=0;i<8;i++){P0=dispdat[i];OutPut=Wei[i]; //Wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}delaynms(1);P0=0xff;}}void baoshi(){ uchar i;if(((time_disp[4])==59)&&((time_disp[5])>=55)&&((time_disp[5])<=60))//分和秒的报时条件{for(i=0;i<8;i++) //小灯轮流点亮,蜂鸣器发出滴答声{P3=Duan[i];delaynms(300);}}elseP3=0xdb;}void keyscan(){display();if(!key){if(btx==0){if(!key){btx=1;k++;}while(k==1){Btdis=1;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[0]<99){time_disp[0]++;}else{time_disp[0]=0;}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[0]>0){time_disp[0]--;}else{time_disp[0]=99;}}}}else{btx2=0;}}while(k==2){Btdis=1;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[1]<12){time_disp[1]++;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>29){time_disp[2]=29;}}else if(time_disp[2]>28){time_disp[2]=28;}}}else{time_disp[1]=1;}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[1]>1){time_disp[1]--;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>29){time_disp[2]=29;}}else if(time_disp[2]>28){time_disp[2]=28;}}}else{time_disp[1]=12;}}}}else{btx2=0;}}while(k==3){Btdis=1;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}else{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]<29){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[2]<28){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[1]<8){if(time_disp[1]%2==0) //小于8月的月份除以2的余数为0则为小月{if(time_disp[2]<30){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[1]%2==1) //小于8月的月份除以2的余数为1则为大月{if(time_disp[2]<31){time_disp[2]++;}else{time_disp[2]=1;}}}else if(time_disp[1]>7){if(time_disp[1]%2==0){if(time_disp[2]<31){time_disp[2]++;}else{time_disp[2]=1;}}else if(time_disp[1]%2==1){if(time_disp[2]<30){time_disp[2]++;}else{time_disp[2]=1;}}}}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[1]==2){if(time_disp[0]%4==0){if(time_disp[2]>1){time_disp[2]--;}{time_disp[2]=29;}}else if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=28;}}else if(time_disp[1]<8){if(time_disp[1]%2==0){if(time_disp[2]>1){time_disp[2]--;}{time_disp[2]=30;}}else if(time_disp[1]%2==1){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=31;}}}else if(time_disp[1]>7){if(time_disp[1]%2==0){if(time_disp[2]>1)time_disp[2]--;}else{time_disp[2]=31;}}else if(time_disp[1]%2==1){if(time_disp[2]>1){time_disp[2]--;}else{time_disp[2]=30;}}}}}else{btx2=0;}}while(k==4){Btdis=2;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[6]<7){time_disp[6]++;}else{time_disp[6]=1;}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[6]>1){time_disp[6]--;}else{time_disp[6]=7;}}}}else{btx2=0;}}while(k==5){Btdis=0;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[3]<23){time_disp[3]++;}else{time_disp[3]=0;}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[3]>0){time_disp[3]--;}else{time_disp[3]=23;}}}}else{btx2=0;}}while(k==6){Btdis=0;display();if(!key){if(btx==0){if(!key){btx=1;k++;}}}{btx=0;}if(!key1){if(btx1==0){if(!key1){btx1=1;if(time_disp[4]<59){time_disp[4]++;}else{time_disp[4]=0;}}}else{btx1=0;}if(!key2){if(btx2==0){if(!key2){btx2=1;if(time_disp[4]>0){time_disp[4]--;}else{time_disp[4]=59;}}}}else{btx2=0;}}while(k==7){uchar tmp;uchar i;for(i=0;i<7;i++){timeset[i]=time_disp[i];}//将调整后的时候写入DS1302for(i=0;i<7;i++) //BCD 处理{tmp=timeset[i]/10;//timeset[]={0x01,0x02,0x03,0x04,0x05,0x06,0x01}time_buf[i]=timeset[i]; //time_buf[7]time_buf[i]=time_buf[i]+tmp*16;}Ds1302_Write_Byte(0x8e,0x00); //关闭写保护Ds1302_Write_Byte(Waddr[6],time_buf[6]); //周Ds1302_Write_Byte(Waddr[5],time_buf[0]); //年Ds1302_Write_Byte(Waddr[4],time_buf[1]); //月Ds1302_Write_Byte(Waddr[3],time_buf[2]); //日Ds1302_Write_Byte(Waddr[2],time_buf[3]); //时Ds1302_Write_Byte(Waddr[1],time_buf[4]); //分Ds1302_Write_Byte(Waddr[0],time_buf[5]); //秒Ds1302_Write_Byte(0x8e,0x80); //打开写保护k=0;}}else{btx=0;}if(!key3){if(btx3==0){if(!key3){btx3=1;if(Btdis<3){Btdis++;}else{Btdis=0;}}}}else{btx3=0;}}void ex_model(){if(((time_disp[5])>=0)&&((time_disp[5])<=8)) //前八秒显示温度Btdis=3;if(((time_disp[5])>=9)&&((time_disp[5])<=12)) //显示周Btdis=2;if(((time_disp[5])>=13)&&((time_disp[5])<=18)) //显示年Btdis=1;if(((time_disp[5])>=19)&&((time_disp[5])<=59)) //显示当前时间Btdis=0;}void tiaoshidisplay(){if(z==15){z=0;switch(k){case 1:bt1=~bt1;P3=~P3;break; //年case 2:bt2=~bt2;bt1=0;P3=~P3;break; //月case 3:bt3=~bt3;bt2=0;P3=~P3;break; //日case 4:bt1=~bt1;bt3=0;P3=~P3;break; //周case 5:bt2=~bt2;bt1=0;P3=~P3;break; //时case 6:bt3=~bt3;bt2=0;P3=~P3;break; //分default:bt3=0;break;}}}void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst(){ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd(){ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata){unsigned char i=0;for (i=8; i>0; i--) { DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp(){uchar a,b;ds1820rst();ds1820wr(0xcc);/ds1820wr(0x44);/ds1820rst();ds1820wr(0xcc);/ds1820wr(0xbe);/a=ds1820rd();。
51单片机课程设计(DS1302时钟、18B20温度计)

摘要: 该设计实现了24小时制的时间显示及设定、年月日星期的显示及设定、闹钟的设定、温度的检测及显示等功能。
设计共分为四大部分,分别是控制部分、时钟部分、温度检测部分和人机交互部分。
以单片机(A T89C51)组成的最小系统为整个设计的控制核心,单片机通过对时钟芯片(DS1302)的控制完成时钟的功能,通过对温度传感器(18B20)的控制完成温度检测的功能,最后通过对数码管、蜂鸣器及按键的控制完成时间和温度的显示以及调整时间、设定闹钟等功能。
时间和温度的显示以及调整时间、设定闹钟等功能。
关键词:电子钟;温度计;单片机关键词:电子钟;温度计;单片机目录目录摘要: ......................................................................................................................1 第一章 设计任务设计任务设计任务 ...................................................................................................3 第二章 电路设计电路设计电路设计 ...................................................................................................3 2.1电路方案的比较 . (3)2.2根据设计绘制框图及原理图根据设计绘制框图及原理图.........................................................................5 第三章 工作原理工作原理工作原理 ...................................................................................................7 3.1 单片机的工作原理. (7)3.2 DS18B20的工作原理 (8)3.3DS1302的工作原理 (10)3.4数码管的工作原理 (12)第四章 调试与验证调试与验证 (12)4.1程序调试 (12)4.2仿真验证 (15)参考文献 (15)附录附录.....................................................................................................................16 附录一附录一 使用说明使用说明..............................................................................................16 附录二附录二 元件清单元件清单..............................................................................................16 附录三 pcb 版图版图...............................................................................................17 附录四附录四 程序清单程序清单 (18)第一章设计设计任务1、基本要求、基本要求)能够实现时间的正确显示,并且可以对表进行调整。
51单片机+ds1302+DS18b20温度时钟(电路图+C语言程序)

时钟电路图:*■11PCB板:酱时井務ft是用诵m-pdfMerisi 口叵因Fjr 齐舱 C :s ® 工细理沖缶皿ndm - * TfS ' 4' 包田U i > 'ir ft ZS:MZ fH钟些fl是用说町-Pdf Wirrcf闻礒雜sbit dis_ bitlsbit dis_ bit2sbit dis_ bit3sbit dis_ bit4sbit dis_ bit5sbit dis_ bit6sbit ledl _bitsbit led2 ! bit=P2A7; II定义数码管控制口=P2A6; II定义数码管控制口=卩2八4; II定义数码管控制口=卩2八3; II定义数码管控制口=P2A1; II定义数码管控制口=P2A0; II定义数码管控制口=P2A2; II定时LED勺控制口=P2A5; II定时LED勺控制口单片机程序:/*===================================================================调试要求:1. MCU:AT89S52 芯片或AT89C522. 晶振:12MHz功能:多功能时钟+温度计/#inelude <reg52. h>#inelude vintrins . h>訂开始 LJ-雲匕®务如1痒3月计ttVl. •呈T』d"吐拠席射■ w耳pg文宇■[豹…SS时軽件思冃说#define uehar #define uint unsigned char unsigned intsbit s1_bit =P1A 0; // 定义S1 控制口 sbit s2_bit =P01; // 定义 S2控制口 sbit s3_bit =P02; // 定义 S3控制口 sbit dq_ds18b20 =P3A3;// 定义控制 DS18B20 sbit speak =P3A7; //定义蜂鸣器控制口sbit clk_ds1302 =P3A6; // 定义控制 DS1302勺时钟线 sbit io_ds1302 =P3A5;//定义控制DS1302勺串行数据 sbit rest_ds1302 =P3A4;#define smg_data P0 //定义数码管数据口void delay_3us(); //3US 的延时程序 void delay_8us(ui nt t);//8US 延时基准程序void delay_50us(ui nt t); //void display1(uchar dis_data); void display2(uchar dis_data); void display3(uchar dis_data); void display4(uchar dis_data); void display5(uchar dis_data); void display6(uchar dis_data);void init_t0(); //定时器0初始化函数 void dis_led(); //LED 处理函数 void judge_s1(); //S1 按键处理函数void judge_s2(); //S2 按键处理函数 void judge_s3(); //S3 按键处理函数void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1); 示子程序 void dis_sa n( uchar s6,uchar s5,uchar s4,uchar s3,uchar s1,uchar san); 〃闪烁显示子程序 void judge_dis(); //显示处理函数 void judge_clock(); // 显示处理函数 void set_ds1302(); // 设置时间void get_ds1302();// 读取当前时间void w_1byte_ds1302(uchar t); // 向 DS130写一个字节的数据 uchar r_1byte_ds1302(); // 从DS130读一个字节的数据//DS18B20测温函数定义延时50*T 微妙函数的声明//数码管1显示子程序 //数码管2显示子程序 //数码管3显示子程序 //数码管4显示子程序 //数码管5显示子程序 //数码管6显示子程序//显 s2,ucharvoid w_1byte_ds18b20(uchar value); // 向DS18B2写一个字节ucharr_1byte_ds18b20( void ); // 从DS18B2读取一个字节的数据voidrest_ds18b20( void ); //DS18B20复位程序void readtemp_ds18b20( void ); // 读取温度void dis_temp(); //温度显示函数//共阳数码管断码表const uchar tabl1[16] ={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,// 0 1 2 3 4 50x82,0xf8,0x80,0x90,0x86,0x87,0xFF,//6 7 8 9 E T B0xc6,0xbf,0xff };// C -const uchar tabl3[] ={ 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09 };uchar t0_crycle;uchar hour_co un t, minu te_c oun t,sec on d_co un t,msec ond_count;uchar clock_hour,clock_m inu te;uchar coun tdow n_sec ond;uchar coun tdow n_hour,co un tdow n_min ute;uchar clock_en; //闹钟关闭和开启的标志,1开启,0关闭uchar flag1,sec on d_flag,za ncun 1,za ncun 2,za ncun3;uchar zancun4 ,za ncun 5,za ncun 6,za ncun7;uchar clock_flag,co un tdow n_flag;uchar msec on d_mi nute,msec on d_sec on d,mseco nd_mseco nd,mseco nd_flag; // 秒表相关参数uint speak_c ount;uchar templ,temph,temp_flag;uchar t_b,t_s,t_g,t_x,temp_flag2; //从左到右分别存储温度百位,十位,个位,小数位uchar tab23[3]; 〃二{0x40,0x59,0x23,0x28,0x11,0x06,0x09};// 上电时默认的时间//主程序void main(){P3 =0x00;flag1 =0;zancun3 =0;msecond_minute =0; //置秒表相关参数为0msecond_second =0;msec on d_msec ond =0;speak =1;//关闭蜂鸣器speak_co unt =0;clock_hour =0;clock_m inute =0;clock_flag =0;countdown_flag =0; //倒计时标志位为0clock_en =0;//开机时默认关闭闹钟ini t_t0();TRO =1;//// set_ds1302();〃设置DS1302勺初始时间//接下来开始编写让数码管显示的程序while (1){get_ds1302();judge_dis(); // 显示处理judge_s1();judge_s2();judge_s3();judge_clock(); //闹钟处理程序} _}void timerO() interrupt 1{TH0=(65536-50000)/256;TL0=(65536 - 50000)%256; t0_crycle ++;if (t0_crycle ==2) // 0.1 秒{t0_crycle =0;msec on d_flag =1;msec ond_count ++;if (msecond_count==10)//1 秒{ _msec on d_co unt =0;sec on d_flag =1;}}}//**************************************************//显示处理函数void judge_dis(){if (flag1 ==0){if (second_flag ==1){ _zancun7 ++;sec on d_flag =0;} _if (zancun7 <1){if (temp_flag2 ==1){ 一readtemp_ds18b20(); // 读取温度temp_flag2 =0;厂dis_temp(); //温度显示函数}if (zancun7 >=1){temp_flag2 =1;zancun4 =hour_count &0xf0;zancun4 >>=4;zancun5 =minute_count&0xf0;zancun5 >>=4;zancun6 =sec on d_co unt&0xf0;zancun6 >>=4;dis(za ncun4 ,hour_co unt &0x0f,za ncun5,minu te_co unt &0x0f,za ncun 6,sec ond_ cou nt &0x0f);dis_led();if (zancun7 ==5)zancun7 =0;}}if (flag1 !=0){switch (flag1){case 1:dis(5,10,11,1,12,12); // 显示SET1led1_bit =1;led2_bit =1;break;case 2:dis(5,10,11,2,12,12); // 显示SET2break;case 3:dis(5,10,11,3,12,12); // 显示SET3break;case 4:dis(5,10,11,4,12,12); // 显示SET4break;case 5:dis(5,10,11,5,12,12); // 显示SET5break;case 6:dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,12,1); break;case 7:dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,12,2); break;case 8:dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,12,3); break;case 9: //进入修改时间,时间分位个位闪烁dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,12,4); break;case 10: //进入修改闹钟,闹钟小时十位闪烁dis_san(zancunl / 10,zancunl %10,zancun2/ 10,zancun2 %0,12,zancun3,1); break;case 11://进入修改闹钟,闹钟小时个位闪烁dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2%0,12,zancun3,2); break;case 12: //进入修改闹钟,闹钟小时十位闪烁dis_sa n(zan cu n1 / 10,za ncun1 %10,za ncun 2/ 10,za ncu n2%0,12,za ncun 3,3);break;case 13: //进入修改闹钟,闹钟小时个位闪烁dis_sa n(zan cu n1 / 10,za ncun1 %10,za ncun 2/ 10,za ncu n2%0,12,za ncun 3,4);break;case 14: //进入修改闹钟的开关dis_sa n(zan cu n1 / 10,za ncun1 %10,za ncun 2/ 10,za ncu n2%0,12,za ncun 3,6);break;case 15:dis_sa n(zancun1 / 10,za ncun1 %10,za ncun 2/ 10,za ncun 2%0,za ncun3/ 10,za ncun 3%10,1);break;case 16:dis_san(zancun1 / 10,zancunl %10,zancun2/10,zancun2%0,zancun3/ 10,zancun3%10,2);break;case 17:dis_san(zancun1 / 10,zancunl %10,zancun2/ 10,zancun2%0,zancun3/ 10,zancun 3%10,3);break;case 18:dis_sa n(zancun1 / 10,za ncun1 %10,za ncun 2/ 10,za ncun 2%0,za ncun3/ 10,za ncun 3%10,4);break;case 19:dis_sa n(zancun1 / 10,za ncun1 %10,za ncun 2/ 10,za ncun 2%0,za ncun3/ 10,za ncun 3%10,5);break;case 20:dis_sa n(zancun1 / 10,za ncun1 %10,za ncun 2/ 10,za ncun 2%0,za ncun3/ 10,za ncun 3%10,6);break;case 21:if (second_flag ==1){ _sec on d_flag =0;countdown_second --;if (countdown_second ==255){ _coun tdow n_sec ond =59;countdown_minute --;if (countdown_minute ==255){ _coun tdow n_min ute =59;countdown_hour --;if (countdown_hour ==255){flag1 =22;coun tdow n_min ute =0;coun tdow n_hour =0;coun tdow n_sec ond =0;coun tdow n_flag=1;_ } } } }dis(countdown_hour / 10,countdown_hour %10,countdown_minute / 10,countdown _minute%10,countdown_second/ 10,countdown_second%10); //break; case 22:{ speak =1;}dis(countdown_hour / 10,countdown_hour %10,countdown_minute / 10,countdown _minute%10,countdown_second/ 10,countdown_second%10); //break; case 23: dis(msecond_minute / 10,msecond_minute%10,msecond_second/ 10,msecond_sec on d%10,mseco nd_msec on d%0,12);break; case 24:if (msecond_flag ==1) { _msec on d_flag =0; msec on d_msec ond ++;if (msecond_msecon (==10){msec on d_msec ond =0; msec on d_sec ond ++;if (msecond_second==60) { _msecond_second =0; msec ond_minute ++;if (countdown_flag { _speak=0;if (second_flag { _sec on d_flag coun tdow n_flag} _ } else>0 &&countdown_flag <7)==1) =0; ++;if (msecond_minute==1OO) { _msec ond_minute =99;flagl =23;}}}}dis(msecond_minute / 10,msecond_minute%10,msecond_second/ 10,msecond_sec on d%10,mseco nd_msec on d%0,12);break;case 25:dis(zancun3 / 10,zancun3 %0,zancun2 / 10,zancun2 %10,zancun1 /10,zancun1 %0 );break;default :break;}}}//**************************************************〃S1按键处理函数void judge_s1(){ _s1_bit =1;//置IO为1,准备读入收据if (s1_bit ==0)//判断是否有按键按下{delay_50us(1); //延时,去除机械抖动if (s1_bit ==0){switch (flag1){case 0:case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 10:case 11:case 12:case 13:case 15:case 16:case 17:case 18:case 19: flag1++;break;case 9: flag1=6;break;case 14: flag1=10;break;case 20: flag1=15;break;case 5:case 21:case 22:case 23: //系统从秒表状态复位case 24: //系统从秒表状态复位case 25: //系统从计数器复位flag1 =0;break;default :break;}while (s1_bit ==0){ _judge_dis();}〃等待按键释放}}}〃************************************************** 〃S2按键处理函数void judge_s2(){ _s2_bit =1; //置IO为1,准备读入收据if (s2_bit ==0)//判断是否有按键按下=0;{delay_50us(1); //延时,去除机械抖动 if (s2_bit ==0) { switch (flagl) { flag1 =6; zancun4 =hour_count &0xf0;zancun4 >>=4; zancun6 =hour_count &0x0f;zancun1=zancun4*10+zancun6; //zancun 1=hour_co unt; zancun5 =minute_count &0xf0; zancun5 >>=4; zancun6 =minute_count &0x0f; zancun2 =za ncun5* 10+za ncun6; case 1: //在显示SET 状态下按S2牛,进入修改时间 // zancun2=minu te_co unt; break; case 2: //在显示SET2犬态下按S2,进入设置闹钟 zancunl =clock_hour; zancun2 =clock_m inu te; flagl =10; break; case 6: //修改时钟小时十位状态下按 case 7: //修改时钟小时个位状态下按 case 8: //修改时钟分钟十位状态下按 case 9: //修改时钟分钟个位状态下按 〃zancun4=za ncun 1/10; 测S:SM tab23[2] =zancun1/10* 16+za ncu n1%10; tab23[1] hour_c ount minu te_c ount sec ond_co unt tab23[0]set_ds1302(); flag1//zancun 5=za ncun2&0 xf0; //zancun 5>>=4; =zancun2/10* 16+za ncu n2%10; =tab23[2]; =tab23[1]; =0; //设置DS130的初始时间 =0;break; case 10: //修改闹钟小时十位状态下按S2case 11: //修改闹钟小时个位状态下按S2case 12: //修改闹钟分钟十位状态下按S2 case 13: //修改闹钟分钟个位状态下按S2 case 14: //修改闹钟使能状态下按S2clock_hour clock_m inute clock_e n flag1=zancun1; =zancun2; =zancun3;=0;break;case 3:flagl =15;zancunl =co un tdow n_hour;zancun2 =co un tdow n_minu te;zancun3 =co un tdow n_sec ond;break;case 15:case 16:case 17:case 18:case 19:case 20:coun tdow n_hour =zancun1;coun tdow n_minute =za ncun2;coun tdow n_sec ond =za ncun3;flag1 =21;coun tdow n_flag =0;break;case 22:flag1 =21;break;case 21:flag1 =22;break;case 4:flag1 =23; //秒表暂停msec ond_minute =0;msecond_second =0;msec on d_msec ond =0;break;case 23:flag1 =24;break;case 24:flag1 =23;break;case 5:flagl =25;//进入计数器模式zancunl =0;zancun2 =0;zancun3 =0;break; default :break;}while (s2_bit ==0){ _judge_dis();}//等待按键释放}}}//**************************************************//S3按键处理函数void judge_s3(){ _s3_bit =1;//置IO为1,准备读入收据if (s3_bit ==0)//判断是否有按键按下{delay_50us(1); //延时,去除机械抖动if (s3_bit ==0){ _switch (flag1){case 6: //修改时间小时的十位数zancun1 +=10;if (zancun1 >=24)zancun1 =zancun 1%10;break;case 7: //修改时间小时的个位数za ncun1 =za ncu n1/10* 10+(za ncun1 %10+1) %10;if (zancun1 >=24)zancun1 =20;break;case 8: //修改时间分钟的十位数zancun2 +=10;if (zancun2 >=60)zancun2-=60;break;case 9: //修改时间分钟的个位数za ncun2 =za ncun2/10* 10+(za ncun2 %10+1) %10;break;case 10: //修改闹钟小时的十位数zancunl +=10;if (zancunl >=24)zancunl =zancun 1%10; break;case 11: //修改闹钟小时的个位数zancunl =za ncu n1/10* 10+(za ncun1 %10+1) %10;if (zancun1 >=24)zancun1 =20;break;case 12: //修改闹钟分钟的十位数zancun2 +=10;if (zancun2 >=60)zancun2-=60; break;case 13: //修改闹钟分钟的个位数zan cu n2 =za ncun2/10* 10+(za ncun2 %10+1) %10;break;case 14:zancun3 A=1;break;case 15: //修改倒计时小时的十位数zancun1 +=10;if (zancun1 >=100)zancun 1 -=100; break;case 16: //修改倒计时小时的个位数zancun1 =za ncu n1/10* 10+(za ncun1 %10+1) %10;break;case 17: //修改倒计时分钟的十位数zancun2 +=10;if (zancun2 >=60)zancun2-=60; break;case 18: //修改倒计时分钟的个位数zan cu n2 =za ncun2/10* 10+(za ncun2 %10+1) %10;break;case 19: //修改倒计时秒的十位数zancun3 +=10;if (zancun3 >=60)zancun3-=60; break;case 20: //修改倒计时秒的个位数zan cu n3 =za ncun3/10* 10+(za ncun3 %10+1) %10;break;case 21:case 22: //coun tdow n_hour =zancun1;coun tdow n_minute =za ncun2;coun tdow n_sec ond =za ncun3;flagl =21;break;case 23:case 24: //秒表复位flag1 =24;msec ond_minute =0;msecond_second =0;msec on d_msec ond =0;break;case 25:zancun1 ++;if (zancun1 ==100){zancun1 =0;zancun2 ++;if (zancun2 ==100){zancun2 =0;zancun3 ++;}}break;default : break;}while (s3_bit ==0){ _judge_dis();}〃等待按键释放}}} //显示处理函数void judge_clock() {zancun4 =hour_count &0xf0;zancun4 >>=4;zancun6 =hour_count &0x0f;zancun4 *=10;zancun4 +=za ncun6;zancun5=minute_count &0xf0;if (san ==1){zancun5 >>=4;zancun6 =minute_count &0x0f;zancun5 *=10;zancun5 +=za ncun6;if (msecond_count<=5) {speak =0; speak_co unt ++;}else{speak =1;}}else{speak =1;}}〃****************************************////闪烁显示子程序void dis_sa n( uchar s6,uchar s5,uchar s4,uchar s3,uchars1,uchar san){if (clock_hour ==zancun4 &&clock_minute ==zancun5){ 一 一if (clock_en { _ speak_co unt clock_flag speak_co unt} _ } else{clock_flag =0;} _if{ (clock_flag ==1 ==1&&clock_flag ==0)=0; //开启蜂鸣器=1;=0;&&speak_count <400)s2,ucharif (msecond_count<5) { _ display1(s6);}}else{display1(s6);}if (san ==2){if (msecond_count<5) { _ display2(s5);}}else{display2(s5);}if (san ==3){if (msecond_count<5) { _ display3(s4);}}else{display3(s4);}if (san ==4){if (msecond_count<5) { _ display4(s3);}}else{display4(s3);}if (san ==5){if (msecond_count<5){ _ display5(s2);}}else{display5(s2);}if (san ==6){if (msecond_count<5){ _ display6(s1);}}else{ display6(s1);}}〃****************************************//时钟显示程序void dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1) { display1(s6);display2(s5);display3(s4);display4(s3);display5(s2);display6(s1);}〃********************************************************************************************void init_tO(){ _TMOD0x01;〃设定定时器工作方式1,定时器定时50毫秒TH0=(65536-50000)/256;TL0=(65536- 50000)%256;EA=1; //开总中断ET0=1; //允许定时器0中断t0_crycle =0; //定时器中断次数计数单元}//LED处理函数void dis_led(){if (msecond_count<5){ _Ied1_bit =1;Ied2_bit =1;}else{led1_bit =0;led2_bit =0;}}〃***************************************************************//功能:把数据1显示在数码管1上void display6(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit6 =0; // 锁存数据delay_50us(40); dis_bit6 =1;}〃***************************************************************//功能:把数据1显示在数码管1上void display5(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit5 =0; // 锁存数据delay_50us(40);dis_bit5 =1;} _〃***************************************************************//功能:把数据1显示在数码管1上void display4(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit4 =0; // 锁存数据delay_50us(40);dis_bit4 =1;} 〃***************************************************************//功能:把数据1显示在数码管1上void display3(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit3 =0; // 锁存数据delay_50us(40);dis_bit3 =1;}〃***************************************************************//功能:把数据1显示在数码管1上void display1(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit1 =0; // 锁存数据delay_50us(40);dis_bit1 =1;}〃***************************************************************//功能:把数据1显示在数码管1上void display2(uchar dis_data){ _smg_data =tabl1[dis_data]; // 送显示断码dis_bit2 =0; // 锁存数据delay_50us(40);dis_bit2 =1;}〃******************************************************************* *******************************// 函数名称:void delay_50US(unsigned int t)//功能:延时50*t(us)void delay_50us(uint t){ _unsigned char j;for (;t >0;t --){for (j =19;j >0;j --);}}〃******************************************************************* ************〃8微秒延时基准程序void delay_8us(uint t){while (-- t);}************〃3微秒延时程序void delay_3us() {}〃******************************************************************* ************//子程序功能:向DS18B2写一字节的数据void w_1byte_ds18b20(uchar value){uchar i =0;for (i =0;i <8;i ++){dq_ds18b20 =1;delay_3us();dq_ds18b20 =0; delay_8us(2);if ( value & 0x01) dq_ds18b20 =1; 〃DQ = 1 delay_50us(1); // 延时50us 以上delay_8us(2);value >>=1;}dq_ds18b20 =1; //DQ = 1}//读一个字节uchar r_1byte_ds18b20( void){ 一一uchar i =0;uchar value = 0;for (i =0;i <8;i ++){value >>=1;dq_ds18b20 =0;// DQ_L;delay_3us();dq_ds18b20 =1; 〃DQ_H;delay_8us(2);if (dq_ds18b20==1) value |= 0x80;delay_8us(6); // 延时40us}dq_ds18b20 =1;return value ;}11 ・**************************************************〃ds18b20复位子程序void rest_ds18b20( void){rest:delay_3us(); // 稍做延时delay_3us();dq_ds18b20 =1;delay_3us();dq_ds18b20 =0;// DQ_L; delay_50us(11); 〃480us<T<960usdq_ds18b20 =1; // 拉高总线delay_8us(5);if (dq_ds18b20==1){return ;}delay_50us(2); // 延时90usif (dq_ds18b20==1){return ;}else{goto rest;}}〃****************************************************//读取温度void readtemp_ds18b20( void){ _uchar temp32;rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0x44); // 启动温度转换delay_8us(2);rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度templ =r_1byte_ds18b20();temph =r_1byte_ds18b20();if ((temph &0xf0)) //判断温度的正负性{temp_flag =0; //温度为负数标志temph =-temph;tempi =-templ;t_x =tabl3[templ & OxOf]; // 计算温度的小数temp32 =temph & OxOf;temp32 <<=4;tempi >>=4;temp32 =temp32 | tempi;t_b =temp32/100%10; //计算温度的百位数据t_s =temp32/10%0;〃计算温度的十位数据t_g =temp32%0;〃计算温度的个位数据5else //为正数{t_x =tabl3[templ & 0x0f]; // 计算温度的小数temp32 =temph & 0x0f;temp32 <<=4;templ >>=4;temp32 =temp32 | templ;t_b =temp32/100%10; //计算温度的百位数据t_s =temp32/10%0;〃计算温度的十位数据t_g =temp32%0;〃计算温度的个位数据temp_flag =1;} _}void dis_temp() //温度显示函数{ _if (temp_flag =1){ _if (t_b ==0){dis(12,12,t_s,t_g,13,12);}else{dis(12,t_b,t_s,t_g,13,12);}}else{dis(14,t_b,t_s,t_g,13,12);}}/ / """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" / / , ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ############ //;子程序名:w_1byte_ds1302//;功能:向DS130写一个字节的数据void w_1byte_ds1302(uchar t){uchar i;for (i =0;i <8;i ++){if (t & 0x01){io_ds1302=1;}else{io_ds1302 =0;}clk_ds1302 =1;delay_3us();delay_3us();clk_ds1302 =0;delay_3us();delay_3us();t >>=1;}}/ / , ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ######//;子程序名:r_1byte_ds1302()//;功能:从DS130读一个字节的数据uchar r_1byte_ds1302(){ 一一uchar i,temp11 =0;io_ds1302 =1;//置10为1,准备读入数据for (i =0;i <8;i ++){temp11 >>=1;if (io_ds1302) temp11 |= 0x80;clk_ds1302 =1;delay_3us();delay_3us();clk_ds1302 =0;delay_3us();}return (temp11);}/ / """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/ / , JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ JJ """""""""""""""ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff//;子程序名:setbds1302//;功能:设置DS130初始时间,并启动计时void set_ds1302(){uchar i,j;rest_ds1302 =0;delay_3us();clk_ds1302 =0;delay_3us();rest_ds1302 =1;delay_3us();w_1byte_ds1302(0x8e); // 写控制命令字delay_3us();w_1byte_ds1302(0x00); // 写保护关闭clk_ds1302 =1;delay_3us();for (i =0,j =0x80;i <7;i ++,j +=2){rest_ds1302 =0;delay_3us();clk_ds1302 =0;delay_3us();rest_ds1302 =1;delay_3us();w_1byte_ds1302(j);delay_3us();w_1byte_ds1302(tab23[i]);delay_3us();delay_3us();clk_ds1302 =1;delay_3us();rest_ds1302 =0;delay_3us();delay_3us();} _rest_ds1302 =0;delay_3us();clk_ds1302 =0;delay_3us();rest_ds1302 =1;delay_3us();w_1byte_ds1302(0x8e); delay_3us();w_1byte_ds1302(0x80); clk_ds1302 =1;delay_3us();rest_ds1302 =0;delay_3us();}/ / """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" / / , ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff //;子程序名:get1302void get_ds1302(){ _uchar temp11[7],i,j;for (i =0;i <7;i ++){temp11[i] =0;}for (i =0,j =0x81;i <7;i ++,j +=2){rest_ds1302 =0;delay_3us();clk_ds1302 =0;delay_3us();delay_3us();w_1byte_ds1302(j);temp11[i] =r_1byte_ds1302();delay_3us();clk_ds1302 =1;delay_3us();rest_ds1302 =0;delay_3us();} _if (temp11[0] != 0xff){second_count =temp11[0]; }if (temp11[1] != 0xff) // 数据验证{minute_count =temp11[1]; }if (temp11[2] != 0xff) // 数据验证{hour_count =temp11[2]; }// date=temp[3];//mon th=temp[4];// week=temp[5];//year=temp[6];}/*===================================================================调试要求:1. MCU:AT89S52 芯片或AT89C522. 晶振:12MHz功能:多功能时钟+温度计/#inelude <reg52. h>#inelude vintrins . h>sbit dis_bit1 =P2A 7; //定义数码管控制口sbit dis_bit2 =卩2八6;//定义数码管控制口sbit dis_bit3 =卩2八4;//定义数码管控制口sbit dis_bit4 =卩2八3;//定义数码管控制口sbit dis_bit5 =卩2八1; //定义数码管控制口sbit dis_bit6 =P2A0; //定义数码管控制口sbit led1_bit =卩2八2; // 定时 LED 勺控制口sbit led2_bit =卩2八5; // 定时 LED 勺控制口sbit s1_bit =P1A0; // 定义S1 控制口sbit s2_bit =P01; // 定义 S2空制口sbit s3_bit =P02; // 定义 S3控制口sbit dq_ds18b20 =P3A3;// 定义控制 DS18B20 sbit speak =P3A7; //定义蜂鸣器控制口sbit clk_ds1302 =P3A6; // 定义控制 DS1302勺时钟线 sbit io_ds1302 =P3A5;//定义控制DS1302勺串行数据sbit rest_ds1302 =P3A4;#define smg_data P0 //定义数码管数据口 void delay_3us(); //3US 的延时程序 void delay_8us(ui nt t); //8US 延时基准程序void delay_50us(ui nt t); // void display1(uehardis_data); voiddisplay2(uehar dis_data); void display3(uehar dis_data); void display4(uehar dis_data); void display5(uehar dis_data); void display6(uehar dis_data);void init_t0(); //定时器0初始化函数void dis_led(); //LED 处理函数void judge_s1();//S1 按键处理函数 void judge_s2(); //S2 按键处理函数void judge_s3(); //S3 按键处理函数 void dis(uehar s6,uehar s5,uehar s4,uehar s3,uehar s2,uehar s1); 示子程序 void dis_sa n( uchar s6,uehar s5,uehar s4,uehar s3,uehars1,uchar san); 〃闪烁显示子程序void judge_dis(); //显示处理函数void judge_clock(); // 显示处理函数void set_ds1302(); // 设置时间void get_ds1302(); // 读取当前时间#define uehar#define uintunsigned char unsigned int延时50*T 微妙函数的声明//数码管1显示子程序 //数码管2显示子程序 //数码管3显示子程序//数码管4显示子程序//数码管5显示子程序//数码管6显示子程序 //显s2,ueharvoid w_1byte_ds1302(uchar t); // 向DS130写一个字节的数据uchar r_1byte_ds1302(); // 从DS130读一个字节的数据〃*******************************************************************//DS18B20测温函数定义void w_1byte_ds18b20(uchar value); // 向DS18B2写一个字节ucharr_1byte_ds18b20( void ); // 从DS18B2读取一个字节的数据voidrest_ds18b20( void ); //DS18B20复位程序void readtemp_ds18b20( void ); // 读取温度void dis_temp(); //温度显示函数//共阳数码管断码表const uchar tabl1[16] ={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,// 0 1 2 3 4 50x82,0xf8,0x80,0x90,0x86,0x87,0xFF,//6 7 8 9 E T B0xc6,0xbf,0xff };// C -const uchar tabl3[] ={ 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09 };uchar t0_crycle;uchar hour_co un t, minu te_c oun t,sec on d_co un t,msec ond_count;uchar clock_hour,clock_m inu te;uchar coun tdow n_sec ond;uchar coun tdow n_hour,co un tdow n_min ute;uchar clock_en; //闹钟关闭和开启的标志,1开启,0关闭uchar flag1,sec on d_flag,za ncun 1,za ncun 2,za ncun3;uchar zancun4 ,za ncun 5,za ncun 6,za ncun7;uchar clock_flag,co un tdow n_flag;uchar msec on d_mi nute,msec on d_sec on d,mseco nd_mseco nd,mseco nd_flag; // 秒表相关参数uint speak_c ount;uchar templ,temph,temp_flag;uchar t_b,t_s,t_g,t_x,temp_flag2; //从左到右分别存储温度百位,十位,个位,小数位上电时默认的uchar tab23[3]; 〃二{0x40,0x59,0x23,0x28,0x11,0x06,0x09};//时间//主程序void main(){P3 =0x00;flag1 =0;zancun3 =0;msecond_minute =0; //置秒表相关参数为0msecond_second =0;msec on d_msec ond =0;speak =1;//关闭蜂鸣器speak_co unt =0;clock_hour =0;clock_m inute =0;clock_flag =0;countdown_flag =0; //倒计时标志位为0clock_en =0;//开机时默认关闭闹钟ini t_t0();TR0 =1;//// set_ds1302();〃设置DS130的初始时间//接下来开始编写让数码管显示的程序while (1){get_ds1302();judge_dis(); // 显示处理judge_s1();judge_s2();judge_s3();judge_clock(); //闹钟处理程序} _}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536- 50000)%256;t0_crycle ++;if (t0_crycle ==2) // 0.1 秒{t0_crycle =0;msec on d_flag =1;msec ond_count ++;if (msecond_count==10)//1 秒。
ds1302+ds18b20可调时,可调闹钟,温度上下限报警

signed char TL=3; Байду номын сангаас //下限报警温度,默认值为3
bit beep_st; //蜂鸣器间隔标志
int temp; //温度值全局变量
unsigned char time_allow; //整点报时标志
#define KEY_5 0x10
#define KEY_NULL 0x1f
#define KEY_PRESS 0x80
#define KEY_LONG 0x40
#define KEY_STATE_INIT 0
#define KEY_STATE_PRESS 1
#define KEY_STATE_LONG 2
bit ss,mm,ff,yue,tian,xq,THwendu,TLwendu;
sbit key1=P3^1; //切换
sbit key2=P3^2;//移位
sbit key3=P3^3;//加
sbit key4=P3^4;//减
int main_flag=0; //切换标志位
if(keyTemp!=KEY_NULL)
{
s_keyState=KEY_STATE_PRESS;
}
break;
case KEY_STATE_PRESS:
if(keyTemp!=KEY_NULL)
#define DS1302_RAM_WRITE 0xFE //写入RAM
#define DS1302_SECOND_WRITE 0x80 //写时钟芯片的寄存器位置
#define DS1302_MINUTE_WRITE 0x82
基于51单片机ds1302和ds18b20芯片设计的电子日历

液晶 1602设计的电子日历, proteus 仿真及 C 程序.#include<reg51.h> // 包含单片机寄存器的头文件#include<intrins.h> //包含 _nop_()函数定义的头文件 #define uchar unsigned char #define uint unsigned intsbit DQ=P3^7;//ds18b20 和单片机连接口uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志unsigned char code digit[10]={"0123456789"}; //定义字符数组显示用 DS1302 时钟芯片、 AT89C51 单片机、 温度传感器 DS18B20、LCD数字sbit DATA=P3^6; //位定义1302 芯片的接口,数据输出端定义在P1.1引脚sbit RST=P3^4;//位定义1302 芯片的接口,复位端口定义在P1.1引脚sbit SCLK=P3^5; //位定义1302 芯片的接口,时钟输出端口定义在P1.1引脚//液晶引脚定义sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0 引脚sbit RW=P2^1; //读写选择位,将RW 位定义为P2.1 引脚sbit E=P2^2; //使能信号位,将E 位定义为P2.2 引脚sbit BF=P0^7;/*****************************************************函数功能:延时若干微秒入口参数:n void delaynus(unsigned char n) {unsigned char i;for(i=0;i<n;i++);}void Write1302(unsigned char dat)unsigned char i;SCLK=0; //拉低SCLK ,为脉冲上升沿写入数据做好准备delaynus(2); // 稍微等待,使硬件做好准备for(i=0;i<8;i++){DATA=dat&0x01; //取出dat的第0 位数据写入1302 delaynus(2); // 稍微等待,使硬件做好准备SCLK=1;delaynus(2); // 稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK ,形成脉冲dat>>=1;}}/***************************************************** 函数功能:根据命令字,向1302 写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据***************************************************/ void WriteSet1302(unsigned char Cmd,unsigned char dat)RST=0; //禁止数据传递SCLK=0; // 确保写数居前SCLK 被拉低RST=1; //启动数据传输delaynus(2); //稍微等待,使硬件做好准备Write1302(Cmd); // 写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}unsigned char Read1302(void){unsigned char i,dat;delaynus(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++)//连续读8 个二进制位数据{dat>>=1;// 将dat 的各数据位右移1 位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1 取出,写在dat的最高位SCLK=1; //将SCLK 置于高电平,为下降沿读出delaynus(2); //稍微等待SCLK=0; //拉低SCLK ,形成脉冲下降沿delaynus(2); //稍微等待}return dat; //将读出的数据返回//dat 已经是一位一位的存在单}// 片集中unsigned char ReadSet1302(unsigned char Cmd){unsigned char dat;RST=0; //拉低RSTSCLK=0;//确保写数居前SCLK 被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302();SCLK=1;RST=0;return dat;}void Init_DS1302(void)//读出数据{WriteSet1302(0x8E,0x00);WriteSet1302(0x80,((0/10)<<4|(0%10))); WriteSet1302(0x82,((0/10)<<4|(0%10))); WriteSet1302(0x84,((12/10)<<4|(12%10)));WriteSet1302(0x86,((16/10)<<4|(16%10)));WriteSet1302(0x88,((11/10)<<4|(11%10)));WriteSet1302(0x8c,((8/10)<<4|(8%10)));}/*****************************************************函数功能:延时1ms(3j+2)*i=(3 × 33+2)×10=1010(微秒),可以认为是1 毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++)}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delaynms(unsigned char n)unsigned char i;{for(i=0;i<n;i++)delay1ms();}bit BusyTest(void){bit result;RS=0;RW=1;E=1;_nop_();_nop_();_nop_();_nop_();result=BF;E=0;return result;}void WriteInstruction (unsigned char dictate) {while(BusyTest()==1);RS=0;RW=0;E=0;_nop_();_nop_();P0=dictate;_nop_();_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();E=0;}/void WriteAddress(unsigned char x) {WriteInstruction(x|0x80);}void WriteData(unsigned char y) {while(BusyTest()==1);RS=1;RW=0;E=0;P0=y;_nop_();_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();E=0;}void LcdInitiate(void){delaynms(15);WriteInstruction(0x38); delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x38); delaynms(5); WriteInstruction(0x0c); delaynms(5); WriteInstruction(0x06); delaynms(5); WriteInstruction(0x01); delaynms(5);}void DisplaySecond(unsigned char x){unsigned char i,j;i=x/10;// 取十位j=x%10;// 取个位WriteAddress(0x49);WriteData(digit[i]);WriteData(digit[j]);delaynms(50);}void DisplayMinute(unsigned char x) unsigned char i,j; i=x/10;// 取十位j=x%10;// 取个位WriteAddress(0x46);WriteData(digit[i]);WriteData(digit[j]);delaynms(50); //延时1ms 给硬件一点反应时间{}void DisplayHour(unsigned char x){unsigned char i,j; //j,k,l 分别储存温度的百位、十位和个位i=x/10;j=x%10;WriteAddress(0x43);WriteData(digit[i]);WriteData(digit[j]); delaynms(50);}void delay_18B20(unsigned int i)//延时1 微秒{while(i--);}voidds1820rsδ=ds1820M^*/宀UnSignedChar X H P DQHI-=DQM tξp deωyl18B20(4x1Mt卑O O H O -deωyl18B20(10sDQMdeωyl18B20(4sUChardsl820rd()Λ⅛^≡*/ 宀UnSignedChar -H o -UnSignedChard s-HO -for("8v0 〒—)宀O O H o - ⅛⅛φdat>VMDQHIS龄奚⅛≡F Φif(DQ)dafll0x80八return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1; wdata>>=1;}}read_temp(){ uchar a,b;ds1820rst(); ds1820wr(0xcc);ds1820wr(0x44); ds1820rst();ds1820wr(0xcc); ds1820wr(0xbe);a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{ tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);return(tvalue);}void ds1820disp(){ uchar flagdat;disdata[0]=tvalue/1000+0x30;disdata[1]=tvalue%1000/100+0x30;disdata[2]=tvalue%100/10+0x30;disdata[3]=tvalue%10+0x30;if(tflag==0)flagdat=0x20;elseflagdat=0x2d;if(disdata[0]==0x30){disdata[0]=0x20;if(disdata[1]==0x30){disdata[1]=0x20;}}WriteAddress (0x80); WriteData (flagdat);WriteAddress (0x81);WriteData (disdata[0]);WriteAddress (0x82);WriteData (disdata[1]);WriteAddress (0x83);WriteData (disdata[2]);WriteAddress (0x84);WriteData (0x2e);WriteAddress (0x85);WriteData (disdata[3]);}/*结束*/ void main(void){unsigned char second,minute,hour; // 分别储存苗、分、小时,unsigned char ReadValue; //储存从1302 读取的数据LcdInitiate(); //将液晶初始化WriteAddress(0x45); //写小时和分钟分隔符的显示地址,显示在第2 行第6 列WriteData(':'); //将字符常量写入LCDWriteAddress(0x48); //写分钟和秒分隔符的显示地址,显示在第2 行第9 列WriteData(':'); //将字符常量写入LCDInit_DS1302(); //将1302 初始化while(1){read_temp();//读取温度ds1820disp();//显示ReadValue = ReadSet1302(0x81); //从秒寄存器读数据second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);DisplaySecond(second); // 显示秒ReadValue = ReadSet1302(0x83); //从分寄存器读minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); // 将读出数据转化DisplayMinute(minute); // 显示分ReadValue = ReadSet1302(0x85); //从分寄存器读hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); // 将读出数据转化DisplayHour(hour); // 显示小时} }。
DS1302时钟+18B20温度+LCD12864显示(选配)

uchar code mun_to_char[] = {"0123456789"}; /*数字转换为 ASCII 字符码*/ uchar code Week1_to_char[] = {"一"}; uchar code Week2_to_char[] = {"二"}; uchar code Week3_to_char[] = {"三"}; uchar code Week4_to_char[] = {"四"};
/********************************************************************
函 数 名:Set1302() 功 能:设置初始时间 说 明:先写地址,后读命令/数据(寄存器多字节方式) 调 用:W1302() 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年 7Byte (BCD 码)1B 1B 1B 1B 1B 1B 1B 返 回 值:无 ***********************************************************************/ void Set1302(uchar *pClock) { uchar i; uchar ucAddr = 0x80; EA = 0; W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/ for(i =7; i>0; i--) { W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */ pClock++; ucAddr +=2; } W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/ EA = 1; } /******************************************************************** 函 数 名:Get1302() 功 能:读取 DS1302 当前时间 说 明: 调 用:R1302() 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 7Byte (BCD 码) 1B 1B 1B 1B 1B 1B 1B 返 回 值:无 ***********************************************************************/ void Get1302(uchar ucCurtime[]) { uchar i; uchar ucAddr = 0x81; EA = 0; for (i=0; i<7; i++) { ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr += 2; } EA = 1; } ///////////////////以上是 DS1302 时钟读取程序////////////
单片机12864LCD、DS1302、DS18B20

用汇编写了那么多程序,马上就要用C了,所以做一个我近期在单片机上用汇编写代码的心得和一些自认为有用的程序。
主要是近期自学过的模块,比如protues中的AMPIRE128X64—LCD,DS18B20—温度测量模块,DS1302—时钟芯片。
好啦,废话也不多说了,注意我是按照我写程序的规范来写的,不过很容易理解,我也希望能帮助更多的单片机爱好者。
AMPIRE128X64一、Protues上LCD与单片机相连如图:二、打开keil新建一个AT89C51单片机的工程。
建立如下工程12864.A51用于存放驱动程序,方便调用。
main.a51用于存放主程序。
如果想知道这款LCD的详细信息可去百度文库搜索。
三、以下是12864.A51内的驱动程序,有详细解说。
PUBLICDISPLAY_BMP,DISPLAY_LCD,CLEAR_SCREEN,CHEC_BUSY,WRITE_IR,WRITE_DR,INIT_LCD,SELECT_SCREEN,SET_LINE;以上是声明外部调用语句,后面的子程序可被本工程的其它文件调用CODE_12864 SEGMENT CODE ;声明代码段LCD_RS BIT P2.2LCD_RW BIT P2.1LCD_E BIT P2.0LCD_CS1 BIT P2.4 ;低电平有效,左半屏LCD_CS2 BIT P2.3 ;低电平有效,右半屏ZIMO_NUM EQU 37H ;取字模的大小数;;;;;;;;;;;;;;;;;;;;;;;;;RSEG CODE_12864 ;;;;;;;;;;;;;;;;;;;;;;;;;检查忙等待CHEC_BUSY: MOV P0,#00H;;;;;;;;;;;;;;;;CLR LCD_RSSETB LCD_RWSETB LCD_E;详细资料里有这种命令;;;;;;;;;;;;;;;后面的就不细说了JB P0.7,$CLR LCD_ERET;;;;;;;;;;;;;;;;;;;;;;;;;向指令寄存器传送指令,传送参数为AWRITE_IR: LCALL CHEC_BUSYCLR LCD_RSCLR LCD_RWMOV P0,A ;P0作为数据口SETB LCD_ENOPNOPCLR LCD_ERET;;;;;;;;;;;;;;;;;;;;;;;;;向数据寄存器传送指令,传送参数为AWRITE_DR: LCALL CHEC_BUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENOPNOPCLR LCD_ERET;;;;;;;;;;;;;;;;;;;;;;;;;设置"页"LCD12864共8页,一页是8行点阵点SET_PAGE: ORL A,#0B8H ;页的首地址为0xB8LCALL WRITE_IRRET;;;;;;;;;;;;;;;;;;;;;;;;;设置显示的起始行SET_LINE: ORL A,#0C0H ;起始行地址为0xC0LCALL WRITE_IR;设置从哪行开始:共0--63;一般从0 行开始显示RET;;;;;;;;;;;;;;;;;;;;;;;;;设置显示的列SET_COLUMN: ANL A,#3FH ;列的最大值为64ORL A,#40H ;列的首地址为0x40LCALL WRITE_IR;规定显示的列的位置RET;;;;;;;;;;;;;;;;;;;;;;;;;显示开关函数:0x3E是关显示,0x3F是开显示SET_ON_OFF: ORL A,#3EH ;0011 111x,onoff只能为0或者1LCALL WRITE_IRRET;;;;;;;;;;;;;;;;;;;;;;;;;选择屏幕SELECT_SCREEN: CJNE A,#0,SELECTN0;0全屏CLR LCD_CS1CLR LCD_CS2LJMP SELECT_ENDSELECTN0: CJNE A,#1,SELECTN1;1左半屏CLR LCD_CS1SETB LCD_CS2LJMP SELECT_ENDSELECTN1: CJNE A,#2,SELECT_END;2右半屏CLR LCD_CS2SETB LCD_CS1SELECT_END: RET;;;;;;;;;;;;;;;;;;;;;;;;;清屏函数CLEAR_SCREEN: LCALL SELECT_SCREEN;0--全屏;1---左半屏;2---右半屏MOV R7,#0 ;控制页数0-7,共8页CLR_K1: MOV A,R7LCALL SET_PAGEMOV A,#0LCALL SET_COLUMNMOV R6,#0 ;控制列数0-63,共64列CLR A ;0CLR_K0: LCALL WRITE_DR;写入0,地址指针自加1INC R6CJNE R6,#64,CLR_K0INC R7CJNE R7,#8,CLR_K1RET;;;;;;;;;;;;;;;;;;;;;;;;;LCD的初始化INIT_LCD: LCALL CHEC_BUSYCLR A;选择全屏LCALL SELECT_SCREENCLR A;关闭显示LCALL SET_ON_OFFCLR A;选择全屏LCALL SELECT_SCREENMOV A,#01H;开启显示LCALL SET_ON_OFFCLR A;选择全屏LCALL SELECT_SCREENCLR A;清屏LCALL CLEAR_SCREENCLR A;开始行0LCALL SET_LINERET ;;;;;;;;;;;;;;;;;;;;;;;;;显示汉字子程序DISPLAY_LCD:;R5传入那半屏显示,R6传入页,R7传入列,DPTR传入字模表MOV A,R5LCALL SELECT_SCREEN;选择屏幕MOV A,R6LCALL SET_PAGE;选上半页MOV A,R7LCALL SET_COLUMN;控制列MOV R5,#0 ;控制16列的数据输出DISP_K0: MOV A,R5MOVC A,@A+DPTRLCALL WRITE_DR;选择查出的字模INC R5CLR CMOV A,R5SUBB A,ZIMO_NUMJNZ DISP_K0MOV A,R6INC ALCALL SET_PAGE;选下半页MOV A,R7LCALL SET_COLUMN;控制列MOV R5,#0 ;控制16列的数据输出DISP_K1: MOV A,R5ADD A,ZIMO_NUMMOVC A,@A+DPTRLCALL WRITE_DR;选择查出的字模INC R5CLR CMOV A,R5SUBB A,ZIMO_NUMJNZ DISP_K1RET ;;;;;;;;;;;;;;;;;;;;;;;;;显示BMP图片DISPLAY_BMP:;DPTR为图片取模表首址MOV R7,#0DISP_BMP_K2: MOV A,#1LCALL SELECT_SCREEN;选择左半屏MOV A,R7LCALL SET_PAGE;选择页CLR ALCALL SET_COLUMN;选择第0列MOV R6,#0DISP_BMP_K0: CLR A;MOVC A,@A+DPTRLCALL WRITE_DR;每隔一行取一次数组中的数据INC R6INC DPTRCJNE R6,#64,DISP_BMP_K0MOV A,#2LCALL SELECT_SCREEN;选择右半屏MOV A,R7LCALL SET_PAGE;选择页CLR ALCALL SET_COLUMN;选择第0列MOV R6,#0DISP_BMP_K1: CLR A;MOVC A,@A+DPTRLCALL WRITE_DR;每隔一行取一次数组中的数据INC R6INC DPTRCJNE R6,#64,DISP_BMP_K1INC R7CJNE R7,#8,DISP_BMP_K2RET ;;;;;;;;;;;;;;;;;;;;;;;;;END四、下面介绍一款LCD取模软件。
12864+DS1302时钟+18B20温度计

#include <REG51.H>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P1^0; //实时时钟时钟线引脚sbit DS1302_IO = P1^1; //实时时钟数据线引脚sbit DS1302_RST = P1^2; //实时时钟复位线引脚sbit DQ = P3^3; //温度传送数据IO口sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数sbit Set = P1^4; //模式切换键对应实验板K5sbit Up = P1^5; //加法按钮对应实验板K6sbit Down= P1^6; //减法按钮对应实验板K7sbit out = P1^7; //立刻跳出调整模式按钮对应实验板K8uchar done,count,temp,up_flag,down_flag;uchar temp_value,temp1_value; //temp_value温度值正数部分temp1_value温度值小数部分uchar TempBuffer[8],week_value[3];void show_time(); //液晶显示程序//****************************************//12864液晶显示部分子程序模块//****************************************sbit rs = P2^0;sbit rw = P2^1;sbit e = P2^2;#define lcddata P0sbit busy=P0^7; //lcd busy bitvoid wr_d_lcd(uchar content);void wr_i_lcd(uchar content);void clrram_lcd (void);void init_lcd(void);void busy_lcd(void);void rev_row_lcd(uchar row);void rev_co_lcd(uchar row,uchar col,uchar mode);void clr_lcd(void);void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);void wr_row_lcd(uchar row,char *p);//**********************************//液晶初始化//**********************************void init_lcd(void){wr_i_lcd(0x06); /*光标的移动方向*/wr_i_lcd(0x0c); /*开显示,关游标*/ }//*********************************** //填充液晶DDRAM全为空格//********************************** void clrram_lcd (void){wr_i_lcd(0x30);wr_i_lcd(0x01);}//*********************************** //对液晶写数据//content为要写入的数据//*********************************** void wr_d_lcd(uchar content){busy_lcd();rs=1;rw=0;lcddata=content;e=1;;e=0;}//********************************//对液晶写指令//content为要写入的指令代码//*****************************void wr_i_lcd(uchar content){busy_lcd();rs=0;rw=0;lcddata=content;e=1;;e=0;}//********************************//液晶检测忙状态//在写入之前必须执行//******************************** void busy_lcd(void){lcddata=0xff;rs=0;rw=1;e =1;while(busy==1);e =0;}//********************************//指定要显示字符的坐标//*******************************void gotoxy(unsigned char y, unsigned char x) {if(y==1)wr_i_lcd(0x80|x);if(y==2)wr_i_lcd(0x90|x);if(y==3)wr_i_lcd((0x80|x)+8);if(y==4)wr_i_lcd((0x90|x)+8);}//********************************** //液晶显示字符串程序//********************************** void print(uchar *str){while(*str!='\0'){wr_d_lcd(*str);str++;}}//*********************************** //DS1302时钟部分子程序模块//*********************************** typedef struct __SYSTEMTIME__{uchar Second;uchar Minute;uchar Hour;uchar Week;uchar Day;uchar Month;uchar Year;uchar DateString[11];uchar TimeString[9];}SYSTEMTIME; //定义的时间类型SYSTEMTIME CurrentTime;#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C//**********************************//实时时钟写入一字节(内部函数)//**********************************void DS1302InputByte(uchar d){uchar i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1;}}//*************************************//实时时钟读取一字节(内部函数)//*************************************uchar DS1302OutputByte(void){uchar i;for(i=8; i>0; i--){ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;}return(ACC);}//**************************************//ucAddr: DS1302地址, ucData: 要写的数据//**************************************void Write1302(uchar ucAddr, uchar ucDa){DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;}//**************************************//读取DS1302某地址的数据//**************************************uchar Read1302(uchar ucAddr){uchar ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}//******************************************//获取时钟芯片的时钟数据到自定义的结构型数组//******************************************void DS1302_GetTime(SYSTEMTIME *Time){uchar ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//转换为相应的10进制数ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadV alue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x10)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F);}//******************************************//将时间年,月,日,星期数据转换成液//晶显示字符串,放到数组里DateString[]//******************************************void DateToStr(SYSTEMTIME *Time){uchartab[ ]={0XD2,0XBB,0XB6,0XFE,0XC8,0XFD,0XCB,0XC4,0XCE,0XE5,0XC1,0XF9,0XC8,0X D5};if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22{Time->DateString[0] = '2';Time->DateString[1] = '0';Time->DateString[2] = Time->Year/10 + '0';Time->DateString[3] = Time->Year%10 + '0';}else{Time->DateString[0] = ' ';Time->DateString[1] = ' ';Time->DateString[2] = ' ';Time->DateString[3] = ' ';}Time->DateString[4]='-';if(hide_month<2){Time->DateString[5] = Time->Month/10 + '0';Time->DateString[6] = Time->Month%10 + '0';}else{Time->DateString[5] = ' ';Time->DateString[6] = ' ';}Time->DateString[7]='-';if(hide_day<2){Time->DateString[8] = Time->Day/10 + '0';Time->DateString[9] = Time->Day%10 + '0';}else{Time->DateString[8] = ' ';Time->DateString[9] = ' ';}if(hide_week<2){week_value[0] =tab[2*(Time->Week%10)-2]; //星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示week_value[1] =tab[2*(Time->Week%10)-1];}else{week_value[0] = ' ';week_value[1]=' ';}week_value[2] = '\0';Time->DateString[10] = '\0'; //字符串末尾加'\0' ,判断结束字符}//******************************************//将时,分,秒数据转换成液晶//显示字符放到数组TimeString[]//*****************************************void TimeToStr(SYSTEMTIME *Time){ if(hide_hour<2){Time->TimeString[0] = Time->Hour/10 + '0';Time->TimeString[1] = Time->Hour%10 + '0';}else{Time->TimeString[0] = ' ';Time->TimeString[1] = ' ';}Time->TimeString[2] = ':';if(hide_min<2){Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';}else{Time->TimeString[3] = ' ';Time->TimeString[4] = ' ';}Time->TimeString[5] = ':';if(hide_sec<2){Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';}else{Time->TimeString[6] = ' ';Time->TimeString[7] = ' ';}Time->TimeString[8] = '\0';}//******************************//时钟芯片初始化//******************************void Initial_DS1302(void){uchar Second=Read1302(DS1302_SECOND);if(Second&0x80) //判断时钟芯片是否关闭{Write1302(0x8e,0x00); //写入允许Write1302(0x8c,0x07); //以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:55 Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止写入}}//****************************************//ds18b20子程序模块//****************************************/***********ds18b20子程序*************************//***********ds18b20延迟子函数(晶振12MHz )*******/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(40); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(7);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(10);}/***********ds18b20读一个字节**************/uchar ReadOneChar(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){uchar i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}}/**************读取ds18b20当前温度************/void ReadTemp(void){uchar a=0;uchar b=0;uchar t;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(50);a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位t=b&0xf8;if(t){TempBuffer[0]=':';TempBuffer[1]='-';temp_value=b<<4;temp_value+=(a&0xf0)>>4;temp_value=~temp_value+1;temp1_value=~a&0x0f;}else{temp_value=b<<4;temp_value+=(a&0xf0)>>4;temp1_value=a&0x0f;TempBuffer[0]=':';TempBuffer[1]=temp_value/100+'0'; //百位if(TempBuffer[1]=='1'){TempBuffer[1]='1';}else{TempBuffer[1]=' ';}}}void temp_to_str() //温度数据转换成液晶字符显示{TempBuffer[2]=temp_value%100/10+'0'; //十位TempBuffer[3]=temp_value%10+'0'; //个位TempBuffer[4]='.';TempBuffer[5]=temp1_value*625/1000%10+'0'; TempBuffer[6]=temp1_value*625/100%10+'0'; TempBuffer[7]=temp1_value*625/10%10+'0';//TempBuffer[8]=temp1_value*625%10+'0'; TempBuffer[8]='\0';}//********************************************** //延时子程序模块//********************************************** void mdelay(uint delay){ uint i;for(;delay>0;delay--){for(i=0;i<80;i++) //1ms延时.{;}}}//************************************************//按键设置程序模块//************************************************//************************************//跳出调整模式,返回默认显示//************************************void outkey(){ uchar Second;if(out==0){ mdelay(5);count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////*************************//升序按键//*************************void Upkey(){Up=1;if(Up==0){mdelay(5);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp+1; //秒数加1up_flag=1; //数据调整后更新标志if((temp)>59) //超过59秒,清零temp=0;temp=temp/10*16+temp%10;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp+1; //分数加1up_flag=1;if(temp>59) //超过59分,清零temp=0;temp=temp/10*16+temp%10;break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp+1; //小时数加1up_flag=1;if(temp>23) //超过23小时,清零temp=0;temp=temp/10*16+temp%10;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp+1; //星期数加1up_flag=1;if(temp>7)temp=1;temp=temp/10*16+temp%10;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp+1; //日数加1up_flag=1;if(temp>31)temp=1;temp=temp/10*16+temp%10;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp+1; //月数加1up_flag=1;if(temp>12)temp=1;temp=temp/10*16+temp%10;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=((temp&0xf0)>>4)*10 + (temp&0x0F);temp=temp+1; //年数加1up_flag=1;if(temp>99)temp=0;temp=temp/10*16+temp%10;break;default:break;}// while(Up==0);}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////************************//降序按键//************************void Downkey(){Down=1;if(Down==0){mdelay(5);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp-1; //秒数减1down_flag=1; //数据调整后更新标志if(temp==-1) //小于0秒,返回59秒temp=59;temp=temp/10*16+temp%10;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp-1; //分数减1down_flag=1;if(temp==-1)temp=59; //小于0秒,返回59秒temp=temp/10*16+temp%10;break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp-1; //小时数减1down_flag=1;if(temp==-1)temp=23;temp=temp/10*16+temp%10;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数;temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp-1; //星期数减1down_flag=1;if(temp==0)temp=7;temp=temp/10*16+temp%10;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp-1; //日数减1down_flag=1;if(temp==0)temp=31;temp=temp/10*16+temp%10;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=((temp&0x70)>>4)*10 + (temp&0x0F);temp=temp-1; //月数减1down_flag=1;if(temp==0)temp=12;temp=temp/10*16+temp%10;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=((temp&0xf0)>>4)*10 + (temp&0x0F);temp=temp-1; //年数减1down_flag=1;if(temp==-1)temp=99;temp=temp/10*16+temp%10;break;default:break;}// while(Down==0);}}//**************************//模式选择按键//**************************void Setkey(){Set=1;if(Set==0){mdelay(5);count=count+1; //Setkey按一次,count就加1done=1; //进入调整模式while(Set==0);}}//*************************//按键功能执行//*************************void keydone(){ uchar Second;/* if(flag==0) //关闭时钟,停止计时{ Write1302(0x8e,0x00); //写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);Write1302(0x8e,0x80); //禁止写入flag=1;}*/Setkey(); //扫描模式切换按键switch(count){case 1:do //count=1,调整秒{outkey(); //扫描跳出按钮Upkey(); //扫描加按钮Downkey(); //扫描减按钮if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据{Write1302(0x8e,0x00); //写入允许Write1302(0x80,temp); //写入新的秒数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}if(Down!=0&&Up!=0){hide_sec++;if(hide_sec>3)hide_sec=0;}else hide_sec=0;show_time(); //液晶显示数据}while(count==2);break;case 2:do //count=2,调整分{hide_sec=0;outkey();Upkey();Downkey();if(temp>0x60)temp=0;if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x82,temp); //写入新的分数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}if(Down!=0&&Up!=0){hide_min++;if(hide_min>3)hide_min=0;}else hide_min=0;show_time();}while(count==3);break;case 3:do //count=3,调整小时{hide_min=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x84,temp); //写入新的小时数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}if(Down!=0&&Up!=0){hide_hour++;if(hide_hour>3)hide_hour=0;}else hide_hour=0;show_time();}while(count==4);break;case 4:do //count=4,调整星期{hide_hour=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x8a,temp); //写入新的星期数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}if(Down!=0&&Up!=0){hide_week++;if(hide_week>3)hide_week=0;}else hide_week=0;show_time();}while(count==5);break;case 5:do //count=5,调整日{hide_week=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x86,temp); //写入新的日数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}if(Down!=0&&Up!=0){hide_day++;if(hide_day>3)hide_day=0;}else hide_day=0;show_time();}while(count==6);break;case 6:do //count=6,调整月{hide_day=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x88,temp); //写入新的月数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}if(Down!=0&&Up!=0){hide_month++;if(hide_month>3)hide_month=0;}else hide_month=0;show_time();}while(count==7);break;case 7:do //count=7,调整年{hide_month=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x8c,temp); //写入新的年数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}if(Down!=0&&Up!=0){hide_year++;if(hide_year>3)hide_year=0;}else hide_year=0;show_time();}while(count==8);break;case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;break; //count=7,开启中断,标志位置0并退出default:break;}}//***************************************//液晶显示主程序模块//***************************************void show_time(){DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据TimeToStr(&CurrentTime); //时间数据转换液晶字符DateToStr(&CurrentTime); //日期数据转换液晶字符ReadTemp(); //开启温度采集程序temp_to_str(); //温度数据转换成液晶字符gotoxy(4,0);print("温度");gotoxy(4,2); //液晶字符显示位置print(TempBuffer); //显示温度gotoxy(4,6);print("℃");gotoxy(3,0);print("时间:");gotoxy(3,3);print(CurrentTime.TimeString); //显示时间gotoxy(2,3);print(CurrentTime.DateString); //显示日期gotoxy(2,0);print("星期");gotoxy(2,2);print(week_value); //显示星期gotoxy(1,1);print("【锐志电子】");mdelay(500); //扫描延时}//************************************//主程序//*************************************main(){// flag=1; //时钟停止标志init_lcd();clrram_lcd();Init_DS18B20( ) ; //DS18B20初始化Initial_DS1302(); //时钟芯片初始化up_flag=0;down_flag=0;done=0; //进入默认液晶显示while(1){while(done==1)keydone(); //进入调整模式while(done==0){show_time(); //液晶显示数据// flag=0;Setkey(); //扫描各功能键}}}。
万年历时钟(ds1302)+温度显示(ds18b20)原理图

P3.0 (RXD) P3.1 (TXD) P3.2 (INT0) P3.3 (INT1) P3.4 (T0) P3.5 (T1) X1 X2 IC2 89C51 P27 P26 P25 P24 P23 P22 P21 P20
Байду номын сангаас
28 27 26 25 24 23 22 21
LED2
DIG0_C
DIG4_B
DIG0_B
SD3
DP3
SG3
SD2
DP2
SG2
SD2
DP2
SG2
SD1
DP1
SG1
SD1
DP1
SC3
SC2
SC2
SC1
SC1
SE3
SE2
SE2
SE1
SE1
6
A4
d
h
g
d
h
g
d
h
g
d
h
g
d
h
g
e
c
e
c
e
c
e
c
e
c
R12 1.5k
S7 DP3 S6 SA3 S16 S5:减键,代码05 C S8 S6:加键,代码06 S7:调节时间,代码 07
R12 1.5k C7 104 C7 15P
5V 5V 1 2 3 4 5 CS1 6 CLK1 7 DATA1 8 9 KEY1 10 11 12 13 14 驱动第一排 VDD VDD NC VSS NC CS CLK DATA KEY SG SF SE SD SC HD7279A RESET RC CLKO DIG7 DIG6 DIG5 DIG4 DIG3 DIG2 DIG1 DIG0 DP SA SB 28 27 26 25 24 23 22 21 20 19 18 17 16 15
基于DS1302和DS18B20设计的多功能电子实时时钟

基于DS1302和DS18B20设计的多功能电子实时时钟摘要随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
尤其是单片机技术的应用产品已经走进了千家万户。
电子日历的出现给人们的生活带来的诸多方便。
本设计介绍了一种在数码管屏幕上显示当前日期时间和温度的51单片机控制系统。
首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。
本设计以数字集成电路技术为基础,单片机技术为核心。
本文编写的主导思想是软硬件相结合,以硬件为基础,来进行各功能模块的编写。
本系统以单片机的C语言进行软件设计,增加了程序的可读性和可移植性,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。
系统通过8位数码管为载体显示数据,所以具有人性化的操作和美观的效果。
可以自动显示年月日、星期、温度等。
设计中处理器选取内核为C51的STC89C52单片机;数字温度传感器DS18B20,作为单片机外部信号源,实时显示温度;时钟芯片DS1302提供当前日期和时间数据;实时的日期和时间及温度数据在数码管上显示。
在显示部分,利用3/8译码芯片74HC138控制8位数码管的位选,利用串入并出的芯片74HC164来驱动8位数码管的段码,节省了主控芯片的I/O口。
这种实时时钟不仅具有一般时钟的显示时分秒功能,还能显示月日周,而且能显示当前的实时温度,另外仅使用三个按键调时,简单方便易于使用。
实践证明该系统稳定性高,显示数据准确。
关键词:89C52单片机,DS1302,DS18B20,电子时钟目录前言 (1)第一章方案选择 (2)§1.1 时钟方案 (2)§1.2 温度采集方案 (2)§1.3 显示方案 (3)第二章硬件部分设计 (4)§2.1硬件系统原理 (4)§2.2最小系统 (4)§2.3 显示部分 (5)§2.4 测温部分 (6)§2.5 时钟部分 (7)§2.6 按键部分 (8)第三章软件部分设计 (9)§3.1 系统各部分软件设计综述 (9)§3.2 DS1302时钟部分 (9)§3.3 测温部分 (10)§3.4 显示部分 (11)§3.5 按键部分 (11)§3.6 系统主要流程图 (13)第四章调试与分析 (15)§4.1 软件调试 (15)§4.2 硬件调试 (17)§4.3 发现的问题和分析及解决办法 (18)结束语 (19)参考文献 (20)致谢 (21)附录 (22)前言时间和温度是人类生活必不可少的重要元素也是一个永恒的话题,如果没有时间的概念,社会将不会有所发展和进步,如果没有温度人们将无法及时得知温情冷暖的变化。
12864万年历带闹钟和温度

基于51单片机的设计:源代码调试通过主函数部分:包含头文件,液晶18b20和DS1302的初始化#include<reg52.h>#include"12864.h"#include"ds1302.h"#include"18b20.h"#define uchar unsigned char#define uint unsigned intvoid main(){uchar i;lcd_init();b20_init();ds1302_init();ds1302_write_time();while(1){write_com(0x80);dis("★★mage心寒★★");get_temperature();b20_display();ds1302_read_time();for(i=1;i<8;i++)tempdata[i]=time_buf1[i];ds1302_display();}}12864控制部分:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit rs=P2^4;sbit e=P2^6;sbit rw=P2^5;uchar i,j,num,aa;void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) {rs=0;P0=com;delayms(5);e=1;delayms(5);e=0;}void write_data(uchar date) {rs=1;P0=date;delayms(5);e=1;delayms(5);e=0;}void dis(unsigned char code *s) { while(*s>0){ write_data(*s);s++;delayms(5);}}void lcd_init(){rw=0;e=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);}/*lcd_display(){write_com(0x80);dis("12864 液晶,,,,");delayms(100);write_com(0x90);dis("安徽建筑工业学院");delayms(100);write_com(0x88);dis("电子创新实验室");delayms(100);write_com(0x98);dis("mage心寒");delayms(1000);write_com(0x01);}*/DS1302部分:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar time_buf2[16];uchar tempdata[8];uchar num;sbit sck=P3^6;sbit sda=P3^4;sbit rst=P3^5;#define ds1302_sec_add 0x80 //秒数据地址#define ds1302_min_add 0x82 //分数据地址#define ds1302_hr_add 0x84 //时数据地址#define ds1302_date_add 0x86 //日数据地址#define ds1302_month_add 0x88 //月数据地址#define ds1302_day_add 0x8a //星期数据地址#define ds1302_year_add 0x8c //年数据地址#define ds1302_control_add 0x8e //控制数据地址#define ds1302_charger_add 0x90#define ds1302_clkburst_add 0xbeunsigned char time_buf1[] = {20,10,8,26,15,57,56,4};//年月日时分秒周unsigned char time_buf[16] ;//空年月日时分秒周/*向DS1302写入一字节数据*/void ds1302_write_byte(uchar add, uchar d) {uchar i;rst=1; /*启动DS1302总线*//*写入目标地址:addr*/add= add & 0xfe;/*最低位置零*/for (i = 0; i < 8; i ++) {if (add & 0x01) {sda=1;}else {sda=0;}sck=1;sck=0;add = add >> 1;}/*写入数据:d*/for (i = 0; i < 8; i ++) {if (d & 0x01) {sda=1;}else {sda=0;}sck=1;sck=0;d = d >> 1;}rst=0; /*停止DS1302总线*/ }/*从DS1302读出一字节数据*/uchar ds1302_read_byte(uchar add){uchar i;uchar temp;rst=1; /*启动DS1302总线*//*写入目标地址:addr*/add = add | 0x01;/*最低位置高*/for (i = 0; i < 8; i ++) {if (add & 0x01) {sda=1;;}else {sda=0;}sck=1;sck=0;add = add >> 1;}/*输出数据:temp*/for (i = 0; i < 8; i ++) {temp = temp >> 1;if (sda==1) {temp |= 0x80;}else {temp &= 0x7f;}sck=1;sck=0;}rst=0; /*停止DS1302总线*/return temp;}/*向DS302写入时钟数据*/void ds1302_write_time(){unsigned char i,tmp;for(i=1;i<8;i++){ //BCD处理tmp=time_buf1[i]/10;time_buf[i]=time_buf1[i]%10;time_buf[i]=time_buf[i]+tmp*16;}ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护ds1302_write_byte(ds1302_sec_add,0x80); //暂停ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电ds1302_write_byte(ds1302_year_add,time_buf[1]); //年ds1302_write_byte(ds1302_month_add,time_buf[2]); //月ds1302_write_byte(ds1302_date_add,time_buf[3]); //日ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时ds1302_write_byte(ds1302_min_add,time_buf[5]); //分ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒ds1302_write_byte(ds1302_day_add,time_buf[7]); //周ds1302_write_byte(ds1302_control_add,0x80); //打开写保护}/*从DS302读出时钟数据*/void ds1302_read_time(){uchar i,tmp;time_buf[1]=ds1302_read_byte(ds1302_year_add); //年time_buf[2]=ds1302_read_byte(ds1302_month_add); //月time_buf[3]=ds1302_read_byte(ds1302_date_add); //日time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时time_buf[5]=ds1302_read_byte(ds1302_min_add); //分time_buf[6]=ds1302_read_byte(ds1302_sec_add); //秒time_buf[7]=ds1302_read_byte(ds1302_day_add); //周for(i=1;i<8;i++){ //BCD处理tmp=time_buf[i]/16;time_buf1[i]=time_buf[i]%16;time_buf1[i]=time_buf1[i]+tmp*10;}}/*DS302初始化函数*/void ds1302_init(){rst=0; /*RST脚置低*/sck=0; /*SCK脚置低*/}void write_sfm(uchar date){uchar shi,ge;shi=date/10;ge=date%10;//write_com(0x90+add);write_data(0x30+shi);write_data(0x30+ge);}void write_nyr(uchar date){uchar shi,ge;shi=date/10;ge=date%10;//write_com(0x90+add);write_data(0x30+shi);write_data(0x30+ge);}void write_xq(uchar date){//write_com(0x90+add);switch(date){case 1:write_data('M');break;case 2:write_data('T');break;case 3:write_data('W');break;case 4:write_data('T');break;case 5:write_data('F');break;case 6:write_data('S');break;case 7:write_data('s');break;}}void ds1302_display(){write_com(0x88);//write_nyr(tempdata[1]);write_nyr(tempdata[2]);write_data('-');write_nyr(tempdata[3]);write_data(' ');write_sfm(tempdata[4]);write_data(':');write_sfm(tempdata[5]);write_data(':');write_sfm(tempdata[6]);write_data(' ');write_xq(tempdata[7]);//if((tempdata[4]==0x13)&&(tempdata[5]==0x38)&&(tempdata[6]==0x00))//beez=1;//if((tempdata[4]==0x13)&&(tempdata[5]==0x38)&&(tempdata[6]==0x05))//beez=0;write_com(0x98);if ( tempdata[2] == 0x01 && tempdata[3] == 0x01 ){ dis("Happy New Y ear!!"); }//1月if ( tempdata[2] == 0x02 && tempdata[3] == 0x02 ){ dis(" 世界湿地日"); }//2月if ( tempdata[2] == 0x02 && tempdata[3] == 0x0d ){ dis(" 明天情人节了"); }if ( tempdata[2] == 0x02 && tempdata[3] == 0x0e ){ dis("今天是情人节"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x01 ){ dis(" 国际海豹日"); }//3月if ( tempdata[2] == 0x03 && tempdata[3] == 0x03 ){ dis(" 全国爱耳日"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x08 ){ dis(" 3.8妇女节"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x0c ){ dis("植树节"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x0e){ dis(" 国际警察日"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x0f ){ dis(" 消费者权益日"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x11 ){ dis(" 国际航海日"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x15 ){ dis(" 世界森林日"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x16 ){ dis(" 世界水日"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x17 ){ dis(" 世界气象日"); }if ( tempdata[2] == 0x03 && tempdata[3] == 0x18 ){ dis("世界防治结核病日"); }if ( tempdata[2] == 0x04 && tempdata[3] == 0x01 ){ dis("愚人节小心上当"); }//4if ( tempdata[2] == 0x04 && tempdata[3] == 0x07 ){ dis(" 世界卫生日"); }if ( tempdata[2] == 0x04 && tempdata[3] == 0x08 ){ dis(" 复活节"); }if ( tempdata[2] == 0x04 && tempdata[3] == 0x0d ){ dis(" 黑色星期五"); }if ( tempdata[2] == 0x05 && tempdata[3] == 0x01 ){ dis(" 劳动节放假"); }//5if ( tempdata[2] == 0x05 && tempdata[3] == 0x04 ){ dis(" 青年节"); }if ( tempdata[2] == 0x05 && tempdata[3] == 0x08 ){ dis(" 世界红十字日"); }if ( tempdata[2] == 0x05 && tempdata[3] == 0x05 ){ dis("近日注意母亲节"); }if ( tempdata[2] == 0x05 && tempdata[3] == 0x15 ){ dis(" 国际家庭日"); }if ( tempdata[2] == 0x05 && tempdata[3] == 0x1f ){ dis(" 世界无烟日"); }if ( tempdata[2] == 0x06 && tempdata[3] == 0x01 ){ dis(" 国际儿童节"); }//6 if ( tempdata[2] == 0x06 && tempdata[3] == 0x05 ){ dis(" 世界环境日"); }if ( tempdata[2] == 0x06 && tempdata[3] == 0x1a ){ dis("国际禁毒日"); }if ( tempdata[2] == 0x06 && tempdata[3] == 0x06 ){ dis(" 全国爱眼日"); }if ( tempdata[2] == 0x06 && tempdata[3] == 0x0d ){ dis("近日注意父亲节"); }if ( tempdata[2] == 0x06 && tempdata[3] == 0x0f ){ dis("近日注意父亲节"); }if ( tempdata[2] == 0x07 && tempdata[3] == 0x01 ){ dis("香港回归记念日"); }//7 if ( tempdata[2] == 0x07 && tempdata[3] == 0x07 ){ dis("抗日战争记念日"); }if ( tempdata[2] == 0x07 && tempdata[3] == 0x0b ){ dis(" 世界人口日"); }if ( tempdata[2] == 0x08 && tempdata[3] == 0x01 ){ dis(" 八一建军节"); }//8 if ( tempdata[2] == 0x08 && tempdata[3] == 0x08 ){ dis(" 中国男子节"); }if ( tempdata[2] == 0x08 && tempdata[3] == 0x0f ){ dis("抗战胜利记念日"); }if ( tempdata[2] == 0x09 && tempdata[3] == 0x10 ){ dis(" 中国教师节"); }//9 if ( tempdata[2] == 0x09 && tempdata[3] == 0x12 ){ dis("九·一八事变记念"); }if ( tempdata[2] == 0x09 && tempdata[3] == 0x14 ){ dis(" 国际爱牙日"); }if ( tempdata[2] == 0x09 && tempdata[3] == 0x1b ){ dis(" 世界旅游日"); }if ( tempdata[2] == 0x0a && tempdata[3] == 0x01 ){ dis("中国国庆节"); }//10 if ( tempdata[2] == 0x0a && tempdata[3] == 0x04 ){ dis("世界动物日"); }if ( tempdata[2] == 0x0a && tempdata[3] == 0x18 ){ dis("联合国日"); }if ( tempdata[2] == 0x0a && tempdata[3] == 0x0c ){ dis("明天国际教师节"); }if ( tempdata[2] == 0x0a && tempdata[3] == 0x0d ){ dis("国际教师节"); }if ( tempdata[2] == 0x0b && tempdata[3] == 0x0a ){ dis("世界青年节"); }//11 if ( tempdata[2] == 0x0b && tempdata[3] == 0x11 ){ dis(" 世界学生节"); }if ( tempdata[2] == 0x0c && tempdata[3] == 0x01 ){ dis("世界艾滋病日"); }//12 if ( tempdata[2] == 0x0c && tempdata[3] == 0x17 ){ dis("明晚平安夜"); }if ( tempdata[2] == 0x0c && tempdata[3] == 0x18 ){ dis("今晚平安夜"); }if ( tempdata[2] == 0x0c && tempdata[3] == 0x19 ){ dis("圣诞快乐"); }else{if ( tempdata[4] >= 0x04 && tempdata[4] <0x06 ){ dis("★★__▲▲__凌晨"); }if ( tempdata[4]>=0x06&&tempdata[4] <=0x08 ){ dis("☆○__▲△__早晨"); }if ( tempdata[4] >= 0x08 && tempdata[4] < 0x0c){ dis("__●__▲▲__上午"); }if ( tempdata[4] >= 0x0c&&tempdata[4]<=0x0d) { dis("____▲●▲__中午"); }if (tempdata[4] >= 0x0d&&tempdata[4] <0x12){ dis("__▲▲__●__下午"); }if (tempdata[4] >= 0x12&&tempdata[4] <0x16){ dis("△▲__●☆__晚上"); }if ( tempdata[4] >= 0x16&&tempdata[4] <=0x17){ dis("△▲__★☆__夜里"); }if ( tempdata[4] >= 0x00 && tempdata[4] <=0x04 ){ dis("__★▲▲★__深夜"); }}}DS18B20部分:#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<math.h>#include<intrins.H>#define uchar unsigned char#define uint unsigned intsbit DQ=P1^3;//ds18b20 端口uint temp;uchar flag_get,count,num,minute,second,aa,bb,cc,dd,ee;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //7段数码管段码表共阳void delay1(uchar MS);unsigned int ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);void b20_display(){write_com(0x90);dis("温度:");write_data(aa);//write_com(0x80+0x01);write_data(0x30+bb);//write_com(0x80+0x02);write_data(0x30+cc);//write_com(0x80+0x03);write_data(0x30+dd);//write_com(0x80+0x04);write_data('.');//write_com(0x80+0x05);write_data(0x30+ee);//write_com(0x80+0x06);write_data('C');//write_com(0x80+0x06);}void b20_init(){TMOD|=0x01;//定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;}void get_temperature(){unsigned char TempH,TempL;bb=TempH/100; //百位温度cc=(TempH%100)/10; //十位温度dd=(TempH%100)%10; //个位温度,带小数点ee=TempL;// display();if(flag_get==1) //定时读取当前温度{temp=ReadTemperature();if(temp&0x8000){aa='-';//负号标志temp=~temp; // 取反加1temp +=1;}elseaa='+';TempH=temp>>4;TempL=temp&0x0F;TempL=TempL*6/10;//小数近似处理flag_get=0;}}void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num++;if (num==50){num=0;flag_get=1;//标志位有效second++;if(second>=60){second=0;minute++;}}}void delay(unsigned int i)//延时函数{while(i--); //延迟1us}void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(10);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(5);}/******************************************************************/ /* 读一个字节*/ /******************************************************************/ unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(5);}return(dat);}/******************************************************************//* 写一个字节*//******************************************************************/ void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}delay(5);}/******************************************************************//* 读取温度*//******************************************************************/ unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar(); //低位b=ReadOneChar(); //高位b<<=8; t=a+b;return(t); }。
基于STC90C516RD+、DS1302、DS18B20、12864液晶显示万年历设计

基于STC90C516RD+、DS1302、DS18B20、12864液晶显示万年历设计目录目录 (I)Abstract (II)1 概述 (1)1.1 系统基本方案选择和论证 (1)1.2 电路设计最终方案 (3)2 系统的硬件设计与实现 (4)2.1 电路设计框图 (4)2.2 系统硬件概述 (4)2.3 主要单元电路的设计 (4)3 系统的软件设计 (17)3.1 程序流程框图 (17)3.2 子程序 (19)4 系统测试 (20)4.1 硬件测试 (20)4.2 软件测试 (20)5 结束语 (21)参考文献 (22)附录:程序 (23)致谢.................................................... 错误!未定义书签。
摘要本文借助电路仿真软件Protues对基于STC90C516RD+单片机的电子万年历的设计方法及下载测试进行了全面的阐述。
该电子万年历在硬件方面主要采用STC90C516RD+单片机作为主控核心,由DS1302时钟芯片提供时钟、12864点阵液晶显示屏显示。
STC90C516RD+单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。
此外,该电子万年历还具有时间校准等功能。
在软件方面,主要包括日历程序、时间调整程序,显示程序等。
所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,进行下载调试。
论文主要研究了液晶显示器及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件相互之间通信,对数种硬件连接方案进行了详尽的比较,在软件方面对日历算法也进行了论述。
基于DS18b20、DS1302的单片机测温与时钟显示系统

o I T论坛o
S IN E&T C I L GYI F MA I CE C Et NO O OR TON N
20 0 9年
第 3 期 1
基于 D 1b 0D 10 S 8 2 、 S 3 2的单片机 测温 与时钟显 示 系统
周诗虎 ( 汉职 业 技术 学院计 算机 系 湖北 武 武汉 40 7 3 0 4)
【 摘 要 】 糸统 采 用AT 9 5 本 8 S2单 片 机 和 DS 8 2 、 10 1b 0DS3 2配合 , 完成 实 时 温度 检 测 和 时 间 日期 显 示 。 并 由 本人 制作 完 成 了样 机 。 系统 中 还有一块 6 4点 阵 L D 显 示屏 , 以 显 示 系统 中所 需 的符 号 和 简单 汉 字 , 能 滚 动 显 英 文 字 幕 。 另 外 系统 中还 装 有 一 个 3 3矩 阵键 盘 , 于 系 E 用 并 * 用
统 操 作 与 控 制 。 并 接 一 个 直 流 蜂 呜 器 和 一 个 交 流 蜂 呜 器 , 以进 行 音 响提 示和 播 放 音 乐 。 用
【 键 词 】 片 机 ; 1b 0 DS 3 2 显 示 屏 ; 呜 器 ; 阵键 盘 关 单 DS8 2 ; 10 ; 蜂 矩
只 * 本 系 统 采 用 A 8 S 2单 片 机 和 D 16 0 D 10 T 95 S 8 2 、 S 3 2配 合 , 完成 实 时 检 测 。温 度 显 示 时 若 想 返 回时 钟 功 能 , 需 按 3 3矩 阵 键 盘 的任 一键 温 度 检 测 和 时 间 日期 显 示 。系 统 配 置 包 括 : 1 一 块 6 () 4点 阵 L D 显 示 或 者 系 统 复 位 键 即 可 。 E 屏 .用 以显 示 系统 中所 需 的符 号 和 简 单 汉 字 ,并 能 滚 动 显 英 文 字 幕 。 2 系统 所 用 主 要 芯 片 介 绍 . ( ) 个 3 3矩 阵 键 盘 , 于 系 统 操 作 与 控 制 。( ) 个 L D 七 段 数 码 2一 * 用 3六 E 系 统 中所 使 用 的 单 片 机 是 美 国 A m l 司生 产 的 A 8 S 2 te公 T 9 5 。它是 显 示 管 . 于显 示 温度 、 间 、 用 时 日期 等 。 4 一 个 直 流 蜂 呜 器 和 一 个 交 流 ()
12864可调实时时钟+18B20

#include<reg52.h>#include<intrins.h>sbit SCLK=P3^7;sbit IO=P3^6;sbit CE=P3^5;sbit DQ = P3^4;sbit FM=P2^7;sbit RS=P2^3;sbit RW=P2^4;sbit EN=P2^5;sbit PSB=P2^2;sbit key=P1^0;sbit key1=P1^1;sbit key2=P1^2;sbit key3=P1^3;#define uchar unsigned char#define uint unsigned intuchar S1num,flag,second,minute,hour,week,day,month,year; bit keyflag=0;uchar num1[]="王厚谊加油";uchar num2[]="世上无难事";uchar num3[]="只要肯攀登";void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay_us(){_nop_();_nop_();_nop_();_nop_();void fs_FM(){FM=0;delay(20);FM=1;}/*************************************************12864程序*************************************************/ void write_12864com(uchar com){RS=0;RW=0;P0=com;delay(5);EN=1;delay(5);EN=0;}void write_12864dat(uchar dat){RS=1;RW=0;P0=dat;delay(5);EN=1;delay(5);EN=0;}void write_12864(uchar add,uchar dat){write_12864com(add);write_12864dat(dat);}void Write_zfc(uchar *p){while(*p!=0)write_12864dat(*p++);}void init_12864(){PSB=1;write_12864com(0x30);delay(5);write_12864com(0x0f);delay(5);write_12864com(0x01);delay(5);// write_12864(0x81,'20');}void disp(){write_12864com(0x80);Write_zfc("日期:");write_12864com(0x90);Write_zfc("时间:");write_12864com(0x88);Write_zfc("星期:");write_12864com(0x98);Write_zfc("温度:");write_12864(0x84,'-');write_12864(0x86,'-');write_12864(0x94,':');write_12864(0x96,':');}void disp0(){uchar i;write_12864com(0x81);for(i=0;i<10;i++){write_12864dat(num1[i]);delay(4);}}void disp1()uchar i;write_12864com(0x91);for(i=0;i<10;i++){write_12864dat(num2[i]);delay(4);}}void disp2(){uchar i;write_12864com(0x89);for(i=0;i<10;i++){write_12864dat(num3[i]);delay(4);}}/***************************************************1302程序****************************************************/ void write_1302byte(uchar dat){uchar i;SCLK=0;delay_us();for(i=8;i>0;i--){IO=dat&0x01;delay_us();SCLK=1;delay_us();SCLK=0;dat>>=1;}}uchar read_1302byte(){uchar i,dat;delay_us();for(i=8;i>0;i--){dat>>=1;if(IO==1){dat|=0x80;}SCLK=1;delay_us();SCLK=0;delay_us();}return dat;}void write_1302(uchar add,uchar dat) {CE=0;delay_us();SCLK=0;delay_us();CE=1;write_1302byte(add);delay_us();write_1302byte(dat);delay_us();CE=0;}uchar read_1302add(uchar add){uchar timedat;CE=0;_nop_();SCLK=0;_nop_();CE=1;write_1302byte(add);timedat=read_1302byte();SCLK=1;_nop_();CE=0;return timedat;}void init_1302(){flag=read_1302add(0x81);if(flag&0x80){write_1302(0x8e,0x00);write_1302(0x80,((55/10)<<4|(55%10)));write_1302(0x82,((59/10)<<4|(59%10)));write_1302(0x84,((23/10)<<4|(23%10)));write_1302(0x86,((31/10)<<4|(31%10)));write_1302(0x88,((12/10)<<4|(12%10)));write_1302(0x8a,((2/10)<<4|(2%10)));write_1302(0x8c,((12/10)<<4|(12%10)));write_1302(0x90,0xa5);write_1302(0x8e,0x80);}}uchar readsecond(){uchar dat;dat=read_1302add(0x81);second=((dat&0x70)>>4)*10+(dat&0x0f);return second;}uchar readminute(){uchar dat;dat=read_1302add(0x83);minute=((dat&0x70)>>4)*10+(dat&0x0f);return minute;}uchar readhour(){uchar dat;dat=read_1302add(0x85);hour=((dat&0x70)>>4)*10+(dat&0x0f);return hour;}uchar readday()uchar dat;dat=read_1302add(0x87);day=((dat&0x70)>>4)*10+(dat&0x0f);return day;}uchar readmonth(){uchar dat;dat=read_1302add(0x89);month=((dat&0x70)>>4)*10+(dat&0x0f);return month;}uchar readweek(){uchar dat;dat=read_1302add(0x8b);week=((dat&0x70)>>4)*10+(dat&0x0f);return week;}uchar readyear(){uchar dat;dat=read_1302add(0x8d);year=((dat&0xf0)>>4)*10+(dat&0x0f);return year;}void write_second(){uchar shi,ge;shi=second/10;ge=second%10;write_12864com(0x97);write_12864dat(0x30+shi);write_12864dat(0x30+ge);}void write_minute(){uchar shi,ge;shi=minute/10;ge=minute%10;write_12864com(0x95);write_12864dat(0x30+shi);write_12864dat(0x30+ge); }void write_hour(){uchar shi,ge;shi=hour/10;ge=hour%10;write_12864com(0x93);write_12864dat(0x30+shi);write_12864dat(0x30+ge); }void write_day(){uchar shi,ge;shi=day/10;ge=day%10;write_12864com(0x87);write_12864dat(0x30+shi);write_12864dat(0x30+ge); }void write_month(){uchar shi,ge;shi=month/10;ge=month%10;write_12864com(0x85);write_12864dat(0x30+shi);write_12864dat(0x30+ge); }void write_year(){uchar shi,ge;shi=year/10;ge=year%10;write_12864com(0x83);write_12864dat(0x30+shi);write_12864dat(0x30+ge);}void write_week(){write_12864com(0x8b);write_12864dat(0x30+week);}/*****************************************************按键程序*****************************************************/ void keycan(){if(key==0){delay(5);if(key==0){S1num++;while(!key);fs_FM();switch(S1num){case 1:keyflag=1;write_1302(0x8e,0x00);write_1302(0x80,0x80);write_12864com(0x97);write_12864com(0x0f);break;case 2:write_12864com(0x95);break;case 3:write_12864com(0x93);break;case 4:write_12864com(0x87);break;case 5:write_12864com(0x85);break;case 6:write_12864com(0x83);break;case 7:write_12864com(0x8b);break;case 8:S1num=0;keyflag=0;write_12864com(0x0c);write_1302(0x80,0x00);write_1302(0x80,(second/10)<<4|second%10);write_1302(0x82,(minute/10)<<4|minute%10);write_1302(0x84,(hour/10<<4)|hour%10);write_1302(0x86,(day/10<<4)|day%10);write_1302(0x88,(month/10<<4)|month%10);write_1302(0x8a,(week/10<<4)|week%10);write_1302(0x8c,(year/10<<4)|year%10);write_1302(0x8e,0x80);break;}}}if(S1num!=0){if(key1==0){delay(5);while(!key1);fs_FM();switch(S1num){case 1:second++;if(second==60)second=0;write_second();write_12864com(0x97);break;case 2:minute++;if(minute==60)minute=0;write_minute();write_12864com(0x95);break;case 3:hour++;if(hour==24)hour=0;write_hour();write_12864com(0x93);break;case 4:day++;if(day==32)day=1;write_day();write_12864com(0x87);break;case 5:month++;if(month==13)month=1;write_month();write_12864com(0x85);break;case 6:year++;if(year==99)year=0;write_year();write_12864com(0x83);break;case 7:week++;if(week==8)week=1;write_week();write_12864com(0x8b);break;}}}if(S1num!=0){if(key2==0){delay(5);while(!key2);fs_FM();switch(S1num){case 1:second--;if(second==-1)second=59;write_second();write_12864com(0x97);break;case 2:minute--;if(minute==-1)minute=59;write_minute();write_12864com(0x95);break;case 3:hour--;if(hour==-1)hour=23;write_hour();write_12864com(0x93);break;case 4:day--;if(day==0)day=31;write_day();write_12864com(0x87);break;case 5:month--;if(month==0)month=12;write_month();write_12864com(0x85);break;case 6:year--;if(year==-1)year=99;write_year();write_12864com(0x83);break;case 7:week--;if(week==0)week=7;write_week();write_12864com(0x8b);break;}}}}/*****************************************************18B20程序*******************************************************/uint temp; //温度值variable of temperaturevoid delay2(unsigned char i) //延时函数{while(--i);}void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command{DQ = 1; //DQ复位,不要也可行。
18B20温度加ds1302时钟数码管显示,三按钮控制设置

}
}
if(shezhi==2)//分钟设置
{
if(sb2==0)//加控制
{
delay(30);
if(sb2==0)
{
x5=0;
a1=(shijian[1]&0x7f)>>4;
a2=shijian[1]&0x0f;
}
void wendu()//温度读取时序
{
unsigned char x,y,w,e,r;
fuwei();
wdxiesj(0xcc);
wdxiesj(0x44);
delay(1);
fuwei();
wdxiesj(0xcc);
wdxiesj(0xbe);
w=wddsj();//温度高四位,
{
uchar i;
rst=0;
write_1302(0x8e);
write_1302(0x00);
rst=0;
write_1302(0x90);
write_1302(0x5a);
rst=0;
write_1302(0xbe);
for(i=0;i<7;i++)
write_1302(shijian[i]);//时间写入
TR0=1;
}
void xianshi1()//小时显示
{
if(((shijian[2]&0x7f)>>4)!=0) shuma((shijian[2]&0x7f)>>4,0x7f);
shuma(shijian[2]&0x0f,0xbf);
LCD12864液晶屏-DS1302时钟日历-DS18B20测温度智能消毒擦鞋鞋柜C程序

一个能消毒、烘干、擦鞋的智能鞋柜控制器,LCD12864显示菜单,像塞班手机那样,过会儿无按键操作屏幕背景灯变暗,用的是有字库的屏,因为显示了图片,在清屏时图片和字库的命令有冲突,后来干脆汉字也用字模软件取的,因为我是新手,学习方向也不在屏上,就没花太多时间研究图片和字库里的字同时清屏,DS1302显示时间,掉电存储运行状态,这个芯片不很精确,过阵子需要手动对时间,DS18B20测温度,单片机用的STC12C5A60S2,菜单图片都要存到单片机里就用了个大容量的,外中断0接红外对射开关,用于检测是否有脚伸到擦鞋机下面,是否启动擦鞋机电机。
功能很简单,知识点主要涉及LCD1286D 的打点、菜单显示,DS1302的EEPROM存储、日期运算等,没写H文件,都在main程序,没看门狗,没通信,基本的入门的东西,就是有点长,给各位有需要的分享下,程序写的不好,但是肯定能用,给个财富值吧,我都经常下别人的东西三五个下载券,都没分了,正郁闷呢。
下面上程序,带软开关的,其实软开关也不是这样做的,我只是想实现下能按了开关才启动的这个动作,要是不想用开关,就是一上电就启动的话,就把开关按键去掉,key-table那个结构体里开关索引去掉,主函数了相应去掉相关行程序。
/******************************************************************************** 描述: ** 数据p0,控制p2 ********************************************************************** ***********/#include <stc12c5a60s2.h>#include <intrins.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define uchar unsigned char#define uint unsigned int/************* 12864LCD\ds18B20\ds1302引脚定义*************/sbit rs = P2^7; //寄存器选择输入sbit rw = P2^6; //液晶读/写控制sbit e = P2^5; //液晶使能控制sbit CLK=P2^4; //时钟sbit SDA=P2^3; //数据sbit RST=P2^2;// ds1302复位sbit DQ=P2^1; //温度传感器ds18B20数据口sbit beiguang=P2^0; //LCD12864背光开关sbit k0=P3^2; //外部中断0sbit k7=P1^0; //按键开关,之前是6543210sbit k1=P1^1; //按键1-6,确定,左,右,上,下,返回sbit k2=P1^2;sbit k3=P1^3;sbit k4=P1^4;sbit k5=P1^5;sbit k6=P1^6;sbit di=P1^7; //P1口的第八脚,做负极用sbit xiaodu=P3^3; //臭氧发生器sbit ptc=P3^5; //PTC加热片sbit fengshan=P3^4; //风扇sbit choushi=P3^6; //风扇sbit caxieji=P3^7; //擦鞋机电机uchar caidan_f=0; //判断哪个界面,用以判断是否显示时间uchar renwu_f=0; //判断功能uchar zhuangtai_f=0; //判断状态bit yuyue_f=0; //预约标志uchar dianyuan=0;uchar dianyuancishu=0;uchar zuoyou=1;bit shijian_f;uchar cishu=0; // 预约模式下的运行次数(运行几轮)uchar a1,a2,i;uint a3,a4,a5,s=0,y=0,bei=0,jiesuo=0,ca=0; //时间变量int t0,t; //温度uchar b1,b2,b3,b4; //预约模式下时间参数的过度参数charcanshu[40]={0,7,3,0,1,0,3,0,0,8,1,0,3,0,2,5,0,8,3,5,0,0,0,7,0,0,1,0,0,0,0,8,0,1,1,0,1,0,1 ,0};//运行时间参数初值uchar code write_rtc_ram_address[20]={0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xd e,0xe0,0xe2,0xe4,0xe6}; //读时间参数地址uchar code read_rtc_ram_address[20]={0xc1,0xc3,0xc5,0xc7,0xc9,0xcb,0xcd,0xcf,0xd1,0xd3,0xd5,0xd7,0xd9,0xdb,0xdd,0x df,0xe1,0xe3,0xe5,0xe7}; //读时间参数地址char date[7]={0,53,0,27,7,0,14};//秒分时日月周年14-7-27 0:53:0uchar code write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //miao分时日月zhou年最低位读写位uchar code read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};uchar code shuzi[] ={0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00, 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00, 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00, 0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00, 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00, 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00, 0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00, 0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00, 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00, 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00, 0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE 7,0xFF,0xFF,0xFF,0xFF,0xEF,0x8F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF ,0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xFB,0xFB,0xF7,0xEF,0xDF,0xBD,0x81,0 xFF,0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xFB,0xE7,0xFB,0xFD,0xFD,0xBD,0xBB,0xC7, 0xFF,0xFF,0xFF,0xFF,0xFB,0xF3,0xEB,0xDB,0xDB,0xBB,0xBB,0x81,0xFB,0xFB,0xE1, 0xFF,0xFF,0xFF,0xFF,0x81,0xBF,0xBF,0xBF,0xA7,0x9B,0xFD,0xFD,0xBD,0xBB,0xC7,0 xFF,0xFF,0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7, 0xFF,0xFF,0xFF,0xFF,0x81,0xBB,0xBB,0xF7,0xF7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xF F,0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC 3,0xFF,0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7 ,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, };uchar code photo1[] ={/*-- 调入了一幅图像:E:\电子实验室\鞋柜控制器显示图片\节能自动11改动.bmp --*//*-- 宽度x高度=128x49 --*/0x00,0x20,0x00,0x81,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x04,0x00,0x04,0 x20,0x0C,0x24,0x0F,0xFD,0x00,0x01,0x06,0xFC,0x0C,0xFC,0x80,0x01,0x04,0x00,0x04 ,0x20,0x20,0x00,0x68,0x07,0xF1,0x00,0x01,0x08,0x04,0x12,0x78,0x80,0x01,0x1F,0xBC,0x1E, 0xF8,0x01,0x30,0x00,0x81,0x03,0x01,0x09,0xE4,0x14,0x48,0x83,0x01,0x04,0xA4,0x04,0 x28,0x1A,0xFC,0x1F,0xFD,0x03,0xC1,0x09,0x24,0x18,0x78,0x83,0xC1,0x04,0xA4,0x0 4,0x28,0x0A,0x84,0x00,0x01,0x7F,0xF1,0x09,0x24,0x14,0x00,0xBF,0xF1,0x04,0xA4,0x06, 0x28,0x02,0xFC,0x07,0xF9,0x7F,0xFD,0x09,0xE4,0x12,0xFE,0xBF,0xFD,0x04,0xA4,0x1 C,0xA8,0x04,0x84,0x04,0x91,0x7F,0xF1,0x09,0x24,0x13,0x02,0xBF,0xF1,0x04,0xA4,0x14, 0x48,0x04,0x84,0x0F,0xFD,0x03,0xC1,0x09,0x24,0x17,0x8A,0x83,0xC1,0x04,0xA4,0x04 ,0xAC,0x1C,0xFC,0x04,0x11,0x03,0x01,0x09,0xE4,0x1D,0x52,0x83,0x01,0x09,0xA4,0x0 D,0x06,0x08,0x84,0x04,0x91,0x00,0x01,0x09,0x24,0x19,0xFE,0x80,0x01,0x09,0x24,0x00,0 x00,0x08,0x84,0x0F,0xFD,0x00,0x01,0x08,0x04,0x11,0x22,0x80,0x01,0x09,0x3C,0x0A, 0x48,0x08,0x84,0x00,0x11,0x00,0x01,0x08,0x04,0x11,0x22,0x80,0x01,0x11,0x24,0x09,0 x24,0x08,0x9C,0x00,0x31,0x00,0x01,0x08,0x0C,0x11,0x06,0x80,0x01,0x23,0x00,0x09,0 x24,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0 x00,0x00,0x00,0x03,0xE1,0x00,0x01,0x00,0x00,0x03,0xE0,0x80,0x7D,0x00,0x00,0x03, 0xE0,0x00,0x00,0x02,0x21,0x00,0x01,0x00,0x00,0x02,0x20,0x80,0xFD,0x00,0x00,0x02,0 x20,0x00,0x00,0x02,0x21,0x00,0x01,0x00,0x00,0x02,0x20,0x81,0xE1,0x00,0x00,0x02,0 x20,0x00,0x00,0x04,0x11,0x01,0x81,0x00,0x00,0x04,0x10,0x81,0xC1,0x00,0x00,0x04,0 x10,0x00,0x00,0x04,0x19,0x07,0x81,0x00,0x00,0x0C,0x18,0x87,0xF1,0x00,0x00,0x08,0 x18,0x00,0x00,0x08,0x0F,0x1F,0xE1,0x00,0x00,0x08,0x0E,0x87,0xF1,0x00,0x00,0x08,0 x0E,0x00,0x00,0x13,0xF5,0x7F,0xF9,0x00,0x00,0x13,0xF4,0x83,0xE1,0x00,0x00,0x13,0 xF4,x10,0x00,0x00,0x01,0x11,0x07,0x9D,0x00,0x00,0x01,0x10,0x83,0xE1,0x00,0x00,0x01,0 x10,0x00,0x00,0x01,0x11,0x01,0x8D,0x00,0x00,0x01,0x10,0x81,0xC1,0x00,0x00,0x01,0 x10,0x00,0x00,0x02,0x11,0x00,0x0D,0x00,0x00,0x02,0x10,0x81,0xC1,0x00,0x00,0x02,0 x10,0x00,0x00,0x02,0x11,0x00,0x0D,0x00,0x00,0x02,0x10,0x80,0x81,0x00,0x00,0x02,0 x10,0x00,0x00,0x04,0x11,0x00,0x0D,0x00,0x00,0x04,0x10,0x80,0x81,0x00,0x00,0x04,0 x10,0x00,0x00,0x08,0x31,0x00,0x01,0x00,0x00,0x08,0x30,0x80,0x01,0x00,0x00,0x08,0 x30,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x84,0x20,0x00,0x00,0x00,0 x00,0x04,0x20,0x19,0xF8,0x00,0x00,0x03,0xE0,0x40,0x00,0x84,0x20,0x00,0x00,0x03,0 xE0,0x04,0x20,0x09,0x08,0x00,0x00,0x02,0x20,0x40,0x00,0x8F,0xBC,0x00,0x00,0x02,0 x20,0x1E,0x20,0x01,0x08,0x00,0x00,0x02,0x20,0x40,0x00,0x8A,0x48,0x00,0x00,0x02,0 x20,0x05,0xFC,0x01,0xF8,0x00,0x00,0x04,0x10,0x40,0x60,0x92,0x48,0x00,0x00,0x04,0 x10,0x05,0x24,0x35,0x08,0x00,0x00,0x04,0x18,0x41,0xE0,0x80,0x80,0x00,0x00,0x08,0 x18,0x05,0x24,0x15,0xF8,0x00,0x00,0x08,0x0E,0x47,0xFE,0x87,0xF8,0x00,0x00,0x08, 0x0E,0x05,0x24,0x04,0x90,0x00,0x00,0x13,0xF4,0x5F,0xFE,0x80,0x80,0x00,0x00,0x13,0 xF4,0x1D,0x24,0x0A,0x92,0x00,0x00,0x01,0x10,0x47,0xFE,0x9F,0xFC,0x00,0x00,0x01, 0x10,0x15,0xFC,0x0A,0x94,0x00,0x00,0x01,0x10,0x41,0xE0,0x80,0x10,0x00,0x00,0x01, 0x10,0x05,0x24,0x3A,0x98,0x00,0x00,0x01,0x10,0x40,0x60,0x8F,0xFC,0x00,0x00,0x01, 0x10,0x05,0x24,0x11,0x98,0x00,0x00,0x02,0x10,0x40,0x00,0x82,0x10,0x00,0x00,0x02,0 x10,0x05,0x24,0x10,0x90,0x00,0x00,0x02,0x10,0x40,0x00,0x81,0x10,0x00,0x00,0x02,0 x10,0x05,0xFC,0x10,0x90,0x00,0x00,0x04,0x10,0x40,0x00,0x81,0x10,0x00,0x00,0x04,0 x10,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0 x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,};uchar code photo2[] ={/*-- 调入了一幅图像:E:\电子实验室\鞋柜控制器显示图片\恒温自动11.bmp --*//*-- 宽度x高度=128x49 --*/0x00,0x20,0x00,0x81,0x00,0x01,0x00,0x00,0x1C,0xFE,0x80,0x04,0x04,0x00,0x00,0 x00,0x0C,0x24,0x0F,0xFD,0x00,0x01,0x06,0xFC,0x14,0x00,0x80,0x04,0x05,0xF8,0x19, 0xF0,0x04,0xA4,0x00,0x81,0x00,0x01,0x0A,0x04,0x12,0x7C,0x80,0x04,0x05,0x08,0x09, 0x10,0x00,0x68,0x07,0xF9,0x00,0x01,0x08,0x04,0x12,0x44,0x80,0x04,0x09,0x08,0x01,0 x10,0x00,0x30,0x00,0x81,0x03,0x01,0x09,0xE4,0x14,0x7C,0x80,0x04,0x09,0x08,0x31,0 xF0,0x18,0xFC,0x1F,0xFD,0x03,0xC1,0x09,0x24,0x18,0x00,0x80,0x04,0x19,0xF8,0x15, 0x10,0x0A,0x84,0x00,0x01,0x7F,0xF1,0x09,0x24,0x14,0x00,0x80,0x04,0x18,0x20,0x05,0 xF0,0x02,0xFC,0x07,0xF1,0x7F,0xFD,0x09,0xE4,0x12,0xFE,0x80,0x04,0x08,0x20,0x09, 0x10,0x02,0x84,0x04,0x91,0x7F,0xF1,0x09,0x24,0x12,0xAA,0x80,0x04,0x0B,0xFE,0x08, 0x00,0x04,0x84,0x04,0x91,0x03,0xC1,0x09,0x24,0x14,0xAA,0x80,0x04,0x08,0x20,0x0B, 0xF8,0x1C,0xFC,0x0F,0xF9,0x03,0x01,0x09,0xE4,0x14,0x92,0x80,0x04,0x08,0x70,0x32, 0xA8,0x08,0x84,0x04,0x91,0x00,0x01,0x09,0x24,0x18,0xFE,0x80,0x04,0x08,0xA8,0x12, 0xA8,0x08,0x84,0x07,0xFD,0x00,0x01,0x08,0x04,0x10,0x92,0x80,0x04,0x09,0x24,0x12,0 xA8,0x08,0x84,0x00,0x11,0x00,0x01,0x08,0x04,0x10,0x92,0x80,0x04,0x0A,0x26,0x12,0 xA8,0x08,0x8C,0x00,0x31,0x00,0x01,0x08,0x0C,0x10,0x86,0x80,0x04,0x08,0x20,0x17,0 xFC,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x00,0 x00,0x00,0x00,0x03,0xE1,0x00,0x01,0x00,0x00,0x03,0xE0,0x80,0x04,0x00,0x00,0x1F,0 xFC,0x00,0x00,0x02,0x21,0x00,0x01,0x00,0x00,0x02,0x20,0x80,0x04,0x00,0x00,0x01,0 x00,0x00,0x00,0x02,0x21,0x00,0x01,0x00,0x00,0x02,0x20,0x80,0x04,0x00,0x00,0x02,0 x20,0x00,0x00,0x04,0x11,0x01,0x81,0x00,0x00,0x04,0x10,0x80,0x04,0x00,0x00,0x04,0 x10,0x00,0x00,0x04,0x09,0x07,0x81,0x00,0x00,0x08,0x08,0x80,0x04,0x00,0x00,0x09,0 xF0,0x00,0x00,0x08,0x0F,0x1F,0xF1,0x00,0x00,0x08,0x0E,0x80,0x04,0x00,0x00,0x0E,0 x08,0x00,0x00,0x13,0xF5,0x7F,0xF9,0x00,0x00,0x13,0xF4,0x80,0x04,0x00,0x00,0x00,0 x80,0x00,0x00,0x01,0x11,0x1F,0xFD,0x00,0x00,0x01,0x10,0x80,0x04,0x00,0x00,0x00,0 x80,0x00,0x00,0x01,0x11,0x07,0x9D,0x00,0x00,0x01,0x10,0x80,0x04,0x00,0x00,0x0F,0 xF8,0x00,0x00,0x01,0x11,0x01,0x8D,0x00,0x00,0x01,0x10,0x80,0x04,0x00,0x00,0x00,0 x80,0x00,0x00,0x02,0x11,0x00,0x0D,0x00,0x00,0x02,0x10,0x80,0x04,0x00,0x00,0x00,0 x80,0x00,0x00,0x02,0x11,0x00,0x0D,0x00,0x00,0x02,0x10,0x80,0x04,0x00,0x00,0x00,0 x80,0x00,0x00,0x04,0x11,0x00,0x0D,0x00,0x00,0x04,0x10,0x80,0x04,0x00,0x00,0x1F,0 xFC,0x00,0x00,0x08,0x31,0x00,0x01,0x00,0x00,0x08,0x30,0x80,0x04,0x00,0x00,0x00,0 x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x04,0x00,0x00,0x00,0 x00,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x04,0x00,0x00,0x18,0 x00,0x04,0x20,0x19,0xF8,0x00,0x00,0x03,0xE0,0x80,0x06,0x00,0x04,0x00,0x00,0x24,0 x30,0x04,0x20,0x09,0x08,0x00,0x00,0x02,0x20,0x80,0x06,0x00,0x04,0x00,0x00,0x24,0 x4C,0x1E,0x20,0x01,0x08,0x00,0x00,0x02,0x20,0x80,0x06,0x00,0x04,0x00,0x00,0x18,0 x86,0x05,0xFC,0x01,0xF8,0x00,0x00,0x04,0x10,0x80,0x06,0x00,0x04,0x00,0x00,0x01,0 x82,0x05,0x24,0x35,0x08,0x00,0x00,0x08,0x08,0x80,0xC6,0x00,0x04,0x00,0x00,0x01,0 x00,0x05,0x24,0x15,0xF8,0x00,0x00,0x08,0x0E,0x83,0xCE,0x00,0x04,0x00,0x00,0x03, 0x00,0x05,0x24,0x04,0x90,0x00,0x00,0x13,0xF4,0x8F,0xFE,0x00,0x04,0x00,0x00,0x03,0 x00,0x1D,0xFC,0x0A,0x92,0x00,0x00,0x01,0x10,0xBF,0xFC,0x00,0x04,0x00,0x00,0x03 ,0x00,0x15,0x24,0x0A,0x94,0x00,0x00,0x01,0x10,0x8F,0xF8,0x00,0x04,0x00,0x00,0x01,0 x00,0x05,0x24,0x3A,0x98,0x00,0x00,0x01,0x10,0x83,0xC0,0x00,0x04,0x00,0x00,0x01, 0x80,0x05,0x24,0x11,0x98,0x00,0x00,0x02,0x10,0x80,0xC0,0x00,0x04,0x00,0x00,0x00,0 x82,0x05,0x24,0x10,0x90,0x00,0x00,0x02,0x10,0x80,0x00,0x00,0x04,0x00,0x00,0x00,0 xC4,0x05,0xFC,0x10,0x90,0x00,0x00,0x04,0x10,0x80,0x00,0x00,0x04,0x00,0x00,0x00,0 x78,0x0D,0x04,0x13,0xFE,0x00,0x00,0x08,0x30,0x80,0x00,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x04,0x00,0x00,0x00,0 x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,};uchar code photo3[] ={/*-- 调入了一幅图像:E:\电子实验室\鞋柜控制器显示图片\手动消毒11.bmp --*//*-- 宽度x高度=64x32 --*/0x04,0x20,0x06,0x10,0x00,0x00,0x00,0x00,0x04,0x20,0x04,0x10,0x00,0x00,0x03,0xE0,0x0F,0x7C,0x08,0x7C,0x00,0x00,0x02,0x20,0x0A,0x50,0x08,0x10,0x00,0x00,0x02,0x20,0x12,0x10,0x16,0x10,0x00,0x00,0x04,0x10,0x00,0x80,0x04,0xFE,0x00,0x00,0x04,0x08,0x07,0xF0,0x04,0x08,0x00,0x00,0x08,0x0E,0x00,0x80,0x0C,0x08,0x00,0x00,0x13,0xF4,0x1F,0xFC,0x15,0xFE,0x00,0x00,0x01,0x10,0x00,0x10,0x04,0x08,0x00,0x00,0x01,0x10,0x0F,0xFC,0x04,0xC8,0x00,0x00,0x01,0x10,0x02,0x10,0x04,0x48,0x00,0x00,0x02,0x10,0x01,0x10,0x04,0x08,0x00,0x00,0x02,0x10,0x01,0x10,0x04,0x08,0x00,0x00,0x04,0x10,0x00,0x30,0x04,0x18,0x00,0x00,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x80,0x00,0x00,0x00,0x00,0x0C,0x24,0x0F,0xFC,0x00,0x00,0x03,0xE0,0x04,0xA4,0x00,0x80,0x00,0x00,0x02,0x20,0x00,0x68,0x07,0xF0,0x00,0x00,0x02,0x20,0x00,0x30,0x00,0x80,0x00,0x00,0x04,0x10,0x18,0xFC,0x1F,0xFC,0x00,0x00,0x08,0x08,0x0A,0x84,0x00,0x00,0x00,0x00,0x08,0x0E,0x02,0xFC,0x07,0xF0,0x00,0x00,0x13,0xF4,0x04,0x84,0x04,0x90,0x00,0x00,0x01,0x10,0x04,0x84,0x0F,0xFC,0x00,0x00,0x01,0x10,0x1C,0xFC,0x04,0x10,0x00,0x00,0x01,0x10,0x08,0x84,0x04,0x90,0x00,0x00,0x02,0x10,0x08,0x84,0x0F,0xFC,0x00,0x00,0x02,0x10,0x08,0x84,0x00,0x10,0x00,0x00,0x04,0x10,0x08,0x8C,0x00,0x30,0x00,0x00,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};uchar code photo4[] ={/*-- 调入了一幅图像:E:\电子实验室\鞋柜控制器显示图片\手动加热11.bmp --*//*-- 宽度x高度=64x32 --*/0x04,0x20,0x04,0x20,0x00,0x00,0x00,0x00,0x04,0x20,0x04,0x20,0x00,0x00,0x03,0xE0,0x0F,0x7C,0x08,0xF8,0x00,0x00,0x02,0x20,0x0A,0x48,0x08,0x20,0x00,0x00,0x06,0x20,0x12,0x08,0x16,0x20,0x00,0x00,0x04,0x10,0x00,0x80,0x05,0xFC,0x00,0x00,0x08,0x08,0x07,0xF8,0x0C,0x10,0x00,0x00,0x08,0x0E,0x00,0x80,0x0C,0x10,0x00,0x00,0x13,0xF4,0x1F,0xFC,0x15,0xFE,0x00,0x00,0x01,0x10,0x00,0x10,0x04,0x10,0x00,0x00,0x01,0x10,0x0F,0xFC,0x04,0xD0,0x00,0x00,0x01,0x10,0x02,0x10,0x04,0x50,0x00,0x00,0x02,0x10,0x01,0x10,0x04,0x10,0x00,0x00,0x02,0x10,0x01,0x10,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x30,0x04,0x30,0x00,0x00,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x20,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x20,0x00,0x00,0x03,0xE0,0x04,0x00,0x04,0x20,0x00,0x00,0x02,0x20,0x1F,0xBC,0x0E,0xF8,0x00,0x00,0x06,0x20,0x04,0xA4,0x04,0x68,0x00,0x00,0x04,0x10,0x04,0xA4,0x06,0x48,0x00,0x00,0x08,0x18,0x04,0xA4,0x0C,0x48,0x00,0x00,0x08,0x0E,0x04,0xA4,0x04,0xC8,0x00,0x00,0x01,0x10,0x05,0xA4,0x04,0xAC,0x00,0x00,0x01,0x10,0x09,0x24,0x0D,0x06,0x00,0x00,0x01,0x10,0x09,0x24,0x00,0x00,0x00,0x00,0x02,0x10,0x09,0x24,0x0A,0x48,0x00,0x00,0x02,0x10,0x11,0x3C,0x09,0x24,0x00,0x00,0x04,0x10,0x23,0x24,0x09,0x24,0x00,0x00,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};uchar code photo5[] ={/*-- 调入了一幅图像:E:\电子实验室\鞋柜控制器显示图片\手动抽湿11.bmp --*//*-- 宽度x高度=64x32 --*/0x04,0x20,0x06,0x10,0x00,0x00,0x00,0x00,0x04,0x20,0x04,0x10,0x00,0x00,0x03,0xE0,0x0F,0x7C,0x08,0x78,0x00,0x00,0x02,0x20,0x0A,0x48,0x08,0x10,0x00,0x00,0x02,0x20,0x12,0x08,0x16,0x10,0x00,0x00,0x04,0x10,0x00,0x80,0x04,0xFE,0x00,0x00,0x04,0x08,0x07,0xF8,0x04,0x00,0x00,0x00,0x08,0x0E,0x00,0x80,0x0C,0x08,0x00,0x00,0x13,0xF4,0x1F,0xFC,0x15,0xFE,0x00,0x00,0x01,0x10,0x00,0x10,0x04,0x08,0x00,0x00,0x01,0x10,0x0F,0xFC,0x04,0xC8,0x00,0x00,0x01,0x10,0x02,0x10,0x04,0x48,0x00,0x00,0x02,0x10,0x01,0x10,0x04,0x08,0x00,0x00,0x02,0x10,0x01,0x10,0x04,0x08,0x00,0x00,0x04,0x10,0x00,0x30,0x04,0x18,0x00,0x00,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x19,0xF8,0x00,0x00,0x03,0xE0,0x04,0x20,0x09,0x08,0x00,0x00,0x02,0x20,0x1E,0x20,0x01,0xF8,0x00,0x00,0x02,0x20,0x05,0xFC,0x21,0x08,0x00,0x00,0x04,0x10,0x05,0x24,0x11,0xF8,0x00,0x00,0x08,0x08,0x05,0x24,0x15,0x08,0x00,0x00,0x08,0x0E,0x07,0x24,0x04,0x90,0x00,0x00,0x13,0xF0,0x1D,0xFC,0x08,0x94,0x00,0x00,0x01,0x10,0x15,0x24,0x0A,0x94,0x00,0x00,0x01,0x10,0x05,0x24,0x32,0x94,0x00,0x00,0x01,0x10,0x05,0x24,0x12,0x98,0x00,0x00,0x02,0x10,0x05,0x24,0x10,0x90,0x00,0x00,0x02,0x10,0x0D,0x04,0x07,0xFE,0x00,0x00,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};uchar code photo6[] ={/*-- 调入了一幅图像:E:\电子实验室\鞋柜控制器显示图片\预约定时11.bmp --*//*-- 宽度x高度=128x49 --*/0x08,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0xF8,0x00,0x40,0x06,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0x88,0x0F,0xFC,0x07,0xFC,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x08,0x04,0x08,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x8E,0x08,0x00,0x17,0xF8,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x1D,0x00,0x00,0x00,0x04,0x88,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0x00,0x0F,0xF8,0x04,0x88,0x1F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0xFC,0x00,0x80,0x04,0x48,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0x08,0x04,0x80,0x0F,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0x90,0x04,0xF8,0x04,0x88,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0x50,0x04,0x80,0x04,0x88,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x06,0x20,0x04,0x80,0x04,0x48,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0x30,0x08,0x80,0x07,0xFE,0x04,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x04,0xD8,0x09,0xC0,0x00,0x08,0x08,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x06,0x10,0x7C,0x00,0x38,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x01,0x20,0x02,0x00,0x00,0x80,0x00,0x20,0x08,0x50,0x00,0x40,0x00,0 x00,0x00,0x00,0x01,0x20,0x04,0x20,0x01,0x00,0x00,0x20,0x08,0x54,0x00,0x48,0x00,0 x00,0x00,0x00,0x1F,0xFE,0x05,0x2C,0x01,0x00,0x0F,0x20,0x09,0xFE,0x00,0x48,0x00, 0x00,0x00,0x00,0x01,0x20,0x08,0xB0,0x07,0xF8,0x00,0x20,0x08,0x50,0x3F,0xFC,0x00, 0x00,0x00,0x00,0x01,0x20,0x1F,0xA0,0x04,0x08,0x00,0x7C,0x3E,0xF8,0x00,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x04,0x08,0x1F,0xA4,0x08,0x88,0x00,0x40,0x00,0 x00,0x00,0x00,0x07,0xF8,0x0F,0x9E,0x07,0xF8,0x04,0x24,0x08,0xF8,0x00,0x60,0x00,0 x00,0x00,0x00,0x00,0x88,0x08,0x80,0x04,0x08,0x04,0x24,0x1C,0x88,0x1F,0xA0,0x00, 0x00,0x00,0x00,0x00,0x88,0x0F,0xA0,0x04,0x08,0x08,0x24,0x1A,0xF8,0x02,0x20,0x00, 0x00,0x00,0x00,0x00,0x88,0x08,0xA4,0x07,0xF8,0x09,0x24,0x28,0x20,0x02,0x20,0x00,0 x00,0x00,0x00,0x00,0x88,0x08,0xA8,0x04,0x08,0x11,0x24,0x2B,0xFE,0x02,0x20,0x00, 0x00,0x00,0x00,0x00,0x88,0x0F,0xB0,0x04,0x08,0x1F,0x44,0x68,0x60,0x02,0x90,0x00,0 x00,0x00,0x00,0x00,0x98,0x08,0xA0,0x04,0x08,0x00,0x44,0x08,0x50,0x07,0x10,0x00,0 x00,0x00,0x00,0x00,0x80,0x08,0xA2,0x07,0xF8,0x00,0x84,0x08,0x88,0x18,0x0A,0x00, 0x00,0x00,0x00,0x00,0x80,0x09,0xBE,0x04,0x08,0x01,0x0C,0x09,0x06,0x00,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x0C,0x78,0x06,0xFC,0x00,0x00,0x04,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x08,0x20,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x3F,0x50,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x48,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x09,0xFC,0x05,0xFE,0x00,0x00,0x14,0x84,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0C,0x40,0x04,0x10,0x00,0x00,0x24,0x02,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x40,0x0C,0x10,0x00,0x00,0x3F,0x48,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x08,0x90,0x14,0x10,0x00,0x00,0x04,0x48,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x09,0x08,0x04,0x10,0x00,0x00,0x05,0x50,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x09,0xF8,0x04,0x10,0x00,0x00,0x06,0x60,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x09,0x04,0x04,0x10,0x00,0x00,0x3C,0x40,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x04,0x10,0x00,0x00,0x04,0x40,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x32,0x00,0x04,0x10,0x00,0x00,0x04,0x44,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x04,0x70,0x00,0x00,0x04,0x7C,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,};uchar code photo7[] ={/*-- 调入了一幅图像:E:\电子实验室\鞋柜控制器显示图片\时间设置.bmp --*/ /*-- 宽度x高度=128x34 --*/0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x08,0x02,0xFC,0x00,0x00,0x00,0x1F,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x0F,0x08,0x0A,0x04,0x00,0x00,0x00,0xF8,0x97,0x80,0x00,0x00,0x20,0 x00,0x00,0x06,0x09,0x08,0x08,0x04,0x00,0x00,0x03,0x80,0x80,0xE0,0x00,0x00,0x30,0 x00,0x00,0x0E,0x09,0xFE,0x09,0xE4,0x00,0x00,0x0E,0x00,0x80,0x38,0x00,0x00,0x38, 0x00,0x00,0x1E,0x09,0x08,0x09,0x24,0x00,0x00,0x18,0x00,0x00,0x0C,0x00,0x00,0x3C, 0x00,0x00,0x3E,0x09,0x08,0x09,0x24,0x00,0x00,0x30,0x00,0x00,0x06,0x00,0x00,0x3E,0 x00,0x00,0x7E,0x0F,0x48,0x09,0xE4,0x00,0x00,0x40,0x00,0x00,0x03,0x00,0x00,0x3F,0 x00,0x00,0xFE,0x09,0x68,0x09,0x24,0x00,0x00,0xC0,0x00,0x00,0x01,0x80,0x00,0x3F,0 x80,0x01,0xFE,0x09,0x08,0x09,0x24,0x00,0x01,0x80,0x00,0x00,0x00,0x80,0x00,0x3F,0 xC0,0x03,0xFE,0x09,0x08,0x09,0xE4,0x00,0x01,0x00,0x00,0x00,0x00,0x40,0x00,0x3F,0 xE0,0x07,0xFE,0x0F,0x08,0x09,0x24,0x00,0x03,0x00,0x00,0x00,0x00,0x40,0x00,0x3F,0 xF0,0x0F,0xFE,0x09,0x08,0x08,0x04,0x00,0x03,0x00,0x00,0x00,0x00,0x60,0x00,0x3F,0 xF8,0x1F,0xFE,0x00,0x08,0x08,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x60,0x00,0x3F,0 xFC,0x3F,0xFE,0x00,0x18,0x08,0x0C,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x3F,0 xFE,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x17,0x40,0x01,0xE0,0x01,0xE0,0x00,0x3F,0 xFF,0x3F,0xFE,0x0C,0xF0,0x0F,0xFC,0x00,0x3F,0xC0,0x03,0xFC,0x00,0x20,0x00,0x3F ,0xFE,0x1F,0xFE,0x04,0x90,0x09,0x24,0x00,0x1F,0xC0,0x03,0x1F,0xC0,0x20,0x00,0x3F, 0xFC,0x0F,0xFE,0x04,0x90,0x0F,0xFC,0x00,0x1F,0x80,0x06,0x01,0xF0,0x60,0x00,0x3F,0 xF8,0x07,0xFE,0x00,0x90,0x00,0x80,0x00,0x0F,0x80,0x0E,0x00,0x38,0x40,0x00,0x3F,0 xF0,0x03,0xFE,0x00,0x8E,0x1F,0xFC,0x00,0x0F,0x80,0x1C,0x00,0x00,0xC0,0x00,0x3F, 0xE0,0x01,0xFE,0x1D,0x00,0x00,0x80,0x00,0x0F,0x00,0x18,0x00,0x00,0x80,0x00,0x3F,0 xC0,0x00,0xFE,0x05,0x00,0x07,0xF0,0x00,0x07,0x00,0x30,0x00,0x01,0x80,0x00,0x3F,0 x80,0x00,0x7E,0x04,0xF8,0x04,0x10,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x3F,0 x00,0x00,0x3E,0x04,0x08,0x07,0xF0,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x3E,0 x00,0x00,0x1E,0x04,0x50,0x04,0x10,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x00,0x3C, 0x00,0x00,0x0E,0x04,0x50,0x07,0xF0,0x00,0x02,0x00,0x00,0x80,0x38,0x00,0x00,0x38,0 x00,0x00,0x06,0x06,0x20,0x04,0x10,0x00,0x00,0x01,0x80,0x80,0xE0,0x00,0x00,0x30,0 x00,0x00,0x02,0x04,0x70,0x07,0xF0,0x00,0x00,0x00,0xF0,0x87,0x80,0x00,0x00,0x20,0 x00,0x00,0x00,0x04,0x8C,0x04,0x10,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x06,0x1F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,};uchar code photo10[] ={/*-- 文字: 分--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x80,0x0C,0x80,0x08,0x40,0x10,0x20,0x10,0x30,0x20,0x18,0x40,0x0E,0x9F,0 xE4,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x08,0x20,0x10,0xA0,0x20,0x40,0x40,0 x00,};uchar code photo11[] ={/*-- 文字: 确定--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x15 --*/0x00,0x80,0x02,0x00,0x00,0xFC,0x01,0x00,0x7C,0x88,0x3F,0xFE,0x11,0x10,0x20, 0x04,0x13,0xFC,0x40,0x08,0x21,0x24,0x1F,0xF0,0x3D,0x24,0x01,0x00,0x65,0xFC,0x11, 0x00,0xA5,0x24,0x11,0x00,0x25,0x24,0x11,0xF0,0x25,0xFC,0x11,0x00,0x3D,0x24,0x29, 0x00,0x22,0x24,0x25,0x00,0x22,0x24,0x43,0x00,0x04,0x1C,0x81,0xFC,};uchar code photo12[] ={/*-- 文字: 右键--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x15 --*/0x02,0x00,0x20,0x20,0x02,0x00,0x20,0x20,0x02,0x00,0x27,0x7C,0xFF,0xFE,0x39, 0x24,0x04,0x00,0x41,0xFE,0x04,0x00,0x7A,0x24,0x08,0x00,0xA7,0x7C,0x18,0x00,0x21, 0x20,0x2F,0xF8,0xF9,0x7C,0x48,0x08,0x25,0x20,0x88,0x08,0x23,0xFE,0x08,0x08,0x21, 0x20,0x08,0x08,0x2A,0xA0,0x0F,0xF8,0x34,0x60,0x08,0x08,0x28,0x1E};uchar code photo13[] ={/*-- 文字: 返回--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x15 --*/0x00,0x08,0x00,0x00,0x43,0xFC,0x7F,0xFC,0x22,0x00,0x40,0x04,0x32,0x00,0x40, 0x04,0x23,0xF8,0x4F,0xE4,0x02,0x08,0x48,0x24,0xE3,0x08,0x48,0x24,0x22,0x90,0x48,0 x24,0x22,0x50,0x48,0x24,0x24,0x20,0x48,0x24,0x24,0x50,0x4F,0xE4,0x28,0x88,0x40,0 x04,0x23,0x04,0x40,0x04,0x50,0x00,0x40,0x04,0x8F,0xFC,0x7F,0xFC,};uchar code photo14[] ={/*-- 文字: 解锁--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x15 --*/0x20,0x00,0x10,0x20,0x21,0xFC,0x12,0x22,0x7C,0x44,0x3D,0x24,0x88,0x44,0x20, 0xA8,0x7E,0x44,0x41,0xFC,0x4A,0x9C,0x7D,0x04,0x7F,0x08,0x91,0x04,0x4A,0x90,0x11 ,0x24,0x4A,0xFE,0xFD,0x24,0x7F,0x10,0x11,0x24,0x4A,0x10,0x11,0x24,0x4B,0xFE,0x11 ,0x44,0x4A,0x10,0x14,0x50,0x42,0x10,0x18,0x88,0x86,0x10,0x13,0x06,};uchar code photo15[] ={/*-- 文字: 节能--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x16 --*/0x04,0x20,0x20,0x40,0x04,0x20,0x30,0x40,0xFF,0xFE,0x24,0x4C,0x04,0x20,0x42, 0x70,0x04,0x20,0xFF,0x44,0x00,0x00,0x42,0x46,0x3F,0xF8,0x00,0x7C,0x02,0x08,0x7E,0 x00,0x02,0x08,0x42,0x40,0x02,0x08,0x7E,0x4C,0x02,0x08,0x42,0x70,0x02,0x28,0x7E, 0x40,0x02,0x10,0x42,0x44,0x02,0x00,0x42,0x46,0x02,0x00,0x4A,0x3C,0x02,0x00,0x44, 0x00,};uchar code photo16[] ={/*-- 文字: 自动--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x16 --*/0x01,0x00,0x00,0x20,0x01,0x80,0x00,0x20,0x02,0x00,0x7E,0x20,0x1F,0xF8,0x00,0 x20,0x10,0x08,0x00,0xFC,0x10,0x08,0xFF,0x24,0x1F,0xF8,0x10,0x24,0x10,0x08,0x10,0 x24,0x10,0x08,0x24,0x24,0x10,0x08,0x22,0x24,0x1F,0xF8,0x4F,0x44,0x10,0x08,0xFA,0 x44,0x10,0x08,0x40,0x84,0x10,0x08,0x01,0x14,0x1F,0xF8,0x02,0x08,0x10,0x08,0x00,0 x00,};uchar code photo17[] ={/*-- 文字: 模式--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x16 --*/0x20,0x90,0x00,0xA0,0x20,0x90,0x00,0x98,0x27,0xFC,0x00,0x90,0x20,0x90,0x7F,0xFC,0xFB,0xF8,0x00,0x80,0x22,0x08,0x00,0x80,0x73,0xF8,0x00,0x80,0x6A,0x08,0x3E, 0x80,0xA3,0xF8,0x08,0x40,0xA0,0x40,0x08,0x40,0x27,0xFE,0x08,0x40,0x20,0x40,0x0B, 0x20,0x20,0xA0,0x1C,0x22,0x20,0x98,0x70,0x12,0x21,0x0E,0x20,0x0A,0x26,0x04,0x00, 0x04,};uchar code photo18[] ={/*-- 文字: 恒温--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x16 --*/0x20,0x00,0x40,0x00,0x27,0xFC,0x27,0xF0,0x20,0x00,0x24,0x10,0x30,0x00,0x07,0 xF0,0xAB,0xF8,0x94,0x10,0xAA,0x08,0x54,0x10,0xA2,0x08,0x17,0xF0,0x23,0xF8,0x2 0,0x00,0x22,0x08,0x2F,0xFC,0x22,0x08,0xC9,0x24,0x23,0xF8,0x49,0x24,0x20,0x00,0x49, 0x24,0x20,0x00,0x49,0x24,0x2F,0xFE,0x49,0x24,0x20,0x00,0x5F,0xFE,0x00,0x00,0x40,0 x00,};uchar code photo19[] ={/*-- 文字: 手动--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x16 --*/0x00,0x00,0x00,0x20,0x01,0xF8,0x00,0x20,0x7F,0x00,0x7E,0x20,0x01,0x00,0x00,0 x20,0x01,0x00,0x00,0xFC,0x7F,0xFC,0xFF,0x24,0x01,0x00,0x10,0x24,0x01,0x00,0x10, 0x24,0x01,0x00,0x24,0x24,0xFF,0xFE,0x22,0x24,0x01,0x00,0x4F,0x44,0x01,0x00,0xFA, 0x44,0x01,0x00,0x40,0x84,0x01,0x00,0x01,0x14,0x05,0x00,0x02,0x08,0x02,0x00,0x00,0 x00,};uchar code photo20[] ={/*-- 文字: 消毒--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=32x16 --*/0x20,0x40,0x01,0x00,0x10,0x40,0x3F,0xFC,0x12,0x44,0x01,0x00,0x81,0x48,0x1F,0 xF8,0x49,0x50,0x01,0x00,0x4B,0xFC,0x7F,0xFE,0x12,0x04,0x00,0x00,0x12,0x04,0x1F, 0xF0,0x23,0xFC,0x11,0x10,0x22,0x04,0xFF,0xFE,0xE2,0x04,0x11,0x10,0x23,0xFC,0x10, 0x90,。
DS1302 12864lcd单片机智能闹钟日期温度程序

/****************************************************************************/ //头文件#include <AT89X52.h>#include <string.h>/*****************************************************************************/ //灯与蜂鸣器定义sbit led_b = P2^7;sbit led_r = P1^4;sbit led_g1 = P1^3;sbit led_g2 = P1^2;sbit led_g3 = P1^0;sbit led_g4 = P1^1;sbit beep = P3^1;/*****************************************************************************/ //温度传感器定义sbit DQ = P3 ^ 0;//ds18B20/*****************************************************************************/ //键盘引脚定义sbit KEY_1 = P2^3; //左上sbit KEY_2 = P2^4; //左下sbit KEY_3 = P2^6; //右上sbit KEY_4 = P2^5; //右下sbit KEY_I = P3^2; //常0/****************************************************************************/ //引脚定义sbit SID = P2^1; //数据sbit SCLK = P2^2; //时钟/*****************************************************************************/ //定义DS1302时钟接口sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)/*****************************************************************************/ //定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;/****************************************************************************/ //定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)bit w = 0; //调时标志位static unsigned char menu = 0;//定义静态小时更新用数据变量static unsigned char keys = 0;//定义静态小时更新用数据变量static unsigned char timecount = 0;//定义静态软件计数器变量/****************************************************************************/ void DelayM(unsigned int a){//延时函数1MS/次unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四川职业技术学院教务处制
题目
四川职业技术学院 毕业设计(论文)任务书
12864 指针时钟
所属系部
电子电气工程系 所属专业
电子信息工程技术
所属班级
08 级电信 1 班 指导教师
蒋从元
学生姓名
彭万春
学号
081012041003
一 毕业设计(论文)内容与要求 一、主要研究内容
1、8051单片机硬件结构。 2、C 语言程序设计基础内容。 3、单片机 C 语言程序设计的方法。 4、DS18B20温度传感器的使用方法。 5、DS1302时钟芯片的用法。 6、12864LCD 液晶屏的编程使用方法。 二、要求
四川职业技术学院
Sichuan Vocational and Technical College
毕业设计(论文)鉴定表
题目
12864 指针时钟
所属系部 电子电气工程系 所属专业 电子信息工程技术
所属班级 08 级电信一班 学 号 081012041003
学生姓名
彭万春
指导教师 蒋 从 元
起止日期
2010 年 10 月至 2010 年 12 月
单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。
1)复位电路
复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方
式。如下图所示:
2)晶振电路
晶振电路原理图如 3-2:
3-2 晶振模块原理图 选取原则:电容选取 22pF,晶振为 12MHz。 3)电源 AT89S52 单片机的供电电源是 5V 的直流电。
AT89S 52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2 个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,片上 Flash允许程序存储器在系统可编程,亦适于常规编程器。其将通用的微 处理器和Flash存储器结合在一起,特别是可反复擦写 图1.1_1
图1.1_2
方案 1: 通过单片机内部的定时器/计数器,用软件实现,直接用单片机
的定时器编程以实现时钟;
方案 2:
用专门的时钟芯片(DS1302 )实现时钟的记时,再把时间数据送入单 片机,由单片机控制显示。虽然用软件实现时钟硬件线路简单,但是程 序运行的每一步都需要时间,多一步或少一步程序都会影响记时的准确 度,对定时器定时也不是十分准确,时钟精度很低,对于我们实现所需 要的功能造成软件编程非常复杂。用专用时钟芯片硬件成本相对较高, 但它的精度很高,软件编程很简单。综上所述,选择方案 2。 2.2 单片机的选择
管脚
备选功能
P3.0 RXD
(串行输入口)
P3.1 TXD
(串行输出口)
P3.2 /INT0
(外部中断0)
P3.3 /INT1
(外部中断1)
P3.4 T0
(记时器0外部输入)
P3.5 T1
(记时器1外部输入)
P3.6 /WR
(外部数据存储器写选通)
P3.7 /RD
(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高 电平时间。
收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个 TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输 入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由 于上拉的缘故。
P3口也可作为AT89S 52的一些特殊功能口,如下表所示:
经比较,我们选择方案 2。 温度实现只能通过外部的温度传感器来实现。经上网查阅及市场考 察,DS18b20 体积小,只有 3 只脚,电路接法简单。内部含有寄存器为 我们设计实现上下限报警功能提供保障。精度为 0.5°C,也符合我们设 计的要求 。DS18B20 也是我们 通常使用的型号 ,因此温度传感器 用 DS18B20。 五、时钟温度系统总体设计 初步确定设计系统由单片机主控模块、时钟模块 ds102、测温模块 ds18b20、显示模块 12864、共 5 个模块组成,电路系统框图。 如下图所示
用热敏电阻等测温元件测出电压,再转换成对应的温度。需要比较 多的外部元件(A/D 转换)支持,且硬件电路复杂,制作成本相对较高。 方案 2:
用 DS18B20 直接测温。DS18B20 温度传感器是美国 DALLAS 半导 体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度, 并且可根据实际要求通过简单的编程实现 9~12 位的数字值读数方式。
三、引言
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标
之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、
生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着
数字化控制,智能化控制方向发展。 本设计是数据采集及处理,显示系统与单片机有效结合,本设计是
通过在“单片机原理及应用”课堂上学习的知识的综合应用,以及查阅 资料,培养一种自学的能力。并且引导一种创新的思维,把学到的知识 应用到日常生活当中。在设计的过程中,不断的学习,思考和同学间的 相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系 统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验, 充分发挥教学与实践的结合。全能提高个人系统开发的综合能力,开拓 了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。 四、方案设计及方案论证
对于单片机的选择,如果用 8031 系列,由于它没有内部 RAM,系 统又需要大量内存存储数据,因而不可用;51 系列单片机的 ROM 为 4K, 对于我们设计的系统可能有点小;52 系列单片机与 51 系列的结构一样, 而 ROM 扩大为 8K,对我们设计系统提供充足的空间进行功能的扩展。 再有 51 系列单片机与 52 系列的单片机价格差不多。因此,我们选择 52 系列的单片机。 2.3 显示系统的方案比较
(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA 将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在 FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 1.3 单片机最小系统
的 12864 液晶显示器还可以增加显示信息的可读性,用 12864 的绘图功 能即可绘制出指针时钟的框架,至于指针的转动则才用 12864 加 ds1302 同步控制,让人看起来会很方便。虽然它们在价格上差距很大,但是 1602 不能够实现我们的要求,12864.是我们唯一的选择。 2.4 温度系统方案选择 方案 1:
1.时钟温度的总体设计思路
按照系统的设计功能要求,本时钟温度系统的设计必须采用单片机
软件系统实现,用单片机的自动控制能力配合 ds1302 和 ds18b20 来控制 时钟和温度的调整显示。获得时钟温度数据信息,单片机对其进行一系
列的处理,最后通过液晶显示出来。
2、时钟温度系统方案论证 2.1 时钟系统方案选择
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存 地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平 时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的 1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是: 每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输 出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令 是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行 状态ALE 禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间, 每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有 效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器
4)EA 非/Vpp 脚 我们没有用外部扩展 ROM,因此 EA 非/Vpp 为高电平,即接+5V 电
源。 2、时钟系统电路设计 2.1 时钟芯片选择
我们采用具有涓细电流充电能力的低功耗实时时钟电路 DS1302。它 可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多 种功能。它采用主电源和备用电源双电源供电。它的工作电压范围 2.0~5.5V,在 2.2V 时,小于 300nA。它内部含有 31 个字节的静态 RAM, 可提供用户访问。
方案 1:用数码管或点阵 LED 显示。 方案 2:用液晶 1602 显示。 方案 3:用液晶 12864 显示。 时钟和温度的显示可以用数码管或 LED,而且价格便宜。但是数码 管的只能显示简单的设计的系统,与我们设计要求也不相符。有很多东 西需要显示,还是用显示功能更好的液晶显示器比较好,它能显示更多 的数据,用 1602 液晶显示数据有限,1602 不能够显示指针时钟,只能 够显示一些基本的西文字符,显示数据的可读性不好,用可以显示汉字
1、能够以指针的形式在 LCD12864上显示当前时间的小时和分钟 和秒。
2、能够以数字加汉字的形式在 LCD12864上显示当前时间的小时 和分钟和秒。
3、能够以数字加汉字的形式在 LCD12864上显示当前年月日。 4、能够以数字加汉字的形式在 LCD12864上显示当前星期。 5、时间采用时钟芯片 DS1302控制。 6、温度采用 DS18B20温度传感器检测当前温度。 7、所有功能在 LCD12864当中同步显示。 8、采用 AT89S52或者 STC89C52RC 单片机控制。
DB1820 温度采集系统
DS1320 时间采集系统
主 控 器 件 AT89S52
12864 显示系统
单片机控 制系统
指针时钟绘 制系统
六、硬件设计部分