可调时钟程序

合集下载

12864液晶电子钟具有按键可调闹钟温度显示

12864液晶电子钟具有按键可调闹钟温度显示

12864液晶电子钟具有按键可调闹钟温度显示理解才是最主要程序已全部通过硬件测试,请放心使用。

(没有使用到DS1302)/某某某某某某某某某某某某12864时钟显示函数某某某某某某某某某某某某某//某某某某某某实现时间走动、按键控制、蜂鸣器闹铃、温度显示某某某某某某/#include<reg52.h>#include<tdio.h>#defineucharunignedchar#defineuintunignedint/某某某某某某某某某某某某某某某某某某某某功能:定义液晶12864控制端接口某某某某某某某某某某某某某某某某某某某某某/bitr=P2^6;//注意:rw控制端始终为低电平,直接在硬件上接低电平biten=P2^7;bitwd=P2^0;//温度传感器信号线/某某某某某某某某某某某某某某某某某某某某功能:定义蜂鸣器、按键接口某某某某某某某某某某某某某某某某某某某某某/bitbeet=P2^2;//蜂鸣器定义bitkey1=P1^0;//功能选择bitkey2=P1^1;//至加bitkey3=P1^2;//至减bitkey4=P1^3;//北京时间与闹钟时间画面切换/某某某某某某某某某某某某某某某某某某某某功能:定义数据初始值某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/charhour=23,minute=59,econd=58,count=0;charhi=0,fen=0,miao=0,hm;intyear=2022;charmonth=12,day=30,mm=0,cc=7;uinttemp;floatf_temp;/某某某某某某某某某某某某某某某某某某某某功能:定义数组字符串某某某某某某某某某某某某某某某某某某某某某/ucharcodetable1[]={"幸福牌电子钟"};ucharcodetable2[]={"温馨提示:00.0℃"};/某某某某某某某某某某某某某某某某某某某某功能:延时函数某某某某某某某某某某某某某某某某某某某某某某某某某某某/voiddelay(uintz){uint某,y;for(某=z;某>0;某--)for(y=110;y>0;y--);}/某某某某某某某某某某某某某某某某某某某功能:蜂鸣器响应某某某某某某某某某某某某某某某某某某某某某某某/voidfengmingqi(){beet=0;delay(1);beet=1;delay(1);}理解才是最主要/某某某某某某某某某某某某某某某某某某某某功能:液晶12864读写数据某某某某某某某某某某某某某某某某某某/void某ieling_hu(ucharaa,ucharbb){if(aa==1){r=0;}if(aa==0){r=1;}P0=bb;delay(1);en=1;delay(1);en=0;delay(1);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864写入地址某某某某某某某某某某某某某某某某某某/void某ieludizhi(uchar某,uchary){witch(某){cae1:某ieling_hu(1,0某80+y);return;//return返回的意思cae2:某ieling_hu(1,0某90+y);return;cae3:某ieling_hu(1,0某88+y);return;cae4:某ieling_hu(1,0某98+y);return;}}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864写入字符串某某某某某某某某某某某某某某某某某/void某iezifuchuan(uchar某dd){while(某dd!='\0'){某ieling_hu(0,某dd++);}}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864清屏函数某某某某某某某某某某某某某某某某某某某某某/voidqingping(){某ieling_hu(1,0某01);//清屏某ieling_hu(1,0某01);//清屏某ieling_hu(1,0某01);//清屏delay(20);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864初始化指令操作某某某某某某某某某某某某某某某某某某/voidinit_12864(){某ieling_hu(1,0某30);//基本指令操作某ieling_hu(1,0某30);//基本指令操作某ieling_hu(1,0某0C);//0某0c:无光标,O某OF:光标反白显示某ieling_hu(1,0某01);//清屏理解才是最主要某ieling_hu(1,0某06);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864初始化字串显示某某某某某某某某某某某某某某某某某某/voidinit_zifu(){某ieludizhi(1,0);某iezifuchuan("欢迎使用");delay(1);某ieludizhi(2,0);某iezifuchuan("幸福牌电子钟");delay(1);某ieludizhi(3,0);某iezifuchuan("订购热线");delay(1);某ieludizhi(4,0);某iezifuchuan("Phone:0777-66914");delay(9534);qingping();某ieludizhi(1,0);某iezifuchuan(table1);delay(1);某ieludizhi(4,0);某iezifuchuan(table2);delay(1);某ieludizhi(3,5);某iezifuchuan("星期");某ieludizhi(2,2);某iezifuchuan("年月日");}/某某某某某某某某某某某某某某某某某某某功能:时间、年月日显示函数某某某某某某某某某某某某某某某某某某某某/voiddiplay(){某ieludizhi(3,0);//显示时分秒某ieling_hu(0,0某30+hour/10);某ieling_hu(0,0某30+hour%10);某ieling_hu(0,':');某ieling_hu(0,0某30+minute/10);某ieling_hu(0,0某30+minute%10);某ieling_hu(0,':');某ieling_hu(0,0某30+econd/10);某ieling_hu(0,0某30+econd%10);某ieludizhi(2,0);//显示年某ieling_hu(0,0某30+year/1000);某ieling_hu(0,0某30+year%1000/100);某ieling_hu(0,0某30+year%100/10);某ieling_hu(0,0某30+year%10);某ieludizhi(2,3);//显示月某ieling_hu(0,0某30+month/10);某ieling_hu(0,0某30+month%10);某ieludizhi(2,5);//显示日某ieling_hu(0,0某30+day/10);某ieling_hu(0,0某30+day%10);}/某某某某某某某某某某某某某某某某某某某功能:闹钟(时间、年月日)显示函数某某某某某某某某某某某某某某某某某某某某/voiddiplay1(){理解才是最主要某ieludizhi(3,0);//显示时分秒某ieling_hu(0,0某30+hi/10);某ieling_hu(0,0某30+hi%10);某ieling_hu(0,':');某ieling_hu(0,0某30+fen/10);某ieling_hu(0,0某30+fen%10);某ieling_hu(0,':');某ieling_hu(0,0某30+miao/10);某ieling_hu(0,0某30+miao%10);某ieludizhi(2,0);//显示年某ieling_hu(0,0某30+year/1000);某ieling_hu(0,0某30+year%1000/100);某ieling_hu(0,0某30+year%100/10);某ieling_hu(0,0某30+year%10);某ieludizhi(2,3);//显示月某ieling_hu(0,0某30+month/10);某ieling_hu(0,0某30+month%10);某ieludizhi(2,5);//显示日某ieling_hu(0,0某30+day/10);某ieling_hu(0,0某30+day%10);}/某某某某某某某某某某某某某某某某某某某功能:星期函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ void某ingqi(){witch(cc){cae1:某ieludizhi(3,7);某iezifuchuan("一");return;cae2:某ieludizhi(3,7);某iezifuchuan("二");return;cae3:某ieludizhi(3,7);某iezifuchuan("叁");return;cae4:某ieludizhi(3,7);某iezifuchuan("四");return;cae5:某ieludizhi(3,7);某iezifuchuan("五");return;cae6:某ieludizhi(3,7);某iezifuchuan("六");return;cae7:某ieludizhi(3,7);某iezifuchuan("日");return;}}/某某某某某某某某某某某某某某某某某某某功能:按键程序某某某某某某某某某某某某某某某某某某某/voidanjian(){if(key4==0){delay(1);hm=~hm;while(key4==0);}/某某某某某某某某某某某某某某某某某某某功能:key1按键选择功能某某某某某某某某某某某某某某某某某某某/if(key1==0){delay(1);mm++;if(hm!=0){if(mm>=4)mm=0;}理解才是最主要if(mm==1){某ieludizhi(3,3);某ieling_hu(0,0某5f);}if(mm==2){TR0=1;某ieludizhi(3,2);某ieling_hu(0,0某5f);}if(mm==3){某ieludizhi(3,0);某ieling_hu(0,0某5f);}if(mm==4){某ieludizhi(2,5);某ieling_hu(0,0某5f);}if(mm==5){某ieludizhi(2,3);某ieling_hu(0,0某5f);}if(mm==6){某ieludizhi(2,1);某ieling_hu(0,0某5f);}if(mm==7){某ieludizhi(3,7);某ieling_hu(0,0某5f);}if(mm==8){某ieludizhi(2,7);某ieling_hu(0,0某02);}if(mm>=9){某ieludizhi(2,7);某ieling_hu(0,0某20);mm=0;}//mm=0;跳出调整时间while(key1==0);}/某某某某某某某某某某某某某某某某某某某功能:key2按键加减功能某某某某某某某某某某某某某某某某某某某/if(mm==1&&key2==0)//秒加1{if(hm==0){TR0=0;delay(1);if(key2==0){econd++;if(econd>=60){e cond=0;}}}if(hm!=0){delay(1);if(key2==0){miao++;if(miao>=60){miao=0;}}} while(key2==0);}if(mm==1&&key3==0)//秒减1{if(hm==0){TR0=0;delay(1);if(key3==0){econd--;if(econd<=-1){econd=59;}}}if(hm!=0){delay(1);if(key3==0){miao--;if(miao<=-1){miao=59;}}}while(key3==0);}if(mm==2&&key2==0)//分加1{if(hm==0){delay(1);if(key2==0){minute++;if(minute>=60){minut e=0;}}}if(hm!=0){delay(1);if(key2==0){fen++;if(fen>=60){fen=0;}}}while(key2==0);}if(mm==2&&key3==0)//分减1{if(hm==0){delay(1);if(key3==0){minute--;if(minute<=-1){minute=59;}}}if(hm!=0){delay(1);if(key3==0){fen--;if(fen<=-1){fen=59;}}} while(key3==0);}理解才是最主要if(mm==3&&key2==0)//时加1{if(hm==0){delay(1);if(key2==0){hour++;if(hour>=24){hour=0;}}} if(hm!=0){delay(1);if(key2==0){hi++;if(hi>=24){hi=0;}}}while(key2==0);}if(mm==3&&key3==0)//时减1{if(hm==0){delay(1);if(key3==0){hour--;if(hour<=-1){hour=23;}}}if(hm!=0){delay(1);if(key3==0){hi--;if(hi<=-1){hi=23;}}} while(key3==0);}if(mm==4&&key2==0)//日加1{delay(1);if(key2==0){day++;if(day>=31){day=1;}}while(key2==0);}if(mm==4&&key3==0)//日减1{delay(1);if(key3==0){day--;if(day<=0){day=31;}}while(key3==0);}if(mm==5&&key2==0)//月加1 {delay(1);if(key2==0){month++;if(month>=13){month=1;}}理解才是最主要while(key2==0);}if(mm==5&&key3==0)//月减1{delay(1);if(key3==0){month--;if(month<=0){month=12;}}while(key3==0);}if(mm==6&&key2==0)//年加1{delay(1);if(key2==0){year++;}//不设置年限while(key2==0);}if(mm==6&&key3==0)//年减1{delay(1);if(key3==0){year--;}while(key3==0);}if(mm==7&&key2==0)//星期加1 {delay(1);if(key2==0){cc++;if(cc>=8){cc=1;}}while(key2==0);}if(mm==7&&key3==0)//星期减1 {delay(1);if(key3==0){cc--;if(cc==0){cc=7;}理解才是最主要}while(key3==0);}}/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某功能:18B20所有函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//某某某某某某某某某某某某某某某某某某某18B20复位,初始化函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voiddreet(void){uinti;wd=0;i=103;while(i>0)i--;wd=1;i=4;while(i>0)i--;}/某某某某某某某某某某某某某某某某某某某18B20读1位函数某某某某某某某某某某某某某某某某某某某某某某某某某某/bittempreadbit(void){uinti;bitdat;wd=0;i++;//i++起延时作用wd=1;i++;i++;dat=wd;i=8;while(i>0)i--;return(dat);}/某某某某某某某某某某某某某某某某某某某18B20读1个字节函数某某某某某某某某某某某某某某某某某某某某某某某某某某/uchartempread(void){uchari,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);理解才是最主要}/某某某某某某某某某某某某某某某某某某某18B20写一个字节数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voidtempwritebyte(uchardat){uinti;ucharj;bittetb;for(j=1;j<=8;j++){tetb=dat&0某01;dat=dat>>1;if(tetb)//写1{wd=0;i++;i++;wd=1;i=8;while(i>0)i--;}ele{wd=0;//写0i=8;while(i>0)i--;wd=1;i++;i++;}}}/某某某某某某某某某某某某某某某某某某某18B20开始获取温度并转换函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voidtempchange(void){dreet();delay(1);tempwritebyte(0某cc);//写跳过读ROM指令tempwritebyte(0某44);//写温度转换指令}/某某某某某某某某某某某某某某某某某某某18B20读取寄存器中存储的温度数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/uintget_temp(){uchara,b;dreet();delay(1);理解才是最主要tempwritebyte(0某cc);tempwritebyte(0某be);a=tempread();//读低8位b=tempread();//读高8位temp=b;temp<<=8;//两个字节组合为1个字temp=temp|a;f_temp=temp某0.0625;//温度在寄存器中为12位分辨率位0.0625°temp=f_temp某10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入f_temp=f_temp+0.05;returntemp;//temp是整型}/某某某某某某某某某某某某某某某某某某某18B20发送数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/{do{SBUF=某parr++;//发送数据while(!TI);//等待发送完成标志为1TI=0;//标志清零}while(某parr);//保持循环直到字符为'\0'}/某某某某某某某某某某某某某某某某某某某某某某某某功能:主函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(){ucharbuff[4];TMOD=0某01;//设置T0为工作方式1EA=1;ET0=1;TR0=1;//开启T0中断TH0=-50000/256;TL0=-50000%256;init_12864();init_zifu();hm=0;while(1){if(count>5&&count<18){tempchange();//开始获取温度get_temp();//读取寄存温度printf(buff,"%f",f_temp);某ieludizhi(4,5);某ieling_hu(0,0某30+temp/100);某ieling_hu(0,0某30+temp%100/10);理解才是最主要某ieling_hu(0,0某2e);某ieling_hu(0,0某30+temp%100%10);}if(hm==0)diplay();//如果hm=0显示北京时间,否则显示闹钟时间elediplay1();anjian();//按键判断某ingqi();//显示星期if(minute==59&&econd==59){fengmingqi();}//整点报时if(hi==hour&&fen==minute&&miao>=econd&&miao<=econd+3){fengmi ngqi();}//闹钟}}/某某某某某某某某某某某某某某某某某某某某某某某某功能:中断函数某某某某某某某某某某某某某某某某某某某某某某某某某某/ {TH0=-50000/256;TL0=-50000%256;count++;if(count==20){count=0;econd++;if(econd==60){econd=0;minute++;if(minute==60) {minute=0;hour++;if(hour==24){hour=0;day++;cc++;if(cc==8)cc=1; if(day==31){day=1;month++;if(month==13)理解才是最主要{month=1;year++; }}} } } } }。

