/* 数码管时钟显示led移动C 程序使用共阳极数码管*/#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit wela1 = P2^0; //数码管wela管脚定义sbit wela2 = P2^1;sbit wela3 = P2^2;sbit wela4 = P2^3;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;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){{time=0;// 12个led灯移动显示aa+=1;if(aa<6)temp=_crol_(temp,1);if(aa==12){aa=0;temp=0xfe;tem=0xff;}if(aa==6){tem=0xfe;temp=0xff;}if(aa>6)tem=_crol_(tem,1);//d4+=1;{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=table[a];wela1=1;wela2=0; wela3=0; wela4=0;delay(5);P0=table[b];wela1=0;wela2=1; wela3=0; wela4=0;delay(5);P0=table[c];wela1=0;wela2=0; wela3=1; wela4=0;delay(5);P0=table[d];wela1=0;wela2=0; wela3=0; wela4=1;delay(5);}//中断定时程序void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;time ++;}2010-12-17双流这个是51hei开发板专区里转来的一个程序,注释很详细,运行也没有问题,原文地址:/bbs/dispbbs.asp?boardid=10&id=4140/*动态数显的设计思路,首先是我们要先知道怎样才能使哪个位亮,显示的段是什么数值,接下来就是中断时间的问题了,设计步骤如下,如果要让八个数码管静态显示1到8,我们可以修改中断时间,如把50000改成100或更低*/#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit duan=P2^6;sbit wei=P2^7;uchar a,numw,numd;uchar code tabled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /*第二步骤,创建段显数值的对码表0~9数值.如果要显示1~8数值,最好多加前后两位数0跟9,因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/uchar code tablew[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //第二步骤,创建位显,就是显示的位置,这个码表相对简单,用二进制表示11111110~01111111,是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; //重新附值初值0numd++; //段显值++if(numd==9) //如果段值在对码表第9位则转下执行numd=1; /*重新附值段显值对应对码表第1位,因为++所以0位并不在数码管中显示.如果要显示,也会因为++而在第二轮中显示出*/duan=1; //开启段显端P0=tabled[numd];//附段显P0值对应段显值对码表duan=0; //锁存wei=1; //开启位显端P0=tablew[numw];//附位显P0值对应位显值对码表wei=0; //锁存numw++; //相当于位显移位if(numw==8) //如果位显值到对应位显对码表第八位则转下执行numw=0; //重新附值位显值对应对码表第0位起/*下面是简单的单个数码管显示例证第一骤, 修改后在第三步骤内#include"reg52.h"#include"intrins.h"sbit duan=P2^6; //段显端口sbit wei=P2^7; //位显端口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=P3^2;sbit k1=P3^4;sbit k2=P3^5;sbit k3=P3^6;sbit k4=P3^7;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;i<m;i++){for(j=0;j<500;j++){}}}void timer0() interrupt 1{TMOD=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=tab[hhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[hhg];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[mms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[mmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[sss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==2) //设置时间{P0=tab[hhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[mms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[mmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[sss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==3) //正常显示月日-星期{P0=tab[mons];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[mong];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[days];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[dayg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[11];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[11];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[week];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==4) //设置月日-星期{P0=tab[mons];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[mong];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[days];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[dayg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[11];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[11];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[week];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==5) //正常显示定时{P0=tab[nhhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[nhhg];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[nmms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[nmmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[nsss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[nssg];P2_0=0;delay(1);P2_0=1;//秒个位}if(set1==6) //设置闹钟定时{P0=tab[nhhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-"P0=tab[nmms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[nmmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-"P0=tab[nsss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[nssg];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==table1[mon]+1){day=0;mon++;if(mon==13){mon=0;year++;}}}else //非闰年{if(day==table2[mon]+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(m<0){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按键扫描{{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;x<6;x++){fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);fm=1;delay(20);fm=0;delay(30);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;}}}}#include<reg51.h>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;unsigned char j,k;unsigned int i;unsigned char key_set_s,key_up_s,key_down_s,key_reset_s; sbit P0_7=P0^7;sbit key_set=P3^4;sbit key_up=P3^5;sbit key_down=P3^6;sbit key_reset=P3^7;sbit buzzer=P1^0;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 11111111if(mode==0) //正常显示{switch(j) //控制语句{case 0:P0=seven_seg[sec%10];P2=0xfe;break; //秒个位case 1:P0=seven_seg[sec/10];P2=0xfd;break; //秒十位case 2:P0=seven_seg[min%10];P0_7=dop;P2=0xfb;break;case 3:P0=seven_seg[min/10];P2=0xf7;break;case 4:P0=seven_seg[hour%10];P0_7=dop;P2=0xef;break; //dop为小数点case 5:P0=seven_seg[hour/10];P2=0xdf;break;}}////////////////////if(mode==1) //模式一C1状态{switch(j){case 0:P0=seven_seg[min%10];P2=0xfe;break;case 1:P0=seven_seg[min/10];P2=0xfd;break;case 2:P0=seven_seg[hour%10]| flash;P2=0xfb;break; //flash为闪烁case 3:P0=seven_seg[hour/10]| flash;P2=0xf7;break;case 4:P0=seven_seg[1];P2=0xef;break; //1为C1状态case 5:P0=0xc6;P2=0xdf;break; //0xc6为显示C}}////////////////////if(mode==2) //模式二C1状态{switch(j){case 0:P0=seven_seg[min%10]| flash;P2=0xfe;break;case 1:P0=seven_seg[min/10]| flash;P2=0xfd;break;case 2:P0=seven_seg[hour%10];P2=0xfb;break;case 3:P0=seven_seg[hour/10];P2=0xf7;break;case 4:P0=seven_seg[1];P2=0xef;break;case 5:P0=0xc6;P2=0xdf;break;}}////////////////////if(mode==3) //模式三C2状态{switch(j)case 0:P0=seven_seg[min_rom%10];P2=0xfe;break;case 1:P0=seven_seg[min_rom/10];P2=0xfd;break;case 2:P0=seven_seg[hour_rom%10]| flash;P2=0xfb;break;case 3:P0=seven_seg[hour_rom/10]| flash;P2=0xf7;break;case 4:P0=seven_seg[2];P2=0xef;break;case 5:P0=0xc6;P2=0xdf;break;}}////////////////////if(mode==4) //模式四C2状态{switch(j){case 0:P0=seven_seg[min_rom%10]| flash;P2=0xfe;break;case 1:P0=seven_seg[min_rom/10]| flash;P2=0xfd;break;case 2:P0=seven_seg[hour_rom%10];P2=0xfb;break;case 3:P0=seven_seg[hour_rom/10];P2=0xf7;break;case 4:P0=seven_seg[2];P2=0xef;break;case 5:P0=0xc6;P2=0xdf;break;}}j++;if(j>=6)j=0;}void key(void) //调用开关函数////////////////if(key_set==0) //设置{delay(300);if(key_set==0)key_set_s=1;}if(key_set==1&&key_set_s==1){mode++;if(mode>=5)mode=1;key_set_s=0;}////// ///if(key_up==0) //上调{delay(300);if(key_up==0)key_up_s=1;}if(key_up==1&&key_up_s==1){if(mode==1)hour++;if(mode==2)min++;if(mode==3)hour_rom++;if(hour_rom>=24)hour_rom=0;if(mode==4)min_rom++;if(min_rom>=60)min_rom=0;key_up_s=0;}/////////////////if(key_down==0) //下调{delay(300);if(key_down==0)key_down_s=1;}if(key_down==1&&key_down_s==1){if(mode==1)hour--;if(hour<0)hour=23;if(mode==2)min--; if(min<0)min=59;if(mode==3)hour_rom--;if(hour_rom<0)hour_rom=23;if(mode==4)min_rom--;if(min_rom<0)min_rom=59;key_down_s=0;}/////////////////if(key_reset==0) //复位{delay(300);if(key_reset==0)key_reset_s=1;}if(key_reset==1&&key_reset_s==1){key_reset_s=0;mode=0;}}void timer0_init(void) //timero初始化函数{TMOD=0x01; //方式1TH0=0xf8;TL0=0x2f;EA=1; //中断开关ET0=1; //中断小开关TR0=1; //开始计数}void main(void) //主函数{timer0_init();while(1)key();{if(hour==hour_rom&&min==min_rom) buzzer=bb; //buzzer为蜂鸣器}}。