- 84.70 KB
- 2022-08-08 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
基于89c52的4位数码管闹钟,按下MODE键,切换模式;使用led灯代替蜂鸣器模式1显示当前时间模式2设定当前时间的小时数模式3设定当前时间的分钟数模式4设定闹钟时间的小时数模式5设定闹钟时间的分钟数#includesbitP27=P2M;〃定义分钟个位控制端sbitP26二P2F;〃定义分钟十位控制端sbitP25=P2A6;〃定义小时个位控制端sbitP24二P2人7;〃定义小时十位控制端sbitled=P3A7;〃定义代表秒的LED灯sbitbaojing」ed二P〃4;〃定义闹钟报警灯sbitkey0=P2A0;〃模式设置sbitkeyl=P2A1;〃加sbitkey2=P2A2;〃减unsignedcharhour;min,sec,T50ms;〃定义无符字符型变量小时、时间、秒、定时器定时周期50msunsignedcharmodstate;〃目前所处的模式unsignedcharbaojing_hour;〃用于设定闹钟报警的小时unsignedcharbaojing_min;〃用于设走闹钟报警的分钟\nunsignedcharcodetable[]={0x3f/0x06/0x5b/0x4fz0x66/0x6d/0x7d/0x07/0x7f/0x6f/0x77};//K码voidinit();〃初始化子程序声明voiddelay500us(unsignedcharX);〃延时子程序声明voiddisplayO;〃显示当刖时间的界面的声明(模式零)voiddisplayOOlQ;〃修改当前时间的小时的声明(模式一)voiddisplay002();〃修改当前时间的分钟的声明(模式二)voiddisplay003();W改闹钟时间的小时的声明(模式三)voiddisplay004();〃修改闹钟时间的分钟的声明(模式四)voidkeyscan();〃按键识别程序声明voidmain()〃册初始化init();while(l){keyscan();}}voidinit()〃初始化子程序\nTMOD二0x01;TH0=(65536-49990)/256;//49900[js=50000-10(lOps位时间修正量)TLO二(65536-49990)%256;//7256代表取高8位…%256低8位〃ETO=1;EA=1;TRO=1;voiddelay500us(unsignedcharX)/徳时程序{unsignedcharij;for(i=X;i>0;i-)for(j=248;j>0;j-);}voidtimerOOinterrupt1//timerO中断服务子程序,定时时间为50msz10ps为时间修正量{TMOD=0x01;TH0二(65536-49990)/256;TL0=(65536-49990)%256;T50ms++;if(T50ms>二20)//50ms*20=lszgp经过20个50ms的定时周期后时间位1秒\n鮒*」nowlls圮二、寸CN狐二otnon(寸CXJHA」no_c)七++」nolloHwlu)smI吕wft^*UEIL9-&-茶09亦二(09ywuJ)七++U-UJOHUOS)曲01浓s'lls訟09赳、(09HO①S)七++U①s訟I吕wfto44SUJOSlllsOCXIHASUJ0S1亦二OHSUJOS1\n++」nolll6u一「oeqOuwlul6u=oeq)起二、吕靶氷喲*11509〈潯启礪hrP27HPde-ay500us(5)j、漓耳500PS1建)P24BP25LP26H”P27匸po"Erb_2hou「%lo=ox89shours->目0X80P26UPlide_ay500us(5)j、漓曜5oops(寒建)\nP24=l;〃关位码P25=l;P26=l;P27=l;〃取min的十位,显示在第3个数码管上P0=table[min/10];P25=0;delay500us(5);P24=l;P25=l;P26=l;P27=l;Wmin的个位显示在第4个数码管上P0=table[min%10];P24二0;delay500us⑸;iffT50ms<=10)led=0;//50ms*10=0.5秒,即灯P370・5s亮0.5s灭if(T50ms>10)led=l;〃即用灯P37的闪烁代替秒针的运动voiddisplayOOlQ//在模式一下的显示界lil(调整当前时间的小时)\nP25二1;\nP26=l;P27=l;P0=table[hour/10];P27=0;delay500us(10);P24=l;P25=l;P26=l;P27=l;P0=table[hour%10];P26二0;delay500us(10);voiddisplay002(){P24=l;P25=l;P26=l;P27=l;P0=table[min/10];〃在模式二下的显示界lil(修改当前时间的分钟)delay500us(10);\nP24=l;P25=l;P26=l;P27=l;P0=table[min%10];P24二0;delay500us(10);voiddisplay003(){P24=l;P25=l;〃模式三下的显示界lil(修改闹钟时间的小时)P26=l;P27=l;P0=table[baojing_hour/10];P27=0;delay500us(10);P24=l;P25二1;P27=l;\nP0=table[baojing_hour%10];P26二0;delay500us(10);voiddisplay004()〃模式四下的显示界lil(修改闹钟时间的分钟)P24=l;P25二1;P26=l;P27=l;P0=table[baojing_min/10];P25=0;delay500us(10);P24=l;P25=l;P26=l;P27=l;P0=table[baojing_min%10];P24=0;delay500us(10);***********************************************************************\nVOidkeyscan()〃按键识别钟程序while(modstate==0)〃当处于模式零的界面时if(hour==baojing_hour&&min==baojing_min)baojing_led=0;〃当当前时间与闹钟时间相同时,灯P34亮elsebaojing_led=l;}//否则灯P34不兄displayO;〃调用函数〃显示当前温度见面〃if(keyO==O){display。;//这两句加在一起为延时10ms软件防抖设计。if(keyO二二0)modstate++;〃当模式键按下时,模式计数器+1while(key0==0)display001();〃按下模式键后切换到模式一的界面}}while(modstate==l)[〃当处■模式一的界面时displayOOlQ;〃防抖\nif(keyO==O)displayOOlO;〃调用函数〃模式一的界面〃display002();讦(keyO二二O)modstate++;〃当模式键按下时,模式计数器+1while(key0==0)display002();〃并切换到下一个模式}if(keyl==O)〃防抖idisplayOOlO;〃现在处于调整当前时间的小时的界面if(keyl==O)〃当up键按下时thour++;//hour+1if(hour>=24)hour=0;while(keyl==O)displayOOl();}}if(key2二二0)〃当按下down键时displayOOl();if(key2==0)hour—;//hour-1\nif(hour>=24)hour=0;while(key2==0)display001();//***************************************************************************V/while(modstate==2)〃当处于模式二的界面时display002();if(keyO==O){display002();讦(keyO==0)modstate++;〃按下模式键,模式计数器+1while(keyO==O)displayOO3();〃并}if(keyl==O)//up键按下时{display002();if(keyl==O){min++;〃设定当前时间的分钟加一if(min>二60)min二0;\nif(key2==0)//down键按下时{display002();if(key2==0){min-;〃设定当前时间的分钟减一if(min>二60)min二0;while(key2==0)display002();}while(modstate==3)〃当处于模式三的界面时{displayOO3();if(keyO二二0){displayOO3();if(key0==0)modstate++;}\nif(keyl==O)//up键按下,设走闹钟的小时数+1display003();if(keyl==O){baojing_hour++;讦(baojing_hour>=24)baojing_hour=0;while(keyl==0)display003();}}if(key2==0)//down键按下,设定闹钟的小时数J{display003();if(key2==0){baojing_hour—;讦(baojing_hour>=24)baojing_hour=0;while(key2==0)display003();}display004();if(keyO==O)\n{displayOO4();if(keyO==0)modstate=0;while(key0==0)display();〃在模式四时按下模式键,返回模式零的界面}jf(keyl==O)//up键按下,设定闹钟的分钟数+1{display004();if(keyl==0){baojing_min++;if(baojing_min>=60)baojing_min=0;while(keyl==0)display004();}}if(key2==0)//down键按下,设走闹钟的分钟数\nif(key2==0)baojing_min—;if(baojing_min>=60)baojing_min=0;while(key2==0)display004();}}}}