数码管时钟程序C语言

合集下载

数码管时钟显示C程

数码管时钟显示C程

/* 数码管时钟显示led移动C 程序使用共阳极数码管*/#include<>#include<>#define uint unsigned int#define uchar unsigned charsbit wela1 = P2^0; 果要显示1~8数值,最好多加前后两位数0跟9, 因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/uchar code tablew[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 如果要显示,也会因为++而在第二轮中显示出*/duan=1; //开启段显端P0=tabled[numd];//附段显P0值对应段显值对码表duan=0; //锁存wei=1; //开启位显端P0=tablew[numw];//附位显P0值对应位显值对码表wei=0; //锁存numw++; //相当于位显移位if(numw==8) //如果位显值到对应位显对码表第八位则转下执行numw=0; //重新附值位显值对应对码表第0位起/*下面是简单的单个数码管显示例证第一骤, 修改后在第三步骤内#include""#include""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 ""#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*{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[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==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[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;//秒个位}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按键扫描{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;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;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<>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初始化为全1if(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为蜂鸣器}}。

C语言数码管秒表(详细)

C语言数码管秒表(详细)
update_disbuf();
}
bit scan_key()
{
key_s = 0x00;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
{
if((key_v & 0x01) == 0)
{
key_times++;
if(key_times == 1)
*十万位P20 dis_buf[7] sec_bcd[7] *
*万位P21 dis_buf[6] sec_bcd[6] *
*千位P22 dis_buf[5] sec_bcd[5] *
*百位P23 dis_buf[4] sec_bcd[4] *
*十位P24 dis_buf[3] sec_bcd[3] *
*个位(1.s) P25 dis_buf[2] sec_bcd[2] *
*十分位(0.1s) P26 dis_buf[1] sec_bcd[1] *
*百分位(0.01s) P27 dis_buf[0] sec_bcd[0] *
* *
********************************************************************************
}
void update_disbuf()
//更新显示缓冲区
{
dis_buf[0] = dis_code[sec_bcd[0]];
dis_buf[1] = dis_code[sec_bcd[1]];
dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;//加上小数点

51单片机数码管显示时钟(C语言)

51单片机数码管显示时钟(C语言)

* 输出
:无
*******************************************************************************
/
void main() {
Ds1302Init(); Timer0Configuration(); while(1) {
Ds1302ReadTime(); disp[7] = DIG_CODE[TIME[0]&0x0f]; disp[6] = DIG_CODE[TIME[0]>>4]; disp[5] = 0X40; disp[4] = DIG_CODE[TIME[1]&0x0f]; disp[3] = DIG_CODE[TIME[1]>>4]; disp[2] = 0X40; disp[1] = DIG_CODE[TIME[2]&0x0f]; disp[0] = DIG_CODE[TIME[2]>>4]; }
/
void DigDisplay() interrupt 1 { //定时器在工作方式二会自动重装初,所以不用在赋值。 // TH0=0X9c;//给定时器赋初值,定时 1ms // TL0=0X00;
DIG=0; //消隐 switch(Num) //位选,选择点亮的数码管, {
case(7): LSA=0;LSB=0;LSC=0; break;
uchar n;
EA = 0; RST = 0; _nop_();
SCLK = 0;//先将 SCLK 置低电平。 _nop_(); RST = 1; //然后将 RST(CE)置高电平。 _nop_();
for (n=0; n<8; n++)//开始传送八位地址命令 {

DS1302八位共阳数码管C语言可调时钟程序

DS1302八位共阳数码管C语言可调时钟程序
#define DS1302_SCLK_LOW io_DS1302_SCLK = 0 ;
#define DS1302_IO_HIGH io_DS1302_IO = 1 ;
#define DS1302_IO_LOW io_DS1302_IO = 0 ;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
sbit key4=P3^4;
int main_flag=0,exit_flag,up_flag,down_flag;
int tab[]={0,0,0,0,0,0};
uchar tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
}
}
break;
case KEY_STATE_UP:
if(keyTemp==KEY_NULL)
{
s_keyState=KEY_STATE_INIT;
}
else
{
if(++keyTime>=KEY_CONTINUE_PERIOD)
uchar table1[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x80,0x90,0xbf,0xbf};
#define KEY_1 0x0e
#define KEY_2 0x0d
#define KEY_3 0x0b
#define KEY_4 0x07
if(count==500)
{
count=0;
dao1S=1;
}
}
//-------------------------------------常数宏---------------------------------//

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序用数码管(8位)显示的数字时钟,由于是在开发板上写的程序,所以51单片机的一些I/O口设定并不完全一样,以下程序仅供参考#include<reg52.h>sbit dula=P2^6; //段选锁存器sbit wela=P2^7; //位选锁存器sbit key1=P3^2; //INT0 选择键sbit key2=P3^4; //T0 时间增加sbit key3=P3^6; //S4 时间减少char a=0,hour=0,minute=0,seconed=0;char h1,h2,m1,m2,s1,s2;char num=0;char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(char z){char x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display_hour(char h) //显示小时{h1=h/10;h2=h%10;wela=1;P0=0xfe; //1111 1110wela=0;P0=0xff;dula=1;P0=table[h1];dula=0;delay(5);wela=1;P0=0xfd; //1111 1101wela=0;P0=0xff;dula=1;P0=table[h2];delay(5);}void display_minute(char m) //显示分钟{m1=m/10;m2=m%10;wela=1;P0=0xf7; //1111 0111wela=0;P0=0xff;dula=1;P0=table[m1];dula=0;delay(5);wela=1;P0=0xef; //1110 1111wela=0;P0=0xff;dula=1;P0=table[m2];dula=0;delay(5);}void display_seconed(char s) //显示秒{s1=s/10;s2=s%10;wela=1;P0=0xbf; //1011 1111wela=0;P0=0xff;dula=1;P0=table[s1];dula=0;delay(5);wela=1;P0=0x7f; //0111 1111P0=0xff;dula=1;P0=table[s2];dula=0;delay(5);}void init() //初始化函数{TMOD=0x01; //定时器0工作方式1TH0=(65536-45872)/256; //装初值晶振11.0592 50ms为45872 TL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //开启定时器0}void key() //按键函数,功能为对时间进行调整{if(key1==0) //key1键按下进入选择并停止定时器{delay(10);while(!key1); //松手检测TR0=0;num++; //没按一次key1 num自加1}if(num==1) //key1按一次进行“小时”调整{if(key2==0) //key2按下时间增加{delay(10);while(!key2);hour++;if(hour==24)hour=0;}if(key3==0) //key3按下时间减少{delay(10);hour--;if(hour<0)hour=23;}}if(num==2) //按下key1两次进行“分钟调整”{if(key2==0){delay(10);while(!key2);minute++;if(minute==60)minute=0;}if(key3==0){delay(10);while(!key3);minute--;if(minute<0)minute=59;}}if(num==3) //key1按下三次对“秒”进行调节{if(key2==0){delay(10);while(!key2);seconed++;if(seconed==60)seconed=0;}if(key3==0){delay(10);seconed--;if(seconed<0)seconed=59;}}if(num==4) //key1按下四次认为调节完毕开启定时器并将num清0 {num=0;TR0=1;}}void main(){init();while(1){display_seconed(seconed); //显示“秒,分,时”display_minute(minute);display_hour(hour);if(a==20) //判断定时器是否到1s{a=0;seconed++;if(seconed>59){seconed=0;minute++;if(minute>59){minute=0;hour++;if(hour>23){hour=0;}}}}key();}}void time() interrupt 1 {TH0=(65536-45872)/256; TL0=(65536-45872)%256; a++;}。

基于C语言的Led 数码管显示数字钟

基于C语言的Led 数码管显示数字钟

目录1.引言 (1)1.1. 编写目的: (1)1.2. 背景 (1)1.3. 定义 (2)1.4. 参考资料 (4)2.总体设计 (4)2.1. 开发与运行环境 (4)2.2. 硬件功能描述 (4)2.3. 硬件结构 (5)3.硬件模块设计 (9)3.1. 描述 (9)3.2. 功能 (12)4.嵌入式软件设计 (13)4.1. 流程逻辑 (14)4.2. 程序代码 (17)5.经验总结 (29)6.附录 (34)1.引言1.1编写目的(1)巩固和提高学过的基础理论和专业知识;(2)提高运用所学专业知识进行独立思考和综合分析、解决实际问题的能力;(3)培养掌握正确的思维方法和利用软件和硬件解决实际问题的基本技能;(4)增强对实际电路的认识,掌握分析处理方法,进行调试、设计等基本技能的训练,使之具有一定程度的实际工作能力。

(5)通过设计数字电子钟,了解电子钟的工作原理和内部构造。

(6)学会系统(模块)的测试方法,并根据完整的测试数据对系统(模块)的性能指标做出分析和评价;1.2背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高。

目前,单片机正朝着高性能和多品种方向发展,发展趋势将进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。

单片机应用的重要意义在于,它从根本上改变了传统的控制系统设计思想和设计方法。

从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。

单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

因此,本设计报告在Keil vision2环境下调试与编写程序,在利用proteus软件进行仿真,最终设计出PCB,制作出led数码管显示的数字钟。

数码管时钟显示C程序.doc

数码管时钟显示C程序.doc

数码管时钟显示C程序/*数码管时钟显示led移动C程序使用共阳极数码管*/#include#include#defineuintunsignedint#defineucharunsignedchar sbitwela1=P2 ;//数码管wela管脚定义sbitwela2=P2 ;sbitwela3=P2 ;sbitwela4=P2 ;uchartime,d1,d2,d3, d4,temp,tem,aa;unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0 x99,0x92,0x82,0xF8,0x80,0x90};voiddispl(chara,charb,charc,chard) ;voiddelay(uintz)//延时程序{uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//主函数voidmain(){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){i f(time==12月1号********//#include“at89x52.h“#defineucharunsignedchar#defineuin tunsignedintucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0xbf,0xff};ucharn;ucharhh,mm,ss;ucharnhh,nmm,ns s;uintyear;ucharday,mon,week;ucharhhs,hhg,mms,mmg,sss,ssg;ucha rdays,dayg,mons,mong;ucharnhhs,nhhg,nmms,nmmg,nsss,nssg;ucha rset1=1,set2=1;sbitfm=P3 ;sbitk1=P3 ;sbitk2=P3 ;sbitk3=P3 ;s bitk4=P3 ;uchartable1[]={31,31,29,31,30,31,30,31,31,30,31,30,31} ;//闰年uchartable2[]={31,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年voidjishi();voidbaoshi();voidalarm();voidset_time();voidset_alarm(); voidset_mdw();voidkey_change();voidkey_set();voiddelay(intm)//延时程序,延时m*0.5ms{uinti;uintj;for(i=0;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初始化为全111111111if(mode==0)//正常显示{switch(j)//控制语句{case0:P0=seven_seg[sec%10];P2=0xfe;break;//秒个位case1:P0=seven_seg[sec/10];P2=0xfd;break;//秒十位case2:P0=seven_seg[min%10];P0_7=dop;P2=0xfb;break;case3:P0= seven_seg[min/10];P2=0xf7;break;case4:P0=seven_seg[hour%10];P 0_7=dop;P2=0xef;break;//dop为小数点case5:P0=seven_seg[hour/10];P2=0xdf;break;}}////////////////////if(mo de==1)//模式一C1状态{switch(j){case0:P0=seven_seg[min%10];P2=0xfe;break;case1:P0= seven_seg[min/10];P2=0xfd;break;case2:P0=seven_seg[hour%10]|fl ash;P2=0xfb;break;//flash为闪烁case3:P0=seven_seg[hour/10]|flash;P2=0xf7;break;case4:P0=seven_ seg[1];P2=0xef;break;//1为C1状态case5:P0=0xc6;P2=0xdf;break;//0xc6为显示C}}////////////////////if(mode==2)//模式二C1状态{switch(j){case0:P0=seven_seg[min%10]|flash;P2=0xfe;break;case1:P0=seven_seg[min/10]|flash;P2=0xfd;break;case2:P0=seven_seg[h our%10];P2=0xfb;break;case3:P0=seven_seg[hour/10];P2=0xf7;bre ak;case4:P0=seven_seg[1];P2=0xef;break;case5:P0=0xc6;P2=0xdf;b reak;}}////////////////////if(mode==3)//模式三C2状态{switch(j){case0:P0=seven_seg[min_rom%10];P2=0xfe;break;case1 :P0=seven_seg[min_rom/10];P2=0xfd;break;case2:P0=seven_seg[h our_rom%10]|flash;P2=0xfb;break;case3:P0=seven_seg[hour_rom/1 0]|flash;P2=0xf7;break;case4:P0=seven_seg[2];P2=0xef;break;case5 :P0=0xc6;P2=0xdf;break;}}////////////////////if(mode==4)//模式四C2状态{switch(j){case0:P0=seven_seg[min_rom%10]|flash;P2=0xfe;break; case1:P0=seven_seg[min_rom/10]|flash;P2=0xfd;break;case2:P0=se ven_seg[hour_rom%10];P2=0xfb;break;case3:P0=seven_seg[hour_r om/10];P2=0xf7;break;case4:P0=seven_seg[2];P2=0xef;break;case5 :P0=0xc6;P2=0xdf;break;}}j++;if(j>=6)j=0;}voidkey(void)//调用开关函数{////////////////if(key_set==0)//设置{delay(300);if(key_set==0)key_set_s=1;}if(key_set==1if(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==1if(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==1if(h our<0)hour=23;if(mode==2)min--;if(min<0)min=59;if(mode==3)ho ur_rom--;if(hour_rom<0)hour_rom=23;if(mode==4)min_rom--;if(m in_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==1mode= 0;}}voidtimer0_init(void)//timero初始化函数{TMOD=0x01;//方式1TH0=0xf8;TL0=0x2f;EA=1;//中断开关ET0=1;//中断小开关TR0=1;//开始计数}voidmain(void)//主函数{timer0_init();while(1)key();{if(hour==hour_rom//buzzer为蜂鸣器}}。

数字时钟_89C52_单片机C语言程序

数字时钟_89C52_单片机C语言程序
/*列扫描控制 LED1位 2位 3位 4位 5位 6位 7位 8位*/
uchar MON[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
uchar A;
uchar BIN=0; /* 【BIN】作为倒计时开始的标志 */
TH0 = (65536 - 10000) / 256; /*给定计时器高位赋予 初值=15536/256*/
TL0 = (65536 - 10000) % 256; /*给定计时器低位赋予 初值=15536%256 */
ET0 = 1; /*打开定时器外部终断0允许 ET1是中断器1的开关*/
P2 = C[4];
Delay(1);
P0 = Code[Msec%10]; /*第五位的数字显示【分】的【个】位 */
P2 = C[5];
Delay(1);
Delay(1);
P0 = 0x40; /*第六位符号【-】的显示 */
P2 = C[6];
Delay(1);
P2 = C[2];
Delay(1);
if(x/50==0)
P0 = 0x40; /*第三位符号【-】的显示 */
else
P0 = 0x00;
P2 = C[3];
Delay(1);
P0 = Code[min/10]; /*第四位的数字的显示【分】的【十】位 */
uchar month=7;
uchar month2;
uchar day=19;
uchar set1 = 1; /* set1=1 是调节 时分秒 set1=2时时调节 年月日 set=3时事调节闹钟 */

单片机基于c语言编写时钟

单片机基于c语言编写时钟

单片机基于c语言编写时钟#include <REGX51.H>#define uint unsigned int#define uchar unsigned charchar led[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6};//共阴数码管数字码#define weixuan P0 //P0为数码管的段选sbit sck=P2^7; //移位时钟sbit tck=P2^6; //锁存时钟sbit data1=P2^5; //串行数据输入sbit x1=P1^0;sbit x2=P1^1;sbit x3=P1^2;sbit bee=P3^5;sbit time_change=P1^5; //P3^0为"调时"按键sbit time_choose=P1^6; //P3^1为"选择时分秒"按键sbit time_inc=P1^7; //P3^2为"增加"按键sbit time_ok=P3^3; //P3^3为"完成"按键uint t;uchar sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定义秒,分,时,秒的个位,十位,分的个位,十位,时的个位,十位int choose_n; //按下"选择时分秒"按键的次数int flag; //定义"调时"按键的标志位//---------------------------------------------------------------------void init();void display();void delay(int x);void time_modify();void send(uchar data8);void naozhong();//---------------------------------------------------------------------void main(){init();while(1){TR0=1;display();time_modify();}}//---------------------------------------------------------------------void init(){t=choose_n=0;sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi,sec=min=hour=flag=0;TMOD=0x01; //定义定时器0工作与方式1TH0=(65536-60000)/256; //定时器赋初值TL0=(65536-60000)%256;EA=1; //开总中断和T0中断ET0=1;}//---------------------------------------------------------------------void send(uchar data8) // 数据发送{uchar i;//设置循环变量sck=1;tck=1;for(i=0;i<=7;i++){if((data8>>i)&0x01)data1=1;elsedata1=0;sck=0;sck=1;}tck=0;tck=1;}//--------------------------------延时子函数------------------------------------void delay(int x){int i,j;for(i=0;i<=x;i++)for(j=0;j<=100;j++);}//-------------------------------显示子函数---------------------------------------void display(){int i=0;if(TF0==1) //如果定时器溢出{TF0=0; //清中断标志位t++;if(t==18){t=0;sec++; //秒加1if(sec==60) //如果秒为60,则清零,分加1{sec=0;min++;}if(min==60) //如果分为60,则清零,时加1{min=0;hour++;}if(hour==24) //如果时为24,则清零{hour=0;}}}sec_ge=sec%10; //秒的个位和十位sec_shi=sec/10;min_ge=min%10; //分的个位和十位min_shi=min/10;hour_ge=hour%10; //时的个位和十位hour_shi=hour/10;weixuan = 0xff; // p0口为1111 1111send(led[hour_shi]); // 显示第一位时weixuan= 0xfe; // p0口为1111 1110delay(1);weixuan=0xff; // 消影send(led[hour_ge]); // 显示第二位时weixuan= 0xfd; // p0口为1111 1101delay(1);weixuan=0xff; // 消影send(0x02); // 显示第三位weixuan= 0xfb; // p0口为1111 1011delay(1);weixuan=0xff; // 消影send(led[min_shi]); // 显示第四位分weixuan= 0xf7; // p0口为1111 0111delay(1);weixuan=0xff; // 消影send(led[min_ge]); // 显示第5位分weixuan= 0xef; // p0口为1110 1111delay(1);weixuan=0xff; // 消影send(0x02); // 显示第6位weixuan= 0xdf; // p0口为1101 1111delay(1);weixuan=0xff; // 消影send(led[sec_shi]); // 显示第7位秒weixuan= 0xbf; // p0口为1011 1111delay(1);weixuan=0xff; // 消影send(led[sec_ge]); // 显示第8位秒weixuan= 0x7f; // p0口为0111 1111delay(1);weixuan=0xff; // 消影}//----------------------------调时子程序-------------------------------void time_modify(){if(time_change==0) //如果"调时"按键按下{delay(5); //延时去抖if(time_change==0){flag=1; //标志位置1while(flag) //当标志位为1时才能进行时间调整{TR0=0; //定时器停止display(); //显示停止时的时间if(time_ok==0) //如果"完成"按键按下{delay(15); //延时去抖if(time_ok==0){flag=0; //标志位清零x1=1;x2=1;x3=1;}}if(time_choose==0) //如果"时分秒选择"按键按下{delay(30); //延时去抖if(time_choose==0){while(!time_choose);choose_n++; //按下的次数增加if(choose_n==4) //如果次数达到4次{choose_n=1; //次数清零}if(choose_n==1) //如果次数为1,秒指示灯亮{x1=0;x2=1;x3=1;}else if(choose_n==2) //如果次数为2,分指示灯亮{x1=1;x2=0;x3=1;}else if(choose_n==3) //如果次数为3,时指示灯亮{x1=1;x2=1;x3=0;}}}if(time_inc==0) //如果"增加"按键按下{delay(30); //延时去抖if(time_inc==0){switch(choose_n) //分支结构,根据choose_n的值来判断哪一位加1 {case 1: //如果choose_n为1,秒加1,到60清零{while(!time_inc);sec++;if(sec==60)sec=0;break;}case 2: //如果choose_n为2,分加1,到60清零{while(!time_inc);min++;if(min==60)min=0;break;}case 3: //如果choose_n为3,时加1,到24清零{while(!time_inc);hour++;if(hour==24)hour=0;break;}default:break;}}}}}}}。

世上最简单的遥控(数码管显示)电子钟(C语言编写)

世上最简单的遥控(数码管显示)电子钟(C语言编写)

世上最简单的遥控(数码管显示)电子钟(C语言编写)/*此程序为红外遥控电子钟,晶振为12M,MCU 型号为51 系列,电路很简单四位共阳数码管,红外接收管sm0038 接在P3.2*/#include #define uchar unsigned char#define uint unsigned int#define c(x) (x*120000/120000)sbit IR=P3 ; sbit ge=P2;//数码管四位选控制端sbit shi=P2 ;sbit bai=P2;sbit qian=P2;char miao,fen=59,shij=23;//时分秒3 个变量uchar num,ding; //两定时器计数变量uint temp;//遥控解码变量uchar i;uchar j;bit flag;//控制小数点亮与灭变量bit power;//控制数码管亮与灭变量bit flash;//进入时间调整标志位变量uchar IRBUF[4]; //用于保存解码结果uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e};uint Low(){TL0=0;TH0=0;TR0=1;while(!IR&&(TH0&0x80)==0);TR0=0;returnTH0*256+TL0;}//=============================================================uintHigh(){TL0=0;TH0=0;TR0=1;while(IR&&(TH0&0x80)==0);TR0=0;returnTH0*256+TL0;}void xian(uchar shik,uchar fen){P0=table[shik/10];if(power==0)qian=0;elseqian=1;//delay(2);qian=1;if(flag==0)P0=table[shik%10]&0x7f;elseP0=table[shik%10]|0x80;if (power==0)bai=0;elsebai=1;//delay(2);bai=1;P0=table[fen/10];if(power==0)shi=0;els eshi=1;//delay(2);shi=1;P0=table[fen%10];if(power==0)ge=0;elsege=1;//delay(2);ge =1;}void yin(){while(1){ restart: while(IR) {xian(shij,fen); if(flash==1) { if(ding>5) { ding=0; power=~power; //xian(shij,fen); } } }。

数码管显示时钟程序

数码管显示时钟程序
sbit SCLK = P1^1;
sbit RST = P1^2;
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
uchar *WEEK[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"};
uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "};
Set_LCD_POS(p);
for(i=0;i<16;i++)
{
Write_LCD_Data(s[i]);
DelayMS(1);
}
}
void Format_DateTime(uchar d,uchar *a)
{
a[0]=d/10+'0';
a[1]=d%10+'0';
}
void main()
{
Init_LCD();
从DS1302读1字节数据
**************************************/
BYTE DS1302_ReadByte()
{
BYTE i;
BYTE dat = 0;
for (i=0; i<8; i++) //8位计数器
{
SCLK = 0; //时钟线拉低
Delay(); //延时等待
Display_LCD_String(0x00,LCD_DSY_BUFFER1);

基于单片机C语言电子时钟完整版(闹钟,整点报时)

基于单片机C语言电子时钟完整版(闹钟,整点报时)

《单片机技术》课程设计说明书数字电子钟系、部:电气与信息工程学院学生姓名:指导教师:职称专业:班级:完成时间:2013-06-07摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEU5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMEL’s as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons KEY1, KEY2, KEY3,KEY4 and KEY5 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.Key words Electronic clock;;AT89S52;Hardware Design;Software Design目录1设计课题任务、功能要求说明及方案介绍 (1)1.1设计课题任务 (1)1.2功能要求说明 (1)1.3设计总体方案介绍及原理说明 (1)2设计课题硬件系统的设计 (2)2.1设计课题硬件系统各模块功能简要介绍 (2)2.2设计课题电路原理图、PCB图、元器件布局图 (2)2.3设计课题元器件清单 (5)3设计课题软件系统的设计 (6)3.1设计课题使用单片机资源的情况 (6)3.2设计课题软件系统各模块功能简要介绍 (6)3.3设计课题软件系统程序流程框图 (6)3.4设计课题软件系统程序清单 (10)4设计结论、仿真结果、误差分析、教学建议 (21)4.1设计课题的设计结论及使用说明 (21)4.2设计课题的仿真结果 (21)4.3设计课题的误差分析 (22)4.4设计体会 (22)4.5教学建议 (22)结束语 (23)参考文献 (24)致谢 (25)附录 (26)1 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。

单片机c 语言编程时钟及闹钟程序

单片机c 语言编程时钟及闹钟程序

一·功能1、计时功能,数码管显示数值从00:00:00--23:59:59循环替换,且周期时间与实际时间吻合。

2、定时闹钟功能,按下“定时”键后,可以设定所需要的任意时间,定时完成后,当到达设定时间后,蜂鸣器发声。

3、调整时间功能,根据此项功能可将时钟调至正确的时间。

4、查看定时功能,当设定完成后可以查看上次定时的时间,且能在此基础上进行重新定时。

二·按键说明设定键:按一次开始设定时间,并将设定过程显示在数码管上。

若未按此键,则其他按键无效。

设定过程中,再按一次此键,定时结束,数码管显示返回时钟。

当第一次按下设定键时,显示值为00:00:00,在此基础上调节定时时间。

第一次设定完成后,以后再按设定键,显示初值则为上次定时的时间。

确定键:在定时过程中按下此键,则保留当前设定的时间为定时时间。

若定时过程未按此键,定时无效。

向上键:按下此键,使得当前设定值在现有数值上加一,当加至满位时,当前值变为零。

向下键:按下此键,使得当前设定值在现有数值上减一,当减至零时,当前值变为满位减一。

向左键:按下此键,使得设定值移向左边一位,若已经在最左边,则移至最右边。

向右键:按下此键,使得设定值移向右边一位,若已经在最右边,则移至最左边。

三·具体操作演示(一)·定时及查看定时演示1.仿真开始。

如图:2、按键如图:3、按下设定键,开始设定时间,如图:4、如图所示,当前设定时位。

按向上键,使数值加一。

5、按下向右键,设定位移至分位。

6、按下向下键,使数字减一。

7、按确定键,确定当前设定的时间。

再按设定键,退出定时,开始时钟显示。

8、设定完成后按设定键,显示前次设定值,可在此基础上重新设定,也可直接再按设定键推出。

9、当时钟运行到设定时间时,蜂鸣器发声。

(二)·调整时间演示1、计时开始。

2、按照定时的方法开始设定时间,使其显示20:10:09。

3、调整到正确时间后,按下确定键不放,同时再按一下设定键,将目前设定值送入时钟,使其开始从设定值计时。

数码管时钟C语言程序

数码管时钟C语言程序
//把当天和1900年1月0日(星期日)的差称为积日,那么第y年(1900年算第0年)第x 个节气的积日是
// F = * y + 6.2 + 15.22 * x - 1.9 * sin(0.262 * x)
void Jiri(uchar whichyear,uchar jieqiNum)
uchar alarmH,alarmM,alarmS,alarmKey,alarmKey_save;//闹钟信息用变量
uchar searchYH,searchYL,searchM,searchD;//查询用变量
uchar secDelay,seconds,showTime;//界面显示延时用变量
uchar setFlash;bit flash01;//设置用变量,闪烁位,闪烁位数据状态
/*----------*/
/*农历变量*/
uchar Years,runYear;//距1900年的年数,闰年标志变量
uchar Spring11;uint Date11;//春节及当天距离元旦天数
uint daxiaoMonth;//存放当年全部大小月信息
float Days;//积日
/*=======================================================*/
/*声明自定义函数*/
void display(void);//声明显示函数
void readDate(void);//声明从DS12C887+读取公历日期和时间函数
if(thisNum<10){thisNum+=100;}
toShow[2]=thisNum/10;//显示地支
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

if( P1_2 == 0 )
{
key2 = 1;
if(hour++ >=24 ) hour = 0;
//结束“循环2”,修改显示
EA=1;
P1_0=0; //所有中断允许//
while(1)
{
Buff(); //赋值初始化//
for(i=0;Biblioteka <8;i++) //扫描8段数码管//
buffer[2]=10;
buffer[3]=minute/10; //分十位//
buffer[4]=minute%10; //分个位//
buffer[5]=10;
buffer[6]=second/10; //秒十位//
TL0= ~10000%256; //初始化低8位 总共定时10毫秒 // //0Xf0;
TR0=1; //启动定时器//
ET0=1; //定时器0中断允许//
}
}
/*P31=1; //复位键函数//
if(key3==1)
{if(P1_1==1)key3=0;}
else{
if(P1_1==0)
{key3=1;
P0=0;break;
}
}*/
} //while函数结束//
} //主函数结束//
unsigned char key1 = 0; // 分调整键//
unsigned char key2 = 0; //时调整键
unsigned char key3 = 0; //复位键//
void delay(unsigned int i) //延时函数//
count++;
if(count>=100)
{
count=0;
second++; //10毫秒累积100次...秒加1//
}
}
buffer[7]=second%10; //秒个位//
}
void main() //主函数//
{
unsigned char i;
TMOD=0x01; //选择定时模式1//
TH0= ~10000/256; //选择定时器0初始化高8位// //0Xd8;
{
minute++;
second=0;
if(minute>=60) //分逢60进位//
{
hour++;
minute=0;
if(hour>=24) //时逢24进位//
{
hour=0;
}
}
}
P3_0=1; //秒位调整//
if (key0==1)
{ if(P1_4==1)key0=0;
}
else{
if(P1_4==0)
{
unsigned char j;
for(;i>0;i--)
for(j=0;j<100;j++);
}
void Buff() //数码显示//
{
buffer[0]=hour/10; //时十位//
buffer[1]=hour%10; //时个位//
{ //等松键
if( P1_2 == 1 ) key2=0;
}
else{ //未按键
void timer0() interrupt 1 //中断子程序固定函数 使用定时器0,寄存器组1//
{
TH0=~10000/256 ; // 0Xd8;
TL0=~10000%256; // 0Xf0;
}
else{ //未按键
if( P1_3== 0 )
{
key1 = 1;
if(minute++ >= 60 ) minute = 0;
}
}
P3_2 = 1; //时位调整//
if( key2 == 1 )
{
P0=~xuan[buffer[i]]; //显示当前所需显示的数字//
P2=~b[i];
delay(10);
P2=0x00; //断显//
}
if(second>=60) //秒逢60进位//
unsigned char buffer[8];
unsigned char hour=0,minute=0,second=0; //显示初始化//
unsigned int count; //数字垒加//
unsigned char key0 = 0; // 秒调整键//
{key0=1;
if(second++>=60)second=0;
}
}
P3_1= 1; //分位调整//
if( key1== 1 )
{ if( P1_3 == 1 ) key1=0;
#include<at89x52.h>
unsigned char xuan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//数字显示//
unsigned char b[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管阴极控制键//
相关文档
最新文档