標題:
基于單片機6個數(shù)碼管顯示的數(shù)字鐘程序
[打印本頁]
作者:
L.G.E
時間:
2022-4-8 23:57
標題:
基于單片機6個數(shù)碼管顯示的數(shù)字鐘程序
這是我上個月寫的,因為第一次寫所以挑了個簡單的數(shù)字鐘練下手。
附件里包含代碼和仿真圖。
屏幕截圖 2022-04-08 235205.png
(62.79 KB, 下載次數(shù): 50)
下載附件
2022-4-8 23:57 上傳
單片機源程序如下:
#include<reg51.h>
sbit no_off = P1^0; //該按鍵用于暫停計時,設置時間
sbit select = P1^1; //該按鍵選擇調(diào)秒,分鐘,還是調(diào)小時,上電默認選擇秒
sbit add = P1^2; //該按鍵往上調(diào)
sbit sub = P1^3; //該按鍵往下調(diào)
sbit set = P1^4; //該按鍵用于設置鬧鐘
sbit led = P3^1; //設置了鬧鐘,該指示燈亮,否則不亮
sbit beep = P3^7; //用于設置鬧鐘
unsigned char state = 0; //匹配選擇調(diào)秒、調(diào)分或者調(diào)時的狀態(tài)
unsigned char hour = 0;
unsigned char min = 0;
unsigned char sec = 0;
unsigned char set_hour=0;
unsigned char set_min=0;
unsigned char count = 0;
unsigned char num=0; //該變量用來設置led閃爍,定時時間到,led閃爍1秒鐘
unsigned char disp[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽數(shù)碼管字形碼
void delay(unsigned int k);
void scan(void);
void alarm(void);
void display(void);
void main(void)
{
TMOD=0x11;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TH1=(65535-500)/256;
TL1=(65535-500)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
led=1;
while(1)
{
scan();
display();
}
}
void delay(unsigned int k) //延時
{
unsigned int i;
for(i=0;i<k;i++);
}
void scan(void) //按鍵掃描
{
if(no_off==0)
{
delay(1200);
if(no_off==0) {TR0=~TR0;}
while(!no_off);
}
if(select==0)
{
delay(1200);
if(select==0)
{
state++;
if(state==3) state=0;
}
while(!select);
}
if(add==0)
{
delay(1200);
if(add==0)
{
switch(state)
{
case 0:{ sec++; if(sec==60) sec=0;break;}
case 1:{ min++; if(min==60) min=0;break;}
case 2:{ hour++; if(hour==24) hour=0;break;}
default : ;
}
}
while(!add);
}
if(sub==0)
{
delay(1200);
if(sub==0)
{
switch(state)
{
case 0:{ sec--; if(sec==255) sec=59;break;}
case 1:{ min--; if(min==255) min=59;break;}
case 2:{ hour--; if(hour==255) hour=23;break;}
default : ;
}
}
while(!sub);
}
if(set==0)
{
delay(1200); //消抖
if(set==0)
{
led=~led;
set_hour=hour; //設置鬧鐘的小時
set_min=min; //設置鬧鐘的分鐘
while(!set); //等待按鍵釋放
}
}
}
void display(void) //數(shù)碼管掃描顯示函數(shù)
{
unsigned char i;
for(i=0;i<6;i++)
{
switch(i)
{
case 0: {P0=disp[hour/10];P2=0x01;break;}
case 1: {P0=disp[hour%10];P2=0x02;break;}
case 2: {P0=disp[min/10];P2=0x04;break;}
case 3: {P0=disp[min%10];P2=0x08;break;}
case 4: {P0=disp[sec/10];P2=0x10;break;}
case 5: {P0=disp[sec%10];P2=0x20;break;}
}
delay(200);
P0=0xff; //消隱
}
}
void time(void) interrupt 1 //定時1s
{
EA=0;TR0=0;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(count==20)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
if((min==set_min)&&(hour==set_hour)&&(led==0)&&(TR0=1)) TR1=1; //時間到,鬧鐘響
if((min==set_min+1)&&(hour==set_hour)) {TR1=0;led=1;} //鬧鐘響一分鐘后關(guān)閉,同時關(guān)閉指示燈
EA=1;TR0=1;
}
void alarm() interrupt 3 //鬧鐘響應
{
EA=0;TR1=0;
TH1=(65535-500)/256;
TL1=(65535-500)%256;
beep=~beep;
num++;
if(num==250)
{
num=0;
led=~led; //led燈閃爍
}
EA=1;TR1=1;
}
復制代碼
Keil代碼下載:
數(shù)字鐘.zip
(92.47 KB, 下載次數(shù): 31)
2022-3-31 18:39 上傳
點擊文件名下載附件
動態(tài)顯示、中斷
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1