基于DS1307的可调实时时钟系统设计

基于DS1307的可调实时时钟系统设计

基于DS1307的可调实时时钟系统设计
 利用实时时钟芯片DS1307 设计一个能够调节时间的实时时钟。

介绍采用I2C 总线接口实时时钟芯片DS1307 进行准确定时的设计原理,提出实时时钟芯片DS1307 与单片机接口电路的设计方法,同时给出几个典型程序实例,通过Proteus 软件进行仿真实现。

 先来说说实时时钟DS1307的使用!
 DS1307 是一款十分常用的实时时钟芯片,它可以记录年、月、日、时、分、秒等信息,提供至2100年的记录。

可使用电池供电,也就是说,即使Arduino 在断电状态下,时钟芯片仍然是在运行的。

它使用十分常用的两线式串行总线(I2C),只要两根线即可和Arduino 通信。

 接线图:
 电控单元的时钟基准通常可利用CPU 内部定时器作为时钟基准,并通过软件编程和CPU 时钟中断来构造一个软时钟。

这种方法的优点是无需额外硬件支持,但缺点是时钟的计时精度受CPU 主晶振以及与其相连的起振电容的影响而无法做到很高,因此累积误差较大。

同时在主电源掉电时为了维持时钟不停摆,系统必须由备用电源给整个CPU 供电,这将导致功耗增大。

单片机数字时钟24小时制 时间可调

单片机数字时钟24小时制 时间可调

