标题:
单片机数字时钟Proteus仿真设计,可调时
[打印本页]
作者:
ligeyu
时间:
2019-6-24 17:48
标题:
单片机数字时钟Proteus仿真设计,可调时
这是单片机数字钟课程设计,用了一个星期的时间,附件里面包含数字钟的单片机源代码,proteus仿真工程文件都是自己原创的,请大家多多指教。
会切换显示年月日,星期闹钟显示
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(18.3 KB, 下载次数: 47)
下载附件
2019-6-25 03:55 上传
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
unsigned char code dis_tab[16]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳极0-916进制编码
unsigned char data dis_data1,dis_data2,bit_data1,bit_data2,a1,a2,a11,a22,b1,b2,b11,b22,nian=16,yue=2,ri=27,miao=5,fen=0,shi=0,xq=0;
unsigned char int_cnt=0;
unsigned char num;
unsigned char a;
unsigned char b;sbit K0=P0^0;
sbit K1=P0^1;
sbit K2=P0^2;
sbit K3=P0^3;
void mDelay(unsigned int Delay) //延时函数
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<114;i++) {;}}}
void T0_int() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
int_cnt++;
if(int_cnt==16)
{num++;int_cnt=0;
}
if(num==60)
{num=0;int_cnt=0;
a++; }
if(a==60)
{a=0;b++; b<=24;
if(b==24)
b=0; if(b==0)
{ri++;}
}
if(ri==7)
{xq++;}
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
{ri<=31;
if(ri==32){ri=1; yue++;}
}
if (yue==4||yue==6||yue==9||yue==11)
{ri<=31;
if(ri==31){ri=1;yue++;
} }
if(yue==2&&((nian+2000)%4==0&&(nian+2000)%100!=0)||(nian+2000)%400==0)
{ri<=30;if(ri==30){ri=1;yue++;}}
else if (yue==2)
{ri<=29;if(ri==29){ri=1;yue++;}}
if(yue==13)
{yue=1;if(yue==1)
{nian++;}}
if(K1==1) //K0按键是否按下
{ mDelay(5); //延时消抖
if(K1==1)
{P2=0x00;
mDelay(10);
a++;
mDelay(2);}}
if(K0==1&&K1==1)
{mDelay(5);
if(K0==1&&K1==1)
{ P2=0x00;
mDelay(10);
ri++;
a--;
mDelay(2);
}}
if(K0==1&&K2==1) //K0按键是否按下
{ mDelay(5); //延时消抖
if(K0==1&&K2==1)
{P2=0x00;
mDelay(10);
yue++;
mDelay(2);}}
if(K0==1&&K3==1) //K0按键是否按下
{ mDelay(5); //延时消抖
if(K0==1&&K3==1)
{P2=0x00;
mDelay(10);
nian++;
b--;
mDelay(2);}}
if(K3==1)
{mDelay(5);
{if(K3==1);
b++;
}
}
if(K2==1)
{mDelay(5);
if(K2==1)
{ mDelay(5);
bit_data1=0x01;
bit_data2=0x02;
P2 = 0x00;
dis_data2=miao/10;
dis_data1=miao%10;
P1= dis_tab[dis_data1]; //将显示的个位的段码送段码口
P2 = bit_data1; //将位选码送位选码口
mDelay(5);
P2 = 0x00; //熄灭数码管
P1 = dis_tab[dis_data2]; //将显示的十位的段码送段码口
P2 =bit_data2;
mDelay(10);
a1=0x04;
a2=0x08;
P2 = 0x00;
a22=fen/10;
a11=fen%10;
P1= dis_tab[a11]; //将显示的个位的段码送段码口
P2 = a1;
mDelay(5 );
P2 = 0x00; //熄灭数码管
P1 = dis_tab[a22]; //将显示的十位的段码送段码口
P2 =a2;
mDelay(10);
b1=0x10;
b2=0x20;
P2 = 0x00;
b22=shi/10;
b11=shi%10;
P1= dis_tab[b11]; //将显示的个位的段码送段码口
P2 =b1; //将位选码送位选码口
mDelay(5 );
P2 = 0x00; //熄灭数码管
P1 = dis_tab[b22]; //将显示的十位的段码送段码口
P2 =b2;
mDelay(10); }
while(K2==0){break;}
}
if(K2==1&&K3==1)
{ mDelay(5);
if(K2==1&&K3==1)
{
mDelay(10);
fen++;
b--;
}}
if(K2==1&&K1==1)
{mDelay(5);
if(K2==1&&K1==1)
{
mDelay(10);
a--;
mDelay(5) ;
shi++;
}
}
if(num==miao&&a==fen&&b==shi)
{
P3=0x00;
mDelay(27);
}
if(K0==1&&K1==1&&K2==1)
{ shi--;
yue--;
bit_data1=0x01;
bit_data2=0x02;
P2 = 0x00;
dis_data2=xq/10;
dis_data1=xq%10;
P1= dis_tab[dis_data1]; //将显示的个位的段码送段码口
P2 = bit_data1; //将位选码送位选码口
mDelay(5);
P2 = 0x00; //熄灭数码管
P1 = dis_tab[dis_data2]; //将显示的十位的段码送段码口
P2 =bit_data2;
mDelay(10);
}
}
void display()
{
if(K0==0){
bit_data1=0x01;
bit_data2=0x02;
P2 = 0x00;
dis_data2=num/10;
dis_data1=num%10;
P1= dis_tab[dis_data1]; //将显示的个位的段码送段码口
P2 = bit_data1; //将位选码送位选码口
mDelay(5);
P2 = 0x00; //熄灭数码管
P1 = dis_tab[dis_data2]; //将显示的十位的段码送段码口
P2 =bit_data2;
mDelay(10);
a1=0x04;
a2=0x08;
P2 = 0x00;
a22=a/10;
a11=a%10;
P1= dis_tab[a11]; //将显示的个位的段码送段码口
P2 = a1;
mDelay(5 );
P2 = 0x00; //熄灭数码管
P1 = dis_tab[a22]; //将显示的十位的段码送段码口
P2 =a2;
mDelay(10);
b1=0x10;
b2=0x20;
P2 = 0x00;
b22=b/10;
b11=b%10;
P1= dis_tab[b11]; //将显示的个位的段码送段码口
P2 =b1; //将位选码送位选码口
mDelay(5 );
P2 = 0x00; //熄灭数码管
P1 = dis_tab[b22]; //将显示的十位的段码送段码口
P2 =b2;
mDelay(10);
}
else
{
bit_data1=0x01;
bit_data2=0x02;
P2=0x00;
dis_data2=ri/10;
dis_data1=ri%10;
P1= dis_tab[dis_data1]; //将显示的个位的段码送段码口
P2 = bit_data1; //将位选码送位选码口
mDelay(5 );
P2 = 0x00; //熄灭数码管
P1 = dis_tab[dis_data2]; //将显示的十位的段码送段码口
P2 =bit_data2;
mDelay(10);
a1=0x04;
a2=0x08;
P2 = 0x00;
a22=yue/10;
a11=yue%10;
P1= dis_tab[a11]; //将显示的个位的段码送段码口
P2 = a1;
mDelay(5 );
P2 = 0x00; //熄灭数码管
P1 = dis_tab[a22]; //将显示的十位的段码送段码口
P2 =a2;
mDelay(10);
b1=0x10;
b2=0x20;
P2 = 0x00;
b22=nian/10;
b11=nian%10;
P1= dis_tab[b11]; //将显示的个位的段码送段码口
P2 =b1; //将位选码送位选码口
mDelay(5 );
P2 = 0x00; //熄灭数码管
P1 = dis_tab[b22]; //将显示的十位的段码送段码口
P2 =b2;
mDelay(10);
while(!K0){break;} //等待K0按键释放
}
}
void main()
{
TMOD=0X01; /*中断初始化*/
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //中断总开关
ET0=1; //请求中断
TR0=1; //允许中断
int_cnt=0;
while(1)
{ //关闭其他位
display(); //调用函数
}
}
复制代码
所有资料51hei提供下载:
数字钟.zip
(91.31 KB, 下载次数: 44)
2019-6-24 17:53 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1