基于51单片机的升级时钟程序
单片机源程序如下:
- #include "reg52.h" //单片机头文件
- #define uchar unsigned char //定义uchar 代替 unsigned char
- #define uint unsigned int
- sbit duan=P2^6; //位定义
- sbit wei=P2^7;
- sbit k1=P3^4;
- sbit k2=P3^5;
- sbit k3=P3^6;
- sbit k4=P3^7;
- void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5); //函数声明
- void delay(uchar mss);
- uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴数码管显示数字
- uchar ms=0,mg=0,fs=0,fg=0,ss=0,sg=0,m=0,f=0,s=0; //定义变量
- //主函数
- main()
- { P0=0x00;
- duan=1;
- duan=0;
- P0=0xc0;
- wei=1;
- wei=0;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TMOD=0x01; //设置定时器工作方式---定时器0在工作模式1下工作,即一个16位的计时器
- TR0=1; //开定时器0
- ET0=1; //开中断1即定时器中断0
- EA=1; //开总中断
- while(1)
- {
- if(k1==0) //按键k1为低电频
- {
- delay(40); //延时去抖
- if(k1==0) //判断k1是否按下
- { //等待按键释放
- while(k1!=1);
- f++; //分钟自加
- m=0; //秒置0
- if(f==60) //分钟为60,自动置0,小时自加1
- {
- f=0;
- s++;
- if(s==24)
- {s=0;}
- }
- }
-
- }
- if(k2==0)
- {
- delay(40);
- if(k2==0)
- {
- while(k2!=1);
- f--;
- m=0;
- if(f==-1)
- {
- f=59;
- s--;
- if(s==-1)
- {s=0;}
- }
- }
-
- }
- if(k3==0)
- {
- delay(40);
- if(k3==0)
- {
- while(k3!=1);
- s++;
- m=0;
- if(s==24)
- {
- {
- s=0;
- }
- }
- }
- }
- if(k4==0)
- {
- delay(40);
- if(k4==0)
- {
- while(k4!=1);
- s--;
- m=0;
- if(s==-1)
- {
- {s=23;}
- }
- }
-
- }
- mg=m%10; //秒个位是秒数除以10的余数
- ms=m/10; //秒十位是秒数除以十的商
- fg=f%10;
- fs=f/10;
- sg=s%10;
- ss=s/10;
-
- display(mg,ms,fg,fs,sg,ss); //调用显示函数,实参为秒的十位个位...
- }
-
- }
- void timer0() interrupt 1 //中断函数
- {
- int num; //num是个标志
- TH0=(65536-50000)/256; //计时器赋初值
- TL0=(65536-50000)%256;
- num++; //当num==20即1s 进入秒自加,num清0
- if(num==20)
- {
- m++;
- num=0;
- if(m==60) //秒自加到60自动清0,分自加
- {
- m=0;
- f++;
- if(f==60)
- {
- f=0;
- s++;
- if(s==24)
- {
- s=0;
- }
- }
- }
- }
- }
- void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5) //显示函数
- {
-
- P0=tab[a0]; //P0口赋值tab[a0]即对应实参tab[mg]秒个位显示
- duan=1; //开段选即读到tab[mg]到数码管上
- duan=0; //关段选
- P0=0xdf; //P0赋0xdf即1101 1111
- wei=1; //开位选,即第六个数码管被选通
- wei=0; //关位选
- // delay(10);
- delay(5); //延时
- P0=tab[a1];
- duan=1;
- duan=0;
- P0=0xef;
- wei=1;
- wei=0;
- delay(5);
- P0=0xf7;
- wei=1;
- wei=0;
- P0=tab[a2];
- duan=1;
- duan=0;
- delay(5);
- P0=0xfb;
- wei=1;
- wei=0;
- P0=tab[a3];
- duan=1;
- duan=0;
- delay(15);
- P0=0xfd;
- wei=1;
- wei=0;
- P0=tab[a4];
- duan=1;
- duan=0;
- delay(5);
- P0=0xfe;
- wei=1;
- wei=0;
- P0=tab[a5];
- duan=1;
- duan=0;
- delay(5);
-
- }
- void delay(uchar mss) //延时函数
- {
- int i,j;
- for(i=mss;i>0;i--)
- {
- for(j=30;j>0;j--);
- }
- }
复制代码
所有资料51hei提供下载:
时钟.zip
(28.81 KB, 下载次数: 20)
|