#include<reg51.h>#define display1 0x20#define display2 0x10 //数码管1~6从左到右编号#define display3 0x08#define display4 0x04#define display5 0x02#define display6 0x01#define Uchar unsigned charUchar a,b,c,d,sec0,sec1,min0,min1,hour0,hour1;sbit set_save=P3^2; //设置并保存时间按键sbit up=P1^0; // 加sbit sel=P1^2; //选择设置的数码管sbit e=P1^3;code unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 0~9数码管显示段码code unsigned char led_point[]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; // 0~9数码管显示段码(带小数点)void delay_ms(Uchar count);void disp_time();void key_scan();void time();void up_down();//*************************1ms延时子程序 **********************void delay_ms(Uchar count){Uchar i,j;do{for(i=5;i>0;i--)for(j=98;j>0;j--);}while(--count);}//************************* 延时子程序 ********************** //************************* 主程序 **********************void main(){a=0;b=0;d=0;sec0=0;sec1=0;min0=0;min1=0;hour0=0;hour1=0;TMOD=0x01;TH0=0x3c;TL0=0xb0;EA=1;EX0=1;ET0=1;IT0=1;TR0=1;while(1) {if(b==1){key_scan();}disp_time();}}//************************* 主程序 ************************** //*************************定时器1s中断程序******************* void Timerupt() interrupt 1{ a=a+1;TH0=0x3c;TL0=0xb0;if(a==20){a=0;TH0=0x3c;TL0=0xb0;TF0=0;time();}}//*************************定时器中断程序********************** //*************************外部中断程序************************ void Interrupt() interrupt 0{b=b+1;if(b==1){ET0=0;TR0=0;e=0;}if(b==2){e=1;b=0;d=0;TH0=0x3c;TL0=0xb0;TR0=1;ET0=1;}}//*************************外部中断程序************************ //*************************键扫描程序************************** void key_scan(){if(sel==0) {delay_ms(2);}if(sel==0){if(d<6)d=d+1;else{d=0;}}while(!sel){disp_time();}if(d==1){ if(up==0){delay_ms(2);}if(up==0){if(hour1<2){hour1=hour1+1;disp_time();}else{hour1=0;disp_time();}}while(!up){disp_time();}}if(d==2){if(up==0){delay_ms(2);}if(up==0){if(hour1<2){if(hour0<9){hour0=hour0+1;disp_time();}else{hour0=0;disp_time();}}if(hour1==2){if(hour0<4){hour0=hour0+1;disp_time();} else{hour0=0;disp_time();}}}while(!up){disp_time();}}if(d==3){if(up==0){delay_ms(2);}if(up==0){if(min1<6){min1=min1+1;disp_time();}else {min1=0;disp_time();}}while(!up){disp_time();}}if(d==4){if(up==0){delay_ms(2);}if(up==0){if(min1==6){min0=0;}if(min1<6){if(min0<9){min0=min0+1;disp_time();}else {min0=0;disp_time();}}}while(!up){disp_time();}}if(d==5){if(up==0){delay_ms(2);}if(up==0){if(sec1<6){sec1=sec1+1;disp_time();}else {sec1=0;disp_time();}}while(!up){disp_time();}}if(d==6){if(up==0){delay_ms(2);}if(up==0){if(sec1==6){sec0=0;}if(sec1<6){if(sec0<9){sec0=sec0+1;disp_time();}else {sec0=0;disp_time();}}}while(!up){disp_time();}}}//*************************键扫描程序************************** //***********************显示子程序*************************** void disp_time(){P2=display1;P0=led[sec0];delay_ms(1); //显示秒个位P2=display2;P0=led[sec1];delay_ms(1); //显示秒十位P2=display3;P0=led_point[min0];delay_ms(1);//显示分个位P2=display4;P0=led[min1];delay_ms(1);//显示分十位P2=display5;P0=led_point[hour0];delay_ms(1);//显示时个位P2=display6;P0=led[hour1];delay_ms(1);//显示时十位}//*************************24小时计时*******************void time(){sec0=sec0+1;}else{if(sec0==9){sec0=0;sec1=sec1+1;}}}if(sec1==6){sec0=0;sec1=0;min0=min0+1;} }if(min0==9){ if(sec1<6){if(sec0<9){sec0=sec0+1;} else{if(sec0==9){sec0=0;sec1=sec1+1;}}}if(sec1==6){sec0=0;sec1=0;min0=0;min1=min1+1;}}}if(min1==6){sec0=0;sec1=0;min0=0;min1=0;hour0=hour0+1;}}if(hour0==9){if(min1<6){ if(min0<9){ if(sec1<6){if(sec0<9) {sec0=sec0+1;}else{if(sec0==9){sec0=0;sec1=sec1+1;}}}if(sec1==6){sec0=0;sec1=0;min0=min0+1;} }if(min0==9){ if(sec1<6){if(sec0<9){sec0=sec0+1;} else{if(sec0==9){sec0=0;sec1=sec1+1;}}}if(sec1==6){sec0=0;sec1=0;min0=0;min1=min1+1;}}}if(min1==6){sec0=0;sec1=0;min0=0;min1=0;hour0=0;hour1=hour1+1;}}}{sec0=sec0+1;}else{if(sec0==9){sec0=0;sec1=sec1+1;}}}if(sec1==6){sec0=0;sec1=0;min0=min0+1;} }if(min0==9){ if(sec1<6){if(sec0<9){sec0=sec0+1;} else{if(sec0==9){sec0=0;sec1=sec1+1;}}}if(sec1==6){sec0=0;sec1=0;min0=0;min1=min1+1;}}}if(min1==6){sec0=0;sec1=0;min0=0;min1=0;hour0=hour0+1;}}if(hour0==4){ sec0=0;sec1=0;min0=0;min1=0;hour0=0;hour1=0;} }}//*************************24小时计时******************。

51单片机C语言可调时钟(2)(1)

51单片机C语言可调时钟(2)(1)

/*这是一个真正有意义的时钟key1功能键选择可调位,短按,每按一下有一位闪烁长按闪烁不断向下一位推移key2 加键短按相应闪烁的位加1,长按连续加1;key3 减键短按相应闪烁的位减1,长按连续减一;key4 确定键按下退出调时,正常显示;*/#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0#define KEY_1 0x0e#define KEY_2 0x0d#define KEY_3 0x0b#define KEY_4 0x07#define KEY_NULL 0x0f#define KEY_PRESS 0x80#define KEY_LONG 0x40#define KEY_STATE_INIT 0#define KEY_STATE_PRESS 1#define KEY_STATE_LONG 2#define KEY_STATE_UP 3#define KEY_LONG_PERIOD 20#define KEY_CONTINUE_PERIOD 10bit set;bit dao1S=0;bit dao2MS=0;bit dao10MS;sbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit key4=P3^7;int main_flag,exit_flag,up_flag,down_flag;int tab[]={0,0,0,0,0,0};uchar weitable[]={0x01,0x02,0x04,0x08,0x10,0x20};uchar tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void nint(){ TMOD=0X01;TH0=0XF8;TL0=0XCC;TR0=1;ET0=1;}uchar KeyScan(){if(key1==0) return KEY_1;if(key2==0) return KEY_2;if(key3==0) return KEY_3;if(key4==0) return KEY_4;return KEY_NULL;}uchar GetKey(){uchar keyRetu=0,keyTemp=KEY_NULL;static uchar s_keyState=KEY_STATE_INIT,keyTime=0,keyLast=KEY_NULL;keyTemp=KeyScan();switch (s_keyState){case KEY_STA TE_INIT:if(keyTemp!=KEY_NULL){s_keyState=KEY_STA TE_PRESS;}break;case KEY_STA TE_PRESS:if(keyTemp!=KEY_NULL){s_keyState=KEY_STA TE_LONG;keyTime=0;keyLast=keyTemp;}else{s_keyState=KEY_STA TE_INIT;}break;case KEY_STA TE_LONG:if(keyTemp==KEY_NULL){s_keyState=KEY_STA TE_INIT;keyRetu=(keyLast|KEY_PRESS);}else{if(++keyTime>=KEY_LONG_PERIOD) //按下时间>1s{s_keyState=KEY_STATE_UP;keyTime=0;}}break;case KEY_STA TE_UP:if(keyTemp==KEY_NULL){s_keyState=KEY_STA TE_INIT;}else{if(++keyTime>=KEY_CONTINUE_PERIOD) //按下时间>0.5s {keyTime=0;keyRetu=(keyLast|KEY_LONG);}}break;}return keyRetu;}void updatetime(){if(dao1S){dao1S=0;if(++tab[5]==10){ tab[5]=0;if(++tab[4]==6){tab[4]=0;if(++tab[3]==10){ tab[3]=0;if(++tab[2]==6){ tab[2]=0;if(tab[0]<2){if(++tab[1]==10){ tab[1]=0;tab[0]++;}}else{ if(tab[1]==4){ tab[1]=0;tab[0]=0;}} }}}}}}void display(){ static uchar k=0;dula=1;LED=tab1[tab[k]];if(set&&((k==main_flag-1))){LED=0XFF;}dula=0;LED=0Xff;wela=1;LED=weitable[k];wela=0;if(++k>5) k=0;}void sittime(uchar hour,uchar minute,uchar second ) { uchar a1,a2,b1,b2,c1,c2;a1=hour/10;a2=hour%10;b1=minute/10;b2=minute%10;c1=second/10;c2=second%10;tab[0]=a1;tab[1]=a2;tab[2]=b1;tab[3]=b2;tab[4]=c1;tab[5]=c2;}void main(){ nint();EA=1;sittime(15,20,15);while(1){updatetime();if(dao2MS){dao2MS=0;display();}if(dao10MS){dao10MS=0;switch (GetKey()){case (KEY_1|KEY_PRESS):if(++main_flag>=7)main_flag=0;break;case (KEY_1|KEY_LONG):if(++main_flag>=7)main_flag=0;break;case (KEY_2|KEY_PRESS):switch(main_flag){case 1:{if(++tab[0]>=3)tab[0]=0;}break;case 2:{if(++tab[1]>4)tab[1]=0;}break;case 3:{if(++tab[2]>5)tab[2]=0;}break;case 4:{if(++tab[3]>9)tab[3]=0;}break;case 5:{if(++tab[4]>5)tab[4]=0;}break;case 6:if(++tab[5]>9)tab[5]=0;}break;case (KEY_2|KEY_LONG): switch(main_flag) {case 1:{if(++tab[0]>=3)tab[0]=0;}break;case 2:{if(++tab[1]>4)tab[1]=0;}break;case 3:{if(++tab[2]>5)tab[2]=0;}break;case 4:{if(++tab[3]>9)tab[3]=0;}break;case 5:{if(++tab[4]>5)tab[4]=0;}break;case 6:if(++tab[5]>9)tab[5]=0;}break;case (KEY_3|KEY_PRESS):switch(main_flag){case 1:{if(--tab[0]<0)tab[0]=2;}break;case 2:{if(--tab[1]<0)tab[1]=4;}break;case 3:{if(--tab[2]<0)tab[2]=5;}break;case 4:{if(--tab[3]<0)tab[3]=9;}break;case 5:{if(--tab[4]<0)tab[4]=5;}break;case 6:if(--tab[5]<0)tab[5]=9;}break;case (KEY_3|KEY_LONG): switch(main_flag){case 1:{if(--tab[0]<0)tab[0]=2;}break;case 2:{if(--tab[1]<0)tab[1]=4;}break;case 3:{if(--tab[2]<0)tab[2]=5;}break;case 4:{if(--tab[3]<0)tab[3]=9;}break;case 5:{if(--tab[4]<0)tab[4]=5;}break;case 6:if(--tab[5]<0)tab[5]=9;}break;case (KEY_4|KEY_PRESS):main_flag=0;display();}}}}void timer() interrupt 1{ static count=0;static count1=0;TH0=0XF8;TL0=0XCC;dao2MS=1;count++;if(++count1==10){ c ount1=0;dao10MS=1;}if(!(count%25)) set = !set;if(count==500) {count=0;dao1S=1; }}。

