標(biāo)題:
簡易數(shù)字鐘proteus仿真與單片機(jī)代碼
[打印本頁]
作者:
LAUNHGN
時(shí)間:
2018-10-11 10:34
標(biāo)題:
簡易數(shù)字鐘proteus仿真與單片機(jī)代碼
簡易數(shù)字鐘仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(19.22 KB, 下載次數(shù): 42)
下載附件
2018-10-11 15:01 上傳
單片機(jī)源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit s1=P2^0; //數(shù)碼管位選控制端
sbit s2=P2^1;
sbit s3=P2^2;
sbit s4=P2^3;
sbit s5=P2^4;
sbit s6=P2^5;
sbit s7=P2^6;
/*k1設(shè)置時(shí)間,k2定時(shí)。k1,k2使用不自動(dòng)彈起按鍵。
k3時(shí)分秒選擇,k4加數(shù)字,k5減數(shù)字。*/
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
uchar count=0,sec,min,hour,ss=0;s=60,m=60,h=24;
uchar code mum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽數(shù)碼管0-9編碼
void delayms(uint k) //延時(shí)函數(shù)
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
/*通過count獲得hour,min,sec變量值 */
void timecontrol()
{
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
hour=0;
}
}
}
void display(uchar zs,uchar zm, uchar zh) //數(shù)碼管顯示函數(shù)
{
s1=1;
P0=mum[zh/10];
delayms(5);
s1=0;
s2=1;
P0=mum[zh%10]&0x7f; // 時(shí)的個(gè)位加上小數(shù)點(diǎn)
delayms(5);
s2=0;
s3=1;
P0=mum[zm/10];
delayms(5);
s3=0;
s4=1;
P0=mum[zm%10]&0x7f; //分的個(gè)位加上小數(shù)點(diǎn)
delayms(5);
s4=0;
s5=1;
P0=mum[zs/10];
delayms(5);
s5=0;
s6=1;
P0=mum[zs%10];
delayms(5);
s6=0;
}
void keyscan_settime() //時(shí)間設(shè)置模塊
{
uchar st,mt,ht;
if(k1==0)
{
delayms(10);
if(k1==0)
{
st=sec,mt=min,ht=hour;
TR0=0; //關(guān)閉定時(shí)器
while(k1==0) //等待用戶按鍵
{
display(st,mt,ht);
if(k3==0)
{
delayms(10);
if(k3==0)
{
while(!k3);
ss++;
if(ss==3) ss=0;
}
}
/*通過ss選擇時(shí)分秒設(shè)置*/
if(k4==0) //加數(shù)
{
delayms(10);
if(k4==0)
{
while(!k4);
switch(ss)
{
case 0:st++;if(st==60)st=0;break;
case 1:mt++;if(mt==60)mt=0;break;
case 2:ht++;if(ht==24)ht=0;break;
default :;
}
}
}
if(k5==0) //減數(shù)
{
delayms(10);
if(k5==0)
{
while(!k5);
switch(ss)
{
case 0:if(st>0)st--;
else st=0;break;
case 1:if(mt>0)mt--;
else mt=0;break;
case 2:if(ht>0)ht--;
else ht=0;break;
default : ;
}
}
}
}
TR0=1;
sec=st,min=mt,hour=ht;
}
}
display(sec,min,hour);
}
void keyscan_time() //用戶定時(shí)模塊
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
s=sec;m=min;h=hour;
while(k2==0) //開始定時(shí)設(shè)置
{
display(s,m,h);
if(k3==0)
{
delayms(10);
if(k3==0)
{
while(!k3);
ss++;
if(ss==3) ss=0;
}
}
/*通過ss選擇時(shí)分秒設(shè)置*/
if(k4==0) //加數(shù)
{
delayms(10);
if(k4==0)
{
while(!k4);
switch(ss)
{
case 0:s++;if(s==60)s=0;break;
case 1:m++;if(m==60)m=0;break;
case 2:h++;if(h==24)h=0;break;
default :;
}
}
}
if(k5==0) //減數(shù)
{
delayms(10);
if(k5==0)
{
while(!k5);
switch(ss)
{
case 0:if(s>0)s--;
else s=0;break;
case 1:if(m>0)m--;
else m=0;break;
case 2:if(h>0)h--;
else h=0;break;
default : ;
} }
}
}
}
}
}
void buz()
{
if((hour==h)&&(min==m)&&(sec==s))
{
s7=0;
delayms(40);
s7=1;
delayms(40);
}
}
void zhengdian()
{
uchar i=0;
if((sec==0)&(min==0))
{
for(i=0;i<10;i++)
{
TR0=1;
buz();
delayms(20);
}
}
}
void main()
{
TMOD=0x01; //定時(shí)器0工作在方式1
TH0=(65536-45872)/256; //裝初值,50ms
TL0=(65536-45872)%256;
EA=1; //總中斷允許
ET0=1; //T0中斷允許
TR0=1; //開定時(shí)器0
while(1)
{
keyscan_settime();
keyscan_time();
buz();
zhengdian();
}
}
void T0_ms() interrupt 1 //中斷入口程序
{
TH0=(65536-45872)/256; //重新裝初值
TL0=(65536-45872)%256;
count++;
if(count==20) //判定1s時(shí)間是否已到
{
count=0;
timecontrol();
}
}
復(fù)制代碼
所有資料51hei提供下載:
簡易數(shù)字鐘.rar
(126.3 KB, 下載次數(shù): 87)
2018-10-11 10:32 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
我如果能擁抱你
時(shí)間:
2020-7-8 17:41
您好這個(gè)程序有沒有鬧鐘功能?
作者:
ZQ01
時(shí)間:
2021-10-19 16:47
這個(gè)功能有些啥?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1