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

下载本文档

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

文档简介

1、/* 数码管时钟显示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

2、displ(char a,char b,char c,char d; void delay(uint z /延时程序uint x,y;for(x=z;x>0;x-for(y=110;y>0;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=20time=0;/ 12个led灯移动显示aa+=1; if(aa&

3、lt;6temp=_crol_(temp,1;if(aa=12aa=0; temp=0xfe;tem=0xff;if(aa=6tem=0xfe;temp=0xff;if(aa>6 tem=_crol_(tem,1;/d4+=1; if(d4=10d4=0;d3+=1;if(d3=6d3=0;d2+=1;if(d2=10d2=0;d1+=1;if(d1=6d1=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; we

4、la3=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

5、 +;2010-12-17双流这个是51hei开发板专区里转来的一个程序,注释很详细,运行也没有问题,原文地址:/*动态数显的设计思路,首先是我们要先知道怎样才能使哪个位亮,显示的段是什么数值,接下来就是中断时间的问题了,设计步骤如下,如果要让八个数码管静态显示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=0x3

6、f,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位n

7、umd=0; /附段显初值为0位TMOD=0X01; /第四步骤,附中断暂存器初值TH0=(65535-50000/256; /附中断请求时间初值,高8位TL0=(65536-50000%256; /附中断请求时间初值,低8位EA=1; /开启总中断ET0=1; /开启定时中断TR0=1; /启动定时中断while(1if(a=10 /第三步骤,执行速度,如果等20差不多是1秒,则往下执行,相当于单位数值亮的时间a=0; /重新附值初值0numd+; /段显值+if(numd=9 /如果段值在对码表第9位则转下执行 numd=1; /*重新附值段显值对应对码表第1位,因为+所以0位并不在数码管

8、中显示.如果要显示,也会因为+而在第二轮中显示出*/duan=1; /开启段显端P0=tablednumd;/附段显P0值对应段显值对码表duan=0; /锁存wei=1; /开启位显端P0=tablewnumw;/附位显P0值对应位显值对码表wei=0; /锁存numw+; /相当于位显移位if(numw=8 /如果位显值到对应位显对码表第八位则转下执行numw=0; /重新附值位显值对应对码表第0位起/*下面是简单的单个数码管显示例证 第一骤, 修改后在第三步骤内#include"reg52.h"#include"intrins.h"sbit dua

9、n=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 /*第四步骤,中断时间函数这

10、个相当于移位数显的速度,速度够快,人眼就会有余辉效应,感觉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 intucha

11、r 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

12、;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.5msuint i;uint j;for (i=0;i for(

13、j=0;j<500;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(1hhs=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=nh

14、h%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

15、;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(

16、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;

17、/时十位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=ta

18、bmons;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

19、;/秒个位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=

20、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;

21、P2_2=0;delay(1;P2_2=1;/秒十位P0=tabnssg;P2_0=0;delay(1;P2_0=1;/秒个位baoshi(; /整点报时alarm(; /闹钟void jishi( /计时函数if(n=20n=0;ss+;if(ss=60ss=0;mm+;if(mm=60mm=0;hh+;if(hh=24hh=0;day+;week+;if(week=8week=0;if(year%4=0&&year%100!=0|year%400=0 /闰年if(day=table1mon+1day=0;mon+;if(mon=13mon=0;year+;else /非闰年

22、if(day=table2mon+1day=0;mon+;if(mon=13mon=0;year+;uchar incone(uchar n /加1函数if(k3=0delay(20;if(k3=0n+;while(!k3;return(n;uchar decone(uchar m /减1函数if(k4=0delay(20;if(k4=0m-;while(!k4;if(m<0m=0;return(m;void key_change( / k1 按键扫描if(k1=0delay(20;if(k1=0set1+;while(!k1;if(set1=7set1=1;void key_set(

23、/k2按键扫描if(k2=0delay(20;if(k2=0set2+;while(!k2;if(set2=4set2=1;void baoshi( /整点报时函数if(mm=00&&ss=00fm=0;if(ss=1fm=1;void alarm( /闹钟函数uchar x;if(nhh=0goto end;if(hh=nhh&&mm=nmm&&ss=nssfor(x=0;x<6;x+fm=0;delay(30;fm=1;delay(20;fm=0;delay(30;fm=1;delay(20;fm=0;delay(30;fm=1;del

24、ay(20;fm=0;delay(30;fm=1;delay(180;end:;void set_time( /设置时间函数if(set1=2if(set2=1hh=incone(hh;if(hh=24hh=0;if(hh=-1hh=23;hh=decone(hh;if(set2=2mm=incone(mm;if(mm=60mm=0;if(mm=-1mm=59;mm=decone(mm;if(set2=3ss=incone(ss;if(ss=60ss=0;if(ss=-1ss=59;ss=decone(ss;void set_mdw( /设置月日星期函数if(set1=4if(set2=1mo

25、n=incone(mon;if(mon=13mon=1;mon=decone(mon;if(mon=0mon=12;if(set2=2day=incone(day;if(day=32day=1;day=decone(day;if(day=0day=31;if(set2=3week=incone(week;if(week=8week=1;week=decone(week;if(week=0week=7;void set_alarm( /设置闹钟函数if(set1=6if(set2=1nhh=incone(nhh;if(nhh=24nhh=0;if(nhh=-1nhh=23;nhh=de cone

26、(nhh;if(set2=2nmm=incone(nmm;if(nmm=60nmm=0;nmm=decone(nmm;if(nmm=-1nmm=59;if(set2=3nss=incone(nss;if(nss=60nss=0;nss=decone(nss;if(nss=-1nss=59;#include unsigned 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;u

27、nsigned 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-

28、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 11111111if(mode=0 /正常显示switch(j /控制语句case 0:P0=seven_segsec%10;P2=0xfe;break

29、; /秒个位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(jcase 0:P0=seven_segmin%10;P2=0xf

30、e;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(jcase 0:P0=seven_segmin%10| flash;P2

31、=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(jcase 0:P0=seven_segmin_rom%10;P2=0xfe;break;case 1:P0=seven_segmin

32、_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(jcase 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

温馨提示

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

评论

0/150

提交评论