12864显示可调1302时钟

12864显示可调1302时钟
sbit key=P3^5; //功能键
sbit key1=P3^3; //自加“+”键
sbit key2=P3^4; //自减“-”键
uchar sum,keyflag=0; //调用时,分,秒,标志,调用键盘处理标志.
/*--------------以下为LCD12864相关函数--------------------------*/
uchar code TAB4[]={"室温: ℃"}; //第四行
/*----------------------DS1302相关声明-------------------------*/
char TAB_1302[]={ 0x00,0x40,0x09,0x10,0x07,0x00,0x12}; //秒:分:时:日:月:星期:年.
sck=1;
}
}
/**************************************************************
函数名称:uchar r_12864byte(void)
函数功能:读字节
***************************************************************/
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*------------LCD12864相关声明-----------------------------*/
#define com 0
函数名称:void c_12864busy( void )

verilog实时可调时钟代码

verilog实时可调时钟代码

module clock(clk,out,reset,cin,ocom,count,countmin,tgm,tdm,tgs,tds);output[3:0] ocom;output[7:0] out;output count,countmin;input cin,clk,reset;input tgm; //高位的分input tdm; //地位的分input tgs; //高位的秒input tds; //地位的秒reg [7:0] out_s;reg[7:0] out_min;reg[7:0] out;reg[3:0] ocom;reg[3:0] in_out;reg clk_m,clk_n;reg[1:0] select;reg count;reg countmin;integer count_clk,count_cp;always @(posedge clk)if (count_cp == 50000) //50MHZ做50000次分频,取反后得到2ms的时间begincount_cp = 0;clk_n = ~clk_n;endelsecount_cp = count_cp + 1;always @(posedge clk)if (count_clk == 25000000) //50MHZ做25000000次分频,取反后得到1s的时间begincount_clk = 0;clk_m = ~clk_m;endelsecount_clk = count_clk + 1;always @(posedge clk_n) //2ms的数码管的扫描select=select + 1;always @(select) //数码管的扫描begincase(select)2'b00 : begin ocom[3:0]=4'b1110;in_out = out_s[3:0]; end2'b01 : begin ocom[3:0]=4'b1101;in_out = out_s[7:4]; end2'b10 : begin ocom[3:0]=4'b1011;in_out = out_min[3:0]; end2'b11 : begin ocom[3:0]=4'b0111;in_out = out_min[7:4]; end endcaseendalways @(posedge clk_m)beginif(!reset) //如果reset为低电平,秒清零beginout_s <= 0;endelse if(!tds) //如果tds为低电平,秒调整beginout_s[3:0]<=out_s[3:0]+1;if(out_s[3:0]==9)out_s[3:0]<=0;endelse if(!tgs) //如果tgs为低电平,秒调整beginout_s[7:4]<=out_s[7:4]+1;if(out_s[7:4]==5)out_s[7:4]<=0;endelse if(cin) //秒计数,60进制计数器beginif(out_s[3:0]==9)beginout_s[3:0] <= 0;if(out_s[7:4]==5)out_s[7:4] <= 0;elseout_s[7:4] <= out_s[7:4]+1;endelseout_s[3:0] <= out_s[3:0]+1;endendalways @(out_s) //秒的进位if ((out_s == 8'h59) & cin)count = 1;else#1 count = 0;always @(posedge clk_m)beginif(!reset) //reset低电平,分清零beginout_min <= 0;endelse if(!tdm) //tdm低电平,分调整beginout_min[3:0]<=out_min[3:0]+1;if(out_min[3:0]==9)out_min[3:0]<=0;endelse if(!tgm) //tgm低电平,分调整beginout_min[7:4]<=out_min[7:4]+1;if(out_min[7:4]==5)out_min<=0;endelse if(count) //分计数,60进制计数器if(out_min[3:0]==9)beginout_min[3:0] <= 0;if(out_min[7:4]==5)out_min[7:4] <= 0;elseout_min[7:4] <= out_min[7:4]+1;endelseout_min[3:0] = out_min[3:0] + 1;endalways @(out_min) //分进位if ((out_min == 8'h59) & cin)countmin = 1;else#1 countmin = 0;always @(in_out) //数码管的绑定,输出响应begincase(in_out)4'b0000 : out[7:0]=8'b1001_0000;4'b0001 : out[7:0]=8'b1001_1111;4'b0010 : out[7:0]=8'b0101_1000;4'b0011 : out[7:0]=8'b0001_1001;4'b0100 : out[7:0]=8'b0001_0111;4'b0101 : out[7:0]=8'b0011_0001;4'b0110 : out[7:0]=8'b0011_0000;4'b0111 : out[7:0]=8'b1001_1101;4'b1000 : out[7:0]=8'b0001_0000;4'b1001 : out[7:0]=8'b0001_0001;default : out[7:0]=8'bx;endcaseendendmodule。

c51单片机可调时钟程序

