数码管时钟显示C程序.doc_第1页
数码管时钟显示C程序.doc_第2页
数码管时钟显示C程序.doc_第3页
数码管时钟显示C程序.doc_第4页
数码管时钟显示C程序.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

/* 数码管时钟显示led移动C 程序使用共阳极数码管*/#include #include#define uint unsigned int #define uchar unsigned char sbit wela1 = P20;/数码管wela管脚定义sbit wela2 = P21;sbit wela3 = P22;sbit wela4 = P23; uchar time,d1,d2,d3,d4,temp,tem,aa;unsigned char code table = 0xC0,0xF9,0xA4,0xB0, 0x99,0x92,0x82,0xF8, 0x80,0x90;void displ(char a,char b,char c,char d); void delay(uint z)/延时程序uint x,y;for(x=z;x0;x-)for(y=110;y0;y-); /主函数 void main() time=0; TMOD=0x01; /中断定时初始化TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;aa=0;temp=0xfe;tem=0xff;d1=0;d2=0;d3=0;d4=0;while(1) if(time=20) time=0;/ 12个led灯移动显示 aa+=1; if(aa6) tem=_crol_(tem,1); / d4+=1; if(d4=10) d4=0; d3+=1; if(d3=6) d3=0; d2+=1; if(d2=10) d2=0; d1+=1; if(d1=6) d1=0;d2=0;d3=0;d4=0; displ(d1,d2,d3,d4); P1=temp; P3=tem; /动态显示子程序 void displ(char a,char b,char c,char d) wela1=0;wela2=0; wela3=0; wela4=0; P0=tablea; wela1=1;wela2=0; wela3=0; wela4=0; delay(5); P0=tableb; wela1=0;wela2=1; wela3=0; wela4=0; delay(5); P0=tablec; wela1=0;wela2=0; wela3=1; wela4=0; delay(5); P0=tabled; wela1=0;wela2=0; wela3=0; wela4=1; delay(5);/中断定时程序void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;time +;2010-12-17双流这个是51hei开发板专区里转来的一个程序,注释很详细,运行也没有问题,原文地址:/bbs/dispbbs.asp?boardid=10&id=4140/*动态数显的设计思路,首先是我们要先知道怎样才能使哪个位亮,显示的段是什么数值,接下来就是中断时间的问题了,设计步骤如下,如果要让八个数码管静态显示1到8,我们可以修改中断时间,如把50000改成100或更低*/#include #include#define uint unsigned int#define uchar unsigned charsbit duan=P26; sbit wei=P27;uchar a,numw,numd;uchar code tabled=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /*第二步骤,创建段显数值的对码表09数值.如果要显示18数值,最好多加前后两位数0跟9, 因为后面+移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/ uchar code tablew=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /第二步骤,创建位显,就是显示的位置,这个码表相对简单,用二进制表示1111111001111111,是0的为八位数显管的位置void main() a=0; /定义个时间函数 numw=0; /附位显初值为0位 numd=0; /附段显初值为0位 TMOD=0X01; /第四步骤,附中断暂存器初值 TH0=(65535-50000)/256; /附中断请求时间初值,高8位 TL0=(65536-50000)%256; /附中断请求时间初值,低8位 EA=1; /开启总中断 ET0=1; /开启定时中断 TR0=1; /启动定时中断 while(1) if(a=10) /第三步骤,执行速度,如果等20差不多是1秒,则往下执行,相当于单位数值亮的时间 a=0; /重新附值初值0 numd+; /段显值+ if(numd=9) /如果段值在对码表第9位则转下执行 numd=1; /*重新附值段显值对应对码表第1位,因为+所以0位并不在数码管中显示. 如果要显示,也会因为+而在第二轮中显示出*/ duan=1; /开启段显端 P0=tablednumd;/附段显P0值对应段显值对码表 duan=0; /锁存 wei=1; /开启位显端 P0=tablewnumw;/附位显P0值对应位显值对码表 wei=0; /锁存 numw+; /相当于位显移位 if(numw=8) /如果位显值到对应位显对码表第八位则转下执行 numw=0; /重新附值位显值对应对码表第0位起/*下面是简单的单个数码管显示例证 第一骤, 修改后在第三步骤内#includereg52.h#includeintrins.hsbit duan=P26; /段显端口sbit wei=P27; /位显端口void main() /P0=0xff; 数码管不显示任何信号,默认情况下通电本身就不显示,可以不写 duan=1; /开启段显端口 P0=0x06; /附值段显数值为1,可以查阅数码管电路图相对应显示的对码表 duan=0; /锁存,保持上一步段显状态,硬件说明请查阅74HC573功能 wei=1; /开启位显端口 P0=0xfe; /附值位显位置,01111111,左边第一位,为0的显示 wei=0; /锁存,保持上一步位显状态,硬件说明请查阅74HC573功能*/ void timer0() interrupt 1 /*第四步骤,中断时间函数这个相当于移位数显的速度,速度够快,人眼就会有余辉效应, 感觉8位数显一直在亮着,相当于正在播放的电影胶卷*/ TH0=(65536-50000)/256; TL0=(65536-50000)%256; a+;/*以上有什么地方还需要改进的还请老师明示*/*作者:胡甲 如需转载请注明出处*/*湖北工业大学工程技术学院 通信专业*/*单片机SST89E58RD 8位共阳数码管 12M晶振*/*P0段选,P2位选*/*2008年12月1号*/#include at89x52.h#define uchar unsigned char#define uint unsigned intuchar code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff;uchar n;uchar hh,mm,ss;uchar nhh,nmm,nss;uint year;uchar day,mon,week;uchar hhs,hhg,mms,mmg,sss,ssg;uchar days,dayg,mons,mong;uchar nhhs,nhhg,nmms,nmmg,nsss,nssg;uchar set1=1,set2=1;sbit fm=P32;sbit k1=P34;sbit k2=P35;sbit k3=P36;sbit k4=P37;uchar table1=31,31,29,31,30,31,30,31,31,30,31,30,31; /闰年uchar table2=31,31,28,31,30,31,30,31,31,30,31,30,31; /非闰年void jishi();void baoshi();void alarm();void set_time();void set_alarm();void set_mdw();void key_change();void key_set();void delay(int m) /延时程序,延时m*0.5ms uint i; uint j; for (i=0;im;i+) for(j=0;j500;j+) void timer0() interrupt 1TMOD=0x01;TH0=0x3c;TL0=0xb1;n+;jishi();main()TMOD=0x01;TH0=0x3c;TL0=0xb1;TR0=1;EA=1;ET0=1;hh=12;mm=00;ss=00;nhh=7;nmm=30;nss=0;year=2008;mon=12;day=1;week=1;while(1)hhs=hh/10%10;/时分秒hhg=hh%10;mms=mm/10%10;mmg=mm%10;sss=ss/10%10;ssg=ss%10;nhhs=nhh/10%10;/闹钟nhhg=nhh%10;nmms=nmm/10%10;nmmg=nmm%10;nsss=nss/10%10;nssg=nss%10;days=day/10%10;/月日dayg=day%10;mons=mon/10%10;mong=mon%10;key_change(); /k1按键扫描key_set(); /k2按键扫描set_time(); /设置时间set_mdw(); /设置月日星期set_alarm(); /设置闹钟if(set1=1) /正常走时显示P0=tabhhs;P2_7=0;delay(1);P2_7=1;/时十位P0=tabhhg;P2_5=0;delay(1);P2_5=1;/时个位P0=tab10;P2_3=0;delay(1);P2_3=1;/-P0=tabmms;P2_1=0;delay(1);P2_1=1;/分十位P0=tabmmg;P2_6=0;delay(1);P2_6=1;/分个位P0=tab10;P2_4=0;delay(1);P2_4=1;/-P0=tabsss;P2_2=0;delay(1);P2_2=1;/秒十位P0=tabssg;P2_0=0;delay(1);P2_0=1;/秒个位if(set1=2) /设置时间P0=tabhhs;P2_7=0;delay(1);P2_7=1;/时十位P0=tabhhg;P2_5=0;delay(1);P2_5=1;/时个位P0=tab10;P2_3=0;delay(1);P2_3=1;/-P0=tabmms;P2_1=0;delay(1);P2_1=1;/分十位P0=tabmmg;P2_6=0;delay(1);P2_6=1;/分个位P0=tab10;P2_4=0;delay(1);P2_4=1;/-P0=tabsss;P2_2=0;delay(1);P2_2=1;/秒十位P0=tabssg;P2_0=0;delay(1);P2_0=1;/秒个位if(set1=3) /正常显示月日-星期P0=tabmons;P2_7=0;delay(1);P2_7=1;/时十位P0=tabmong;P2_5=0;delay(1);P2_5=1;/时个位P0=tab10;P2_3=0;delay(1);P2_3=1;/-P0=tabdays;P2_1=0;delay(1);P2_1=1;/分十位P0=tabdayg;P2_6=0;delay(1);P2_6=1;/分个位P0=tab11;P2_4=0;delay(1);P2_4=1;/-P0=tab11;P2_2=0;delay(1);P2_2=1;/秒十位P0=tabweek;P2_0=0;delay(1);P2_0=1;/秒个位if(set1=4) /设置月日-星期P0=tabmons;P2_7=0;delay(1);P2_7=1;/时十位P0=tabmong;P2_5=0;delay(1);P2_5=1;/时个位P0=tab10;P2_3=0;delay(1);P2_3=1;/-P0=tabdays;P2_1=0;delay(1);P2_1=1;/分十位P0=tabdayg;P2_6=0;delay(1);P2_6=1;/分个位P0=tab11;P2_4=0;delay(1);P2_4=1;/-P0=tab11;P2_2=0;delay(1);P2_2=1;/秒十位P0=tabweek;P2_0=0;delay(1);P2_0=1;/秒个位if(set1=5) /正常显示定时P0=tabnhhs;P2_7=0;delay(1);P2_7=1;/时十位P0=tabnhhg;P2_5=0;delay(1);P2_5=1;/时个位P0=tab10;P2_3=0;delay(1);P2_3=1;/-P0=tabnmms;P2_1=0;delay(1);P2_1=1;/分十位P0=tabnmmg;P2_6=0;delay(1);P2_6=1;/分个位P0=tab10;P2_4=0;delay(1);P2_4=1;/-P0=tabnsss;P2_2=0;delay(1);P2_2=1;/秒十位P0=tabnssg;P2_0=0;delay(1);P2_0=1;/秒个位if(set1=6) /设置闹钟定时P0=tabnhhs;P2_7=0;delay(1);P2_7=1;/时十位P0=tabnhhg;P2_5=0;delay(1);P2_5=1;/时个位P0=tab10;P2_3=0;delay(1);P2_3=1;/-P0=tabnmms;P2_1=0;delay(1);P2_1=1;/分十位P0=tabnmmg;P2_6=0;delay(1);P2_6=1;/分个位P0=tab10;P2_4=0;delay(1);P2_4=1;/-P0=tabnsss;P2_2=0;delay(1);P2_2=1;/秒十位P0=tabnssg;P2_0=0;delay(1);P2_0=1;/秒个位baoshi(); /整点报时alarm(); /闹钟void jishi() /计时函数if(n=20)n=0;ss+; if(ss=60) ss=0;mm+; if(mm=60) mm=0;hh+; if(hh=24) hh=0;day+;week+; if(week=8) week=0;if(year%4=0&year%100!=0|year%400=0) /闰年 if(day=table1mon+1) day=0;mon+; if(mon=13) mon=0;year+; else /非闰年 if(day=table2mon+1) day=0;mon+; if(mon=13) mon=0;year+; uchar incone(uchar n) /加1函数if(k3=0)delay(20);if(k3=0)n+;while(!k3);return(n);uchar decone(uchar m) /减1函数if(k4=0)delay(20);if(k4=0)m-;while(!k4);if(m0)m=0;return(m);void key_change() / k1 按键扫描if(k1=0)delay(20);if(k1=0)set1+;while(!k1);if(set1=7)set1=1;void key_set() /k2按键扫描if(k2=0)delay(20);if(k2=0)set2+;while(!k2);if(set2=4)set2=1;void baoshi() /整点报时函数if(mm=00&ss=00)fm=0;if(ss=1)fm=1;void alarm() /闹钟函数uchar x;if(nhh=0)goto end;if(hh=nhh&mm=nmm&ss=nss)for(x=0;x6;x+)fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(180);end:;void set_time() /设置时间函数if(set1=2)if(set2=1)hh=incone(hh);if(hh=24)hh=0;if(hh=-1)hh=23;hh=decone(hh);if(set2=2)mm=incone(mm);if(mm=60)mm=0;if(mm=-1)mm=59;mm=decone(mm);if(set2=3)ss=incone(ss);if(ss=60)ss=0;if(ss=-1)ss=59;ss=decone(ss);void set_mdw() /设置月日星期函数if(set1=4)if(set2=1)mon=incone(mon);if(mon=13)mon=1;mon=decone(mon);if(mon=0)mon=12;if(set2=2)day=incone(day);if(day=32)day=1;day=decone(day);if(day=0)day=31;if(set2=3)week=incone(week);if(week=8)week=1;week=decone(week);if(week=0)week=7;void set_alarm() /设置闹钟函数if(set1=6)if(set2=1)nhh=incone(nhh);if(nhh=24)nhh=0;if(nhh=-1)nhh=23;nhh=de cone(nhh);if(set2=2)nmm=incone(nmm);if(nmm=60)nmm=0;nmm=decone(nmm);if(nmm=-1)nmm=59;if(set2=3)nss=incone(nss);if(nss=60)nss=0;nss=decone(nss);if(nss=-1)nss=59;#includeunsigned char seven_seg=0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90;unsigned char flash,mode=0;char min=50,hour=12,hour_rom,min_rom,sec=25;unsigned char j,k;unsigned int i;unsigned char key_set_s,key_up_s,key_down_s,key_reset_s;sbit P0_7=P07;sbit key_set=P34;sbit key_up=P35;sbit key_down=P36;sbit key_reset=P37; sbit buzzer=P10;bit dop,bb; /声明void delay(unsigned int x) /延时 while(x-);void timer0_isr(void) interrupt 1 /中断服务函数 TH0=0xf8; /为65535-2000=63535转化为16进制取高八位 TL0=0x2f; /取低八位 i+; bb=!bb; if(i=250) /半秒,五百一秒 i=0; k+; flash=flash; dop=!dop; if(k=2) /大于二归零 k=0; sec+; if(sec=60) /秒 sec=0; min+; if(min=60) /分 min=0; hour+; if(hour=24) /小时 hour=0; P0=0xff; /P0初始化为全1 11111111 if(mode=0) /正常显示 switch(j) /控制语句 case 0:P0=seven_segsec%10;P2=0xfe;break; /秒个位 case 1:P0=seven_segsec/10;P2=0xfd;break; /秒十位 case 2:P0=seven_segmin%10;P0_7=dop;P2=0xfb;break; case 3:P0=seven_segmin/10;P2=0xf7;break; case 4:P0=seven_seghour%10;P0_7=dop;P2=0xef;break; /dop为小数点 case 5:P0=seven_seghour/10;P2=0xdf;break; / if(mode=1) /模式一 C1状态 switch(j) case 0:P0=seven_segmin%10;P2=0xfe;break; case 1:P0=seven_segmin/10;P2=0xfd;break; case 2:P0=seven_seghour%10| flash;P2=0xfb;break; /flash为闪烁 case 3:P0=seven_seghour/10| flash;P2=0xf7;break; case 4:P0=seven_seg1;P2=0xef;break; /1为C1状态 case 5:P0=0xc6;P2=0xdf;break; /0xc6为显示C / if(mode=2) /模式二 C1状态 switch(j) case 0:P0=seven_segmin%10| flash;P2=0xfe;break; case 1:P0=seven_segmin/10| flash;P2=0xfd;break; case 2:P0=seven_seghour%10;P2=0xfb;break; case 3:P0=seven_seghour/10;P2=0xf7;break; case 4:P0=seven_seg1;P2=0xef;break; case 5:P0=0xc6;P2=0xdf;break; / if(mode=3) /模式三 C2状态 switch(j) case 0:P0=seven_segmin_rom%10;P2=0xfe;break; case 1:P0=seven_segmin_rom/10;P2=0xfd;break; case 2:P0=seven_seghour_rom%10| flash;P2=0xfb;break; case 3:P0=seven_seghour_rom/10| flash;P2=0xf7;break; case 4:P0=seven_seg2;P2=0xef;break; case 5:P0=0xc6;P2=0xdf;break; / if(mode=4) /模式四 C2状态 switch(j) case 0:P0=seven_segmin_rom%10| flash;P2=0xfe;break; case 1:P0=seven_segmin_rom/10| flash;P2=0xfd;break; case 2:P0=seven_seghour_rom%10;P2=0xfb;break; ca

温馨提示

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

最新文档

评论

0/150

提交评论