c51单片机可调时钟程序
delay0(uint temp)
{
uint i;
for(i=0;i<temp;i++);
}
shenying()
{
for(y=0;y<250;y++)
{
P0=0x00;delay0(9);
P0=0xff;delay0(9);
}
}
jialiang()
{
if(xuanshu==1)
}
}
else if(xuanshuhi==-1)
{
shi=23;
}
}
}
delay(uint temp)
{
uint i;
for(i=0;i<temp;i++)
{
if(xuanze==0)
{
while(xuanze==0)
}
fenwei()
{
c=fen%10;P1=duanma[c];P2=weima[2];delay(100);
d=fen/10;P1=duanma[d];P2=weima[3];delay(100);
}
shiwei()
{
e=shi%10;P1=duanma[e];P2=weima[4];delay(100);
{
P1=duanma[a];P2=weima[0];delay0(100);
P1=duanma[b];P2=weima[1];delay0(100);
P1=duanma[c];P2=weima[2];delay0(100);
P1=duanma[d];P2=weima[3];delay0(100);

显示可调闹钟万年历设计

显示可调闹钟万年历设计

带温度显示可调闹钟万年历摘要本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。

系统最大的特点是体现了较强的人机交互和独立的模块化程序设计。

温度采集选用DS18B20芯片,数据显示采用1602A液晶显示模块,在第一行显示年月日、星期以及当前的状态,第二行显示温度和时间,合理的利用液晶显示区域。

51主芯片利用定时中断产生时间,控制着液晶的显示更新、温度的实时变化以及按键的读取处理,而对于闹钟,实际上就是时间里的一个嵌套程序。

时间和闹钟的值由按键调整设置,采用通用的二十四小时制。

该电路采用51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键字:万年历;温度计;闹钟;液晶显示一、方案设计与论证根据要求,系统分为四个模块进行方案设计:1.数据显示模块方案一:数据采集处理后采用六位数码管动态扫描,循环依次显示年月日(如09.01.01)、当前时间(如12.00.00)和温度星期(如+23.5_1),数码管用74LS164芯片驱动,硬件电路复杂且显示略显混乱,在软件方面,扫描部分由于要显示的数据太多而显的不清晰。

方案二:考虑到要显示的内容颇多,故运用1602A显示实时数据,第一行显示状态以及年月日星期(如S 2009—01—01 THU),第二行显示温度和实时时间(22.0C12:00:00),在处理按键设置时,第二行暂时屏蔽温度的显示而显示设置的内容。

这样虽然在程序方面多了1602A的一些初始化和读写子函数的定义,但程序的模块化却更加的清楚。

而且采用1602A LCM的液晶显示模块后不仅满足了大量数据的显示,,系统的硬件电路变的十分简单清晰明朗。

本设计采用了这种方案。

2 温度采集模块采用常用的温度采集芯片DS18B20单线数字温度传感器进行温度的采集。

C51单片机 定时器可调时钟 程序

C51单片机 定时器可调时钟 程序
void DelayMs(unsigned char t); //ms级延时
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描
void Init_Timer0(void);//定时器初始化
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
minute++;
if(minute==60)//分钟到60,小时加1
{
minute=0;
hour++;
if(hour==24)//小时到24,回零
hour=0;
}
}
}
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
break;
case 4:minute--;if(minute==255)minute=59; //分钟减1
break;
default:break;
}
if(UpdateTimeFlag==1)
{
UpdateTimeFlag=0;
TempData[0]=dofly_DuanMa[hour/10]; //时//数据的转换,因我们采用数码管0பைடு நூலகம்9的显示,将数据分开

基于DS1307的可调实时时钟系统设计

基于DS1307的可调实时时钟系统设计

21 . DS 3 7与 A 9 1的 接 口 10 T8 C5 为 了 使 A 8C 1 片 机 能 够 驱 动 D 10 T9 5 单 S 3 7芯 片 . 本 文 采 用 了 I 总 线 虚 拟 技 术 .将 单 片 机 P . 和 ℃ 26口
收 稿 日期 : 0 0 8 0 2 1 —0 — 3 修 稿 日 期 :0 0 8 5 2 1 —0 —2
示。
使 用带有 I 2 C总线接 口的高档单 片机在经 济上是 不合
算 的 . 这 种 情 况 下 . 以采 用 I 在 可 2 C总 线 虚 拟 技 术 【. l 选 J
口也 较 少 f 6 2 晶 的接 口 电路 如 图 2所 2 0液 1 1
用 普 遍 使 用 的 5 单 片机 .利 用 单 片 机 的 通 用 I 1 / O端 E l
基于 D 0 S 7的可调 实 时时钟 系统设计 1 3
陈华珍‘ . 夏 国清
( 州 大 学 华 软 软 件 学 院 电 子 系 , 州 50 9 ) 广 广 19 0
摘 要 :利 用 实时 时 钟 芯 片 DS 3 7设 计 一 个 能 够 调 节 时 间 的 实时 时 钟 。介 绍 采 用 P 总线 接 口实 10 C
阻 。此外 . 照 D uAS公 司推荐 的硬件接法 . 按 A 往往 需 要精度很 高的晶体 . 为了提高其可靠性并节约成本 . 可
将 D 10 S 37的 X 2引脚 添 加 上 拉 电阻 。从 而 可 以 克服 使
用 普 通 晶 振 时 D 10 S 3 7不 起 振 的 问 题 . 进 而 保 证 了 D 10 S 3 7的起 振 日历 时 钟 芯 片 D 1 0 S 3 7与 A 8 C 1的 T95

基于C51单片机的数字可调时钟

基于C51单片机的数字可调时钟

河南机电高等专科学校《C51程序设计》大作业设计题目:数字可调时钟班级:通技091学号:090413128姓名:成绩:2011年11月1 设计任务制作数字可调时钟,要求可以分开调节分、时、年、月、日,能够显示温度。

2电路原理图以下为protel99se画的的原理图3 系统流程图数字可调时钟分以下四个部分构成:显示部分:此次显示采用了动态扫描显示,采用74ls573进行数据锁存。

温度采集:温度采集采用了18b20采集的,18b20转化温度较快,精度高。

时钟:采用普通的ds1302芯片。

数据运算:单片机用普通的8051单片机(12M晶振)。

4 源程序/*******************************数字可调时钟*********************************/ /*******************************by:lhc****************************************/ #include<reg51.h> #define DataPort P0void delayms(unsigned char i); sbit DQ=P1^3; sbit sclk=P1^4;sbit date=P1^5; sbit rst=P1^6;sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存unsigned char time[8]={20,11,11,27,11,30,00,7}; //年 月日 时 分 秒 周 unsigned char time1[8],readtemflag;unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char code pingnian[13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31};//平年的月份天数 unsigned char code yunnian[13]= { 0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年的月份天数 unsigned char TempData[8]; //存储显示值的全局变量 void delay(unsigned char i) {while(--i); //us 延时函数}void delayms(unsigned char i) //ms 延时函数 {while(i--) { delay(245); delay(245); } }bit rest(void)//18b20重启函数{ bit k=0; DQ=1; delay(5); DQ=0; delay(150); delay(200); DQ=1; delay(40); k =DQ; delay(25); r eturn(k); }unsigned char read()//18b20读数据函数{ unsigned char i=0; unsigned char dat=0;for(i=0;i<8;i++) {DQ=0; dat>>=1; DQ=1;if(DQ) dat|=0x80; delay(25); }return (dat);}void write(unsigned char dat)//18b20写数据函数{unsigned char i=0; for(i=0;i<8;i++){ DQ = 0; DQ = dat&0x01; delay(25); DQ = 1; dat>>=1;} delay(25);}unsigned int ReadTemperature(void) //读取温度函数{ unsigned char a=0; unsigned int kk=0,b=0;LOOP:if(rest()==0){ write(0xCC); //跳过ROM w rite(0x44); //初始化温度转换delayms(20); rest();TH1=0XFa; TL1=0Xff; write(0xCC); write(0xBE); //读取温度a=read(); b=read(); b<<=8; kk=a+b; return(kk);} else goto LOOP;}void restds1302(void){sclk=0; rst=0; //ds1302重启 }void writebyte(unsigned char addr,unsigned char byte) //写入ds1302一个字节数据{ unsigned char i;rst=1;addr=addr&0xfe;for(i=0;i<8;i++){ date=addr&0x01; sclk=1; sclk=0; addr>>=1;}for(i=0;i<8;i++){ date=byte&0x01; sclk=1; sclk=0; byte>>=1;}rst=0;}unsigned char readbyte(unsigned char addr) //读取一个字节的数据{ unsigned char i,temp;rst=1; addr=addr|0x01;for(i=0;i<8;i++) //读函数{ date=addr&0x01;sclk=1; sclk=0;addr=addr>>1;}for(i=0;i<8;i++){temp=temp>>1;if(date) temp|=0x80;else temp&=0x7f; sclk=1; sclk=0;}rst=0;return temp;}void writetime(void) //调时函数{unsigned char i,tmp;for(i=0;i<8;i++){ //BCD处理tmp=time[i]/10;time1[i]=time[i]%10;time1[i]=time1[i]+tmp*16;}writebyte(0x8e,0x00);//关闭写保护writebyte(0x80,0x80);// 暂停writebyte(0x8c,time1[1]);// 年写入writebyte(0x88,time1[2]);//月写入writebyte(0x86,time1[3]);// 日写入//些时间writebyte(0x84,time1[4]);// 时写入writebyte(0x82,time1[5]);// 分写入writebyte(0x80,time1[6]);// 秒写入writebyte(0x8a,time1[7]);// 周写入//writebyte(0x80,0x00);// 秒写入writebyte(0x8e,0x80);//打开写保护}void readtime(void) //读取时间函数{ unsigned char i,tmp;time1[1]=readbyte(0x8d);// 年读time1[2]=readbyte(0x89);// 月读time1[3]=readbyte(0x87);// 日读// 读时间time1[4]=readbyte(0x85);// 时time1[5]=readbyte(0x83);// 分time1[6]=readbyte(0x81);// 秒time1[7]=readbyte(0x8b);// 周for(i=0;i<8;i++) //BCD处理{ tmp=time1[i]/16;time[i]=time1[i]%16;time[i]=time[i]+tmp*10;}}void Display(unsigned char FirstBit,unsigned char Num) //动态显示函数{ static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=WeiMa[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=TempData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0; i++;if(i==Num) i=0;}unsigned char key(void) //键盘读取函数{ unsigned char i;if(P3!=0xff){ delay(10); if(P3!=0xff){ i=P3; while(P3!=0xff) ;switch(i){case 0xfe:return 1;break;case 0xfd:return 2;break;case 0xfb:return 3;break;default:return 0;break;}}}return 0;}void T1_rest() //定时器1的初始化函数{TMOD|=0X10;TH1=0XF8;TL1=0X30;EA=1 ;ET1= 1;TR1=1;}void isr0(void) interrupt 3{static unsigned char qq;TR1=0; TH1=0XF8; TL1=0X30;Display(0,8); //送去显示qq++;if(qq==200){ qq=0,readtemflag=1; } TR1=1; }void main(){unsigned char bian=0,k=0;unsigned char num=6;unsigned int h,l,tempp,year;bit nianflag; restds1302(); writetime(); T1_rest();while(1){readtime(); year=time[1]*200;if(year%4==0&&year%100!=0||year%400==0) nianflag=1;else nianflag=0; k=key();if(k!=0){ if(k==1){ bian++;num=6; k=0; }//调节显示的内容if(bian==3) bian=0;if(k==2){ num--;if(num<4) bian=1;if(num>3) bian=0; //选着调节对象分,时,年月日if(num==0) num=6; k=0;}if(k==4&&num!=6) //调节对象(分时年月日)加一{ time[num]++;if(num==5&&time[num]==60) time[num]=0;if(num==4&&time[num]==24) time[num]=0;if(num==3&&nianflag){if(time[3]>yunnian[time[2]]) time[3]=1;}else if(num==3){ if(time[3]>pingnian[time[2]])time[3]=1;}if(num==2&&time[num]==13) time[num]=1;if(num==1&&time[num]==99) time[num]=0; k=0;}if(k==3&&num!=6) //调节对象(分时年月日)减一{ time[num]--;if(time[num]==-1&&num==5) time[num]=59;if(time[num]==-1&&num==4) time[num]=23;if(num==3&&nianflag){ if(time[3]==0) time[3]=yunnian[time[2]]; }else if(num==3){ if(time[3]==0) time[3]=pingnian[time[2]]; }if(time[num]==0&&num==2) time[num]=12;if(time[num]==-1&&num==1) time[num]=99; k=0;}if(nianflag){ if(time[3]>yunnian[time[2]]) time[3]=1;}else { if(time[3]>pingnian[time[2]]) time[3]=1; }writetime();}if(bian==0) //对时,分,秒,显示数据分离处理{TempData[0]=DuanMa[time[4]/10];TempData[1]=DuanMa[time[4]%10];TempData[2]=0x40; //加入"-"TempData[3]=DuanMa[time[5]/10];//分TempData[4]=DuanMa[time[5]%10];TempData[5]=0x40;TempData[6]=DuanMa[time[6]/10];//秒TempData[7]=DuanMa[time[6]%10];if(num!=6){ delayms(30);if(num==4){ TempData[0]=0; TempData[1]=0; delayms(30); }if(num==5){ TempData[3]=0; TempData[4]=0; delayms(30); }}}else if(bian==1) //对年月日的显示数据分离处理{ TempData[0]=DuanMa[time[1]/10]; TempData[1]=DuanMa[time[1]%10];TempData[2]=0x40;//加入"-"TempData[3]=DuanMa[time[2]/10];//月TempData[4]=DuanMa[time[2]%10];TempData[5]=0x40;TempData[6]=DuanMa[time[3]/10];//日TempData[7]=DuanMa[time[3]%10];if(num!=6){ delayms(30);if(num==1){ TempData[0]=0;TempData[1]=0;delayms(30); }if(num==2){ TempData[3]=0;TempData[4]=0;delayms(30); }if(num==3){ TempData[6]=0;TempData[7]=0;delayms(30); }}}else if(bian==2) //对温度和星期的显示数据分离处理{if( readtemflag==1){ tempp=ReadTemperature();readtemflag=0;}if(tempp&0x8000){ TempData[0]=0x40;//负号标志tempp=~tempp; tempp +=1;}elseTempData[0]=0;h=tempp>>4; l=tempp&0x0F; l=l*6/10;//小数近TempData[1]=DuanMa[(h%100)/10]; //十位温度TempData[2]=DuanMa[(h%100)%10]|0x80; //个位温度,带小数点TempData[3]=DuanMa[l];TempData[4]=0x39; TempData[5]=0;TempData[6]=DuanMa[time[7]/10];TempData[7]=DuanMa[time[7]%10];}}}参考文献【1】Brian W.Kernighan,Dennis M.Ritchie.C.程序设计语言.机械工业出版社,机械工业出版社,2004.1.【2】祁伟,杨婷.单片机C51程序设计教程与实验,北京航空航天大学出版社,2006.1. 【3】梅丽凤,郝万新.单片机原理及应用,清华大学出版社,2009.7.【4】18B20数据手册.【5】DS1302数据手册.。

设置8个闹钟时间的智能时钟

设置8个闹钟时间的智能时钟

可设置8个闹钟时间的智能时钟普通的家用时钟一般只能设置一个闹钟时间,但很多人均需为工作日、周末、早晨、午休等不同时段设置不同的闹钟时间。

如果是使用普通的闹钟,只好每次休息前重新设置,很不方便,有时甚至会出现忘记更改闹钟设置而睡过头的情况。

针对这种情况,本人利用89C51单片机设计了一款有8种闹钟设置的时钟,通过一段时间的使用,情况良好。

1、元件清单共阴极数码管8个4511七段译码芯片1片ATMEL89C51单片机1片24C08EEPROM 1片24M晶振1个9V变压器(3V A)1个LM317输出可调稳压IC 1个整流桥堆1个470uF电容1个100uF电容1个10uF电容1个0.1uF电容1个33pF电容2个蜂鸣器1个9014(或其它NPN管)8个ksp92(或其它PNP管)1个二极管2个1K欧电阻16个470欧电阻1个10K欧可调电阻1个按钮开关4个可装四节电池的电池盒1个万能板(约12CM*17CM)1块所有元件按以下的电路图焊接在一块万能板上。

注意LM317的输出应由低调高,以免烧IC。

1、电路图1、功能简介该时钟以24小时制显示时间,并可显示2000年至2049年之间的任何日期及星期,日期与时间经按键可相互切换,可输入8个闹钟时间设置,每个闹钟设置包括响铃的时间(小时与分钟)、对工作日有效还是对周末有效的标志,以及本项设置是否启用的标志等三部分。

这8个闹钟设置均保存在EEPROM中,即使掉电也不用重新输入。

当然使用者可通过按钮对任何一个设置作修改。

数码管可经按钮关闭显示,避免夜间刺眼、影响睡眠。

调节LM317输出电压,可改变数码管亮度,但电压不能低于后备电池的电压,否则后备电池供电。

用四节1.5V电池串联作后备电源,保证市电停电时时钟继续走时。

时钟的精度取决于晶振频率的精度。

2、程序清单本程序用C语言编写,经Keil C51编译成二进制码后写入89C51内的EPROM内即可。

#include "atmel\at89x51.h"#include "intrins.h"unsigned char hour,min,sec,year,month,day,weekday; //当前时间、日期、星期unsigned int count_down; //1秒钟计时用bit led_on; //数码管是否点亮的标志unsigned char display[8]; //8位数码管要显示的数据unsigned char attr; //八个数码管的闪烁控制字节,当为0时,对应数码管闪bit flash; //LED闪烁开关,与attr共同决定数码管是否闪烁unsigned char show_status; //LED显示状态标志// 0:设置闹钟数据// 1:显示当前日期及星期// 2:显示当前时间// 3:设置当前日期// 4:设置当前时间bit km; //按键已去抖动标志bit kp; //按键已处理标志bit sound; //蜂鸣器响标志bit alarm_stop; //蜂鸣器响后用户手工按停标志struct { unsigned char h; //小时unsigned char m; //分钟} alarm[8]; //8个闹钟项unsigned char alarm_en; //闹钟项启用标志unsigned char alarm_wk; //闹钟项周末启用标志unsigned char cur_alarm_set; //当前设置的闹钟项unsigned char cur_alarm_active; //当前到点的闹钟项bit new_alarm_info; //闹钟项内容已修改标志sbit sound_output = P1^5; //蜂鸣器驱动端口,输出0时蜂鸣器响sbit SDA_PIN = P1^6; //EEPROM数据线端口sbit SCL_PIN = P1^7; //EEPROM时钟线端口void I2cDelay() //EEPROM操作时需要的延时函数{ _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();}void DelayX1ms(unsigned char count) //延迟函数,参数为毫秒数{unsigned char i,j;for(i=0;i<count;i++)for(j=0;j<240;j++) ;}void Start() //I2C启动,24C08使用I2C方式{ SDA_PIN=1; I2cDelay();SCL_PIN=1; I2cDelay();SDA_PIN=0; I2cDelay();SCL_PIN=0;}void Stop() //I2C停止{ I2cDelay(); SDA_PIN=0;I2cDelay(); SCL_PIN=1;I2cDelay(); SDA_PIN=1;I2cDelay();}bit SendByte(unsigned char value) //发送1字节数据给EEPROM {unsigned char i;bit no_ack=0;for(i=0;i<8;i++) //发送8位数据{ I2cDelay();if(value&0x80) SDA_PIN=1;else SDA_PIN=0;value=value<<1;I2cDelay(); SCL_PIN=1;I2cDelay();I2cDelay(); SCL_PIN=0;}I2cDelay(); SDA_PIN=1; //确认脉冲周期,等待EEPROM的确认I2cDelay(); SCL_PIN=1;I2cDelay();if(SDA_PIN==1) no_ack=1;I2cDelay(); SCL_PIN=0;return no_ack;}void mywrite(unsigned char address,unsigned char value) //向EEPROM写1字节{ Start(); SendByte(0xa0); SendByte(address);SendByte(value); Stop(); DelayX1ms(10);}unsigned char ReadByte() //从EEPROM接收1字节{unsigned char i,bval;bval=0;for(i=0;i<8;i++) //接收8位数据{ I2cDelay();SDA_PIN=1; //从P1输入数据时,先往P1输入“1”I2cDelay(); SCL_PIN=1;I2cDelay(); bval=bval<<1; if(SDA_PIN) bval=bval|0x01;I2cDelay(); SCL_PIN=0;}I2cDelay(); SDA_PIN=1; //确认脉冲周期,不送出确认I2cDelay(); SCL_PIN=1;I2cDelay();I2cDelay();return(bval);}unsigned char myread(unsigned char address) //从EEPROM读入1字节数据{unsigned char tmp;Start(); SendByte(0xa0); SendByte(address);Start(); SendByte(0xa1); tmp=ReadByte();Stop(); DelayX1ms(2);return(tmp);}void Timer0ISR(void) interrupt 1 using 3 //定时器0中断程序,用于走时,1/8000秒一次{unsigned char tmp,tmp_days;count_down--;if(count_down==1 || count_down==2001 || count_down==4001 || count_down==6001){ flash=~flash; //数码管闪烁的开关量if(sound && flash) sound_output=0; //驱动蜂鸣器else sound_output=1; //关闭蜂鸣器return;}/***计算当前日期为星期几***/if(count_down==3000){ if(year==0) weekday=5; //2000年1月1日为星期六else { tmp=(year-1)/4+1; tmp=(year-tmp)+tmp*2;weekday=(tmp+5)%7; //计算出当前年的1月1日为星期几}tmp_days=0;for(tmp=1;tmp<month;tmp++)if(tmp==1 || tmp==3 || tmp==5 || tmp==7 || tmp==8 || tmp==10)tmp_days=tmp_days+31;else if(tmp==4 || tmp==6 || tmp==9 || tmp==11)tmp_days=tmp_days+30;else if(tmp==2){ if(year%4==0) tmp_days=tmp_days+29;else tmp_days=tmp_days+28;}tmp_days=tmp_days+day-1; weekday=(weekday+tmp_days%7)%7+1;return;}/*** 查询是否有闹钟时间项符合触发条件***/if(count_down==5000){ if((alarm_stop || sound) && alarm[cur_alarm_active].m!=min) //触发后1分钟{ alarm_stop=0; sound=0; } //自动关蜂鸣器if(sound==0 && alarm_stop==0) //没有已触发的闹钟项for(tmp=0;tmp<8;tmp++) //则查询8个闹钟项内是否有符合条件的{ if(((alarm_en>>tmp)&1)==0) continue; //该闹钟项不启用if(((alarm_wk>>tmp)&1)==1) //该闹钟项周末有效{ if(weekday!=6 && weekday!=7) continue; } //当前不是星期六或星期天else{ if(weekday==6 || weekday==7) continue; }if(alarm[tmp].h==hour && alarm[tmp].m==min) //比较当前时间与该{ sound=1; cur_alarm_active=tmp; break; } //闹钟项的时间}return;}if(count_down==0) //过了一秒钟{ count_down=8000;sec++;if(sec==60){ sec=0;min++;if(min==60){ min=0;hour++;if(hour==24){ hour=0; day++;switch(day){ case 29: if(month==2 && year%4) { day=1; month=3; }break;case 30: if(month==2 && year%4==0) { day=1; month=3; }break;case 31: if(month==4 || month==6 || month==9 || month==11){ day=1; month++; }break;case 32: day=1; month++;if(month==13) { month=1; year++; }}}}}}}void Timer1ISR(void) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;char tmp;TH1=0x15; TL1=0xa0; //每30ms中断一次/*** 当前显示的内容***/if(show_status==0) //当前正在设置闹钟项{ display[0]=cur_alarm_set; display[1]=0xf;display[2]=alarm[cur_alarm_set].h/10; display[3]=alarm[cur_alarm_set].h%10;display[4]=alarm[cur_alarm_set].m/10; display[5]=alarm[cur_alarm_set].m%10;display[6]=(alarm_wk>>cur_alarm_set)&1; display[7]=(alarm_en>>cur_alarm_set)&1;}if(show_status==1 || show_status==3) //当前显示或设置日期{ display[0]=year/10; display[1]=year%10; display[2]=month/10;display[3]=month%10; display[4]=day/10; display[5]=day%10;display[6]=0xf; display[7]=weekday;}if(show_status==2 || show_status==4) //当前显示或设置时间{ display[0]=hour/10; display[1]=hour%10; display[2]=min/10;display[3]=min%10; display[4]=sec/10; display[5]=sec%10;display[6]=0xf; display[7]=0xf; //最后两后无显示}/*** 按键扫描及处理***/keytmp=~(P1) & 0x0f;if(keytmp==0) { km=0; kp=0; }else{ if(km==0) km=1;else{ if(kp==0){ kp=1;if(keytmp==1) //第一个按钮{ if(sound) { alarm_stop=1; sound=0; } //如果闹钟正响,按此键停止else if((show_status==1 || show_status==2) && led_on) //正显示日期或时间{ show_status=0; cur_alarm_set=0; attr=0x3f; } //进入闹钟设置else if(show_status==0) //如正在设置闹钟时间项{ show_status=2; new_alarm_info=1; attr=0xff; } //返回当前时间显示return;}if(keytmp==2 && led_on) //第二个按钮,仅当数码管打开时有效{ switch(attr){ case 0xff: if(show_status==1) show_status=2; //在显示时间与日期间切换else if(show_status==2) show_status=1;break;case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;else if(show_status==3)year=(year+1)%50; //当前日期的“年”加1else if(show_status==4)hour=(hour+1)%24; //当前时间的“时”加1break;case 0xcf: if(show_status==0) //闹钟设置的“时”加1 alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;else if(show_status==3){ month++; //当前日期的“月”加1if(month==13) month=1; }else if(show_status==4)min=(min+1)%60; //当前时间的“分”加1break;case 0xf3: if(show_status==0)alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;else if(show_status==3){day++; //当前日期的“日”加1if(day==32) day=1; }else if(show_status==4){count_down=8000;sec=(sec+1)%60; } //当前时间的“秒”加1break;case 0xfd: if(show_status==0)alarm_wk^=0x1<<cur_alarm_set; //周末标志位切换break;case 0xfe: if(show_status==0)alarm_en^=0x1<<cur_alarm_set; //启用标志位切换} //end of switch(attr)return;} //end of if(keytmp==1)if(keytmp==4) //第三个按钮{ switch(attr){ case 0xff: if(show_status==1 || show_status==2)led_on=~led_on; //打开或关闭数码管显示break;case 0x3f: if(show_status==0) //如果正在设置闹钟{ if(cur_alarm_set==0) cur_alarm_set=7;else cur_alarm_set--;}else if(show_status==3) //当前日期的“年”减1{ if(year==0) year=49; else year--; }else if(show_status==4) //当前时间的“时”减1{ tmp=hour-1; if(tmp<0) hour=23; else hour=tmp; }break;case 0xcf: if(show_status==0) //闹钟设置的“时”减1{ tmp=alarm[cur_alarm_set].h-1;if(tmp<0) alarm[cur_alarm_set].h=23;else alarm[cur_alarm_set].h=tmp;}else if(show_status==3){ month--; //当前日期的“月”减1if(month==0) month=12; }else if(show_status==4){ tmp=min-1; //当前时间的“分”减1if(tmp<0) min=59; else min=tmp; }break;case 0xf3: if(show_status==0) //闹钟设置的“分钟”减1{ tmp=alarm[cur_alarm_set].m-1;if(tmp<0) alarm[cur_alarm_set].m=59;else alarm[cur_alarm_set].m=tmp;}else if(show_status==3){ day--; //当前日期的“日”减1if(day==0) day=31; }else if(show_status==4){ tmp=sec-1; //当前时间的“秒”减1count_down=8000;if(tmp<0) sec=59; else sec=tmp; }break;case 0xfd: if(show_status==0) //切换周末标志alarm_wk^=0x1<<cur_alarm_set;break;case 0xfe: if(show_status==0) //切换启用标志alarm_en^=0x1<<cur_alarm_set;} //end of switch(attr)return;} //end of if(keytmp==2)if(keytmp==8 & led_on) //第四个按钮,仅当数码管打开时有效{ switch(attr){ case 0xff: if(show_status==1) //如果当前显示日期show_status=3; //切换到调准日期状态else if(show_status==2) //如果当前显示时间show_status=4; //切换到调准时间状态attr=0x3f; break; //第一、二个数码管闪烁case 0x3f: attr=0xcf; break; //第三、四个数码管闪烁case 0xcf: attr=0xf3; break; //第五、六个数码管闪烁case 0xf3: if(show_status==0) attr=0xfd; //第七个数码管闪烁else if(show_status==3){ show_status=1; attr=0xff; } //恢复正常显示日期else if(show_status==4){ show_status=2; attr=0xff; } //恢复正常显示时间break;case 0xfd: if(show_status==0) attr=0xfe; //第八个数码管闪烁break;case 0xfe: if(show_status==0) attr=0x3f; //第一、二个数码管闪烁}} // end of if(keytmp==4)} // end of if(kp==0)} // end of if(km==0)} // end of if(keytmp!=0)}main(){unsigned char i;hour=23; min=58; sec=30; year=2; month=4; day=25;count_down=8000;flash=0; attr=0xff; led_on=1;km=0; kp=0; show_status=2; //加电后显示当前时间new_alarm_info=0; sound=0; alarm_stop=0;for(i=0;i<8;i++) //从EEPROM中读入8个闹钟设置{ alarm[i].h=myread(i*2); alarm[i].m=myread(i*2+1); }alarm_en=myread(i*2); alarm_wk=myread(i*2+1);IE=0; IP=0; //disable all interrupt and lower priorityTMOD=0x12; //timer 0 is set to mode 2,auto_reloading,timer1,mode 1TH0=6; TL0=6; //timer0 parameters for 0.125msTH1=0x15; TL1=0xa0; //timer1 parameters for 30msTR0=1; TR1=1; //timer0 interrupt most importantET0=1; ET1=1; EA=1; //enable interrupt functionwhile(1){ if(led_on)for(i=0;i<8;i++){ P2=0;if(flash || attr&(0x80>>i)){ P0=display[i]; P2=0x80>>i; DelayX1ms(1); }}else P2=0;if(new_alarm_info){ P2=0; //暂时关闭数码管new_alarm_info=0; //写入EEPROMfor(i=0;i<8;i++) { mywrite(i*2,alarm[i].h); mywrite(i*2+1,alarm[i].m); } mywrite(i*2,alarm_en); mywrite(i*2+1,alarm_wk);}}}。

万年历数字钟及可调时钟系统

万年历数字钟及可调时钟系统

uchar num=0; /*移位键移到哪个LED*/
void delay(uchar i)
{
while(i--);
}
//******************** TIMER1 interrupt process ***************************//
uchar close_date,open_date;
void RESWDI(void);
void WREN(void);
void WRDI(void);
void WRSR(void);
unsigned char RSDR(void);
void WIPCHK(void);
***************模拟I2C总线传输程序***********************************
********************************************************************/
bit ack; /*应答标志位*/
}
void WriteByte(unsigned char Byte,ADD) //向地址写入数据这里同样不做先导字处理,只能写00-FFH
{
WREN();
zlg7289_cs=1;
SCK=0;
CS=0;
SO=1;
SI=1;
OUTByte(0x2); //发送写指令02H 如要支持000-FFF则要把高位地址左移2位再为02H相或
图6 总体流程图
四、 源程序
#include <reg51.h>
#include <intrins.h>

电子时钟设计DS++可调闹钟+程序清单

电子时钟设计DS++可调闹钟+程序清单

电子时钟设计DS++可调闹钟+程序清单本文主要介绍一种新型的电子时钟设计,名为DS++可调闹钟。

这种电子时钟不仅能够显示当前日期和时间,而且其可调节的闹钟功能也十分实用。

同时,我们还提供程序清单,供各位读者借鉴学习。

1. 电子时钟设计的背景和目标电子时钟已经成为人们日常生活中不可或缺的物品之一。

在市场上,人们可以买到各种各样的电子时钟,从简单的数字显示到智能语音交互。

然而,我们常常发现,在时钟设计中,用户体验常常被忽视。

比如,有的时钟功能繁杂,使用起来困难;有的时钟质量低劣,经常出现故障。

为了解决这些问题,我们决定设计一种更为智能且易用的电子时钟,就是DS++可调闹钟。

本次电子时钟设计的目标是:1)提供准确的时间显示和日期显示;2)提供可调闹钟功能和提示功能;3)简单易用,方便用户使用。

2. DS++可调闹钟设计方案2.1 电路原理图DS++可调闹钟的电路包括微处理器、振荡器、液晶显示模块、蜂鸣器、按键等部分。

主控芯片采用AT89S52(51系列微控制器),与液晶显示模块通过IIC总线通信。

振荡器采用32.768kHz的石英晶体振荡器,保证时钟的准确性。

2.2 功能模块设计液晶显示模块的设计是优化DS++可调闹钟的关键。

我们选用了1602A型液晶显示屏,显示内容包括日期、时间和闹钟状态。

闹钟模块是DS++可调闹钟的核心模块之一,它通过可调节的闹钟时间和闹钟提示音,方便用户设置并响铃提醒。

2.3 电路调试及测试在电路设计和焊接完成后,我们需要进行电路调试和测试。

在调试过程中,我们主要测试了电子时钟的时间显示、日期显示、闹钟设置等功能。

同时,我们还测试了与之相协调的同时供电设备,比如移动电源和插座电源。

3. 程序清单DS++可调闹钟的程序基于Keil/µVision IDE的汇编语言编写。

半个时钟周期内的指令流水线技术使得程序库在嵌入式微控制器上的表现达到质的提升,且运行速度更快。

DS++可调闹钟的程序清单如下:- 初始化电路;- 显示日期、时间;- 等待用户按键;-用户按键相应操作;- 播放闹钟提示音;- 关闭闹钟。

键盘可调时钟课程设计

键盘可调时钟课程设计

显示电路
连接显示模块与微控 制器,实现时间和日 期的显示功能。
PCB布局与布线
布局规划
合理规划PCB板上的元器件布局,确保信号 传输的可靠性和稳定性。
过孔与铺铜处理
适当添加过孔和铺铜处理,提高PCB板的电 气性能和机械强度。
布线设计
根据电路设计,进行PCB布线设计,注意信 号线与电源线的分离,减少干扰。
准备测试环境
搭建符合测试要求的硬件 和软件环境,包括测试工 具、设备等。
测试数据记录与分析
记录原始数据
在测试过程中,详细记录各项指 标的原始数据,如时钟误差、响
应时间等。
数据处理
对原始数据进行处理,如计算平均 值、最大值、最小值等统计量。
结果分析
根据处理后的数据,分析时钟的性 能表现,如稳定性、精度等。
界面优化
采用图形化界面,使时钟显示更加直观,同时增加了用户操作的 便捷性。
代码规范
遵循良好的编程规范,代码结构清晰,易于维护和扩展。
经验教训分享
1 2 3
需求分析重要性
在项目开始阶段,充分进行需求分析,明确功能 需求和性能要求,有助于避免后期需求变更带来 的麻烦。
模块化设计
采用模块化设计思想,将功能划分为不同的模块 ,降低了代码的耦合度,提高了代码的可重用性 和可维护性。
性能评估指标
时钟误差
稳定性
衡量时钟准确性的重要指标,通常以 秒为单位进行计量。
评估时钟长期运行稳定性的指标,通 过观察时钟在一段时间内误差的变化 情况来衡量。
响应时间
反映时钟可调性能的关键指标,表示 从输入调整到时钟显示变化所需的时 间。
06
课程设计总结与展望
设计成果总结

可调时钟——精选推荐

可调时钟——精选推荐

/*******************************************************************功能简介:该例程为数码管显示可调钟表(无定时功能),用到开发板中矩阵键盘的上三排按键。

若要更改时钟初始值(即时钟校准,因为时钟初始值全为0),可先按下矩阵键盘中的S16键(第三排第三列),此时时钟会暂停。

然后按S6---S15中的键修改矫正当前值,S6--S15分别先后对应数字0到9。

矫正完后,按下S17(第三排最后一个),时钟可继续工作。

注意晶振需为11.0592M。

若为其他数值晶振,请合理改变TH0与TL0参数值,否则计时会有很大误差。

******************************************************************************* */#include<reg52.h>#define uchar unsigned charsbit dula=P2^6;sbit wela=P2^7;sbit beep=P2^3;unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;unsigned int pp;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(unsigned char i){for(j=i;j>0;j--)for(k=125;k>0;k--);}void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1){dula=0;P0=table[shi2];dula=1;dula=0;wela=0;P0=0xfe;wela=1;wela=0;P0=table[shi1]|0x80; dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(5);P0=table[fen2]; dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(5);P0=table[fen1]|0x80; dula=1;dula=0;P0=0xf7;wela=1;wela=0;delay(5);P0=table[miao2]; dula=1;dula=0;P0=0xef;wela=1;wela=0;delay(5);P0=table[miao1]; dula=1;dula=0;P0=0xdf;wela=1;delay(5);}void keyscan0(){P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xbb:ok=0;break;case 0x7b:ok=1;break;}}}}void keyscan(){{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xee:key=0;wei++;break;case 0xde:key=1;wei++;break;case 0xbe:key=2;wei++;break;case 0x7e:key=3;wei++;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;beep=0;}beep=1;}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xed:key=4;wei++;break;case 0xdd:key=5;wei++;break;case 0xbd:key=6;wei++;break;case 0x7d:key=7;wei++;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;beep=0;}beep=1;}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key=8;wei++;break;case 0xdb:key=9;wei++;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;beep=0;}beep=1;}}}}void main(){TMOD=0x01;TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。

四位数码管秒闪烁可调时钟

四位数码管秒闪烁可调时钟
voiddelay500usunsignedcharunsignedcharvoidtimer0interrupttimer0中断服务子程序定时时间为50ms本程序加了10us的时间修正量tmod0x01
四位数码管可调时钟(1)
/****本程序中,晶振为12MHz, ****/
/****时间控制采用定时中断控制方式。****/
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
void init();//初始化子程序声明
void delay500us(unsigned char X);//延时子程序声明
void display();//显示子程序声明
void display001();//显示子程序声明
void display002();//显示子程序声明
void keyscan();//按键识别子程序声明
while(key0==0)display();//等待按键释放。
}
if(key1==0)
{
display002();
if(key1==0)
{
min++;
if(min>=60)min=0;
while(key1==0)display002();
}
}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档