標(biāo)題:
基于51單片機(jī)的時鐘設(shè)計,包涵源碼及仿真電路
[打印本頁]
作者:
13321764316
時間:
2018-10-29 15:38
標(biāo)題:
基于51單片機(jī)的時鐘設(shè)計,包涵源碼及仿真電路
這是我這個周用單片機(jī)做的時鐘,用數(shù)碼管顯示,用定時器來即時。
Clock.zip
(93.36 KB, 下載次數(shù): 15)
2018-10-29 15:34 上傳
點(diǎn)擊文件名下載附件
程序源碼及仿真電路
下載積分: 黑幣 -5
QQ截圖20181029153400.png
(112.53 KB, 下載次數(shù): 58)
下載附件
2018-10-29 15:35 上傳
單片機(jī)源程序:
#include"reg51.h"
#define uchar unsigned char
uchar code scan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff,0xbf};
uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
uchar data timedata[3]={0x00,0x00,0x00};
//timedata[0]: 秒計數(shù) timedata[1] :分計數(shù) timedata[2] :小時計數(shù)
uchar data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
//ms50:每過50ms加一 con按鍵按下計數(shù) 為1 改變分鐘 為2改變小時
//con1 con2
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
void delay1ms(int t)
{
unsigned char a,b;
for(b=0;b<t;b++)
for(a=0;a<120;a++);
}
void keyscan() //按鍵檢測函數(shù)
{
EA=0; //關(guān)閉總中斷
if(key0==0) //判斷按鍵是否按下
{
delay1ms(10); //延時消抖
while(key0==0); //等待按鍵釋放
con++; //計數(shù)值加
TR0=0; //關(guān)閉定時器0
ET0=0; //關(guān)閉定時器0中斷
if(con>=3) //若按下3次
{
con=0; //計數(shù)值清0
TR0=1; //開啟定時器
ET0=1; //開啟定時器中斷
}
}
if(con!=0) //若按鍵0按下一次
{
if(key1==0) //如果按鍵1按下
{
delay1ms(10); //延時消抖
while(key1==0); //等待按鍵釋放
timedata[con]++; //(分/時)自加
if(con==2) //若按下兩次
con1=24;
else con1=60;
if(timedata[con]>=con1) //若加到最大值則將0賦值給變量
timedata[con]=0;
}
}
if(con!=0)
{
if(key2==0)
{
delay1ms(10);
while(key2==0);
timedata[con]--;
if(con==2)
con1=23;
else con1=59;
if(timedata[con]<=0)
timedata[con]=con1; //若減到最小值0則將最大值付給變量
}
}
EA=1;
}
void scan()
{
char k;
dis[0]=timedata[0]%10; //顯示秒個位數(shù)據(jù)
dis[1]=timedata[0]/10; //顯示秒十位數(shù)據(jù)
dis[3]=timedata[1]%10; //顯示分個位數(shù)據(jù)
dis[4]=timedata[1]/10; //顯示分十位數(shù)據(jù)
dis[6]=timedata[2]%10; //顯示時個位數(shù)據(jù)
dis[7]=timedata[2]/10; //顯示時十位數(shù)據(jù)
for(k=0;k<8;k++)
{
P0=~dis_7[dis[k]]; //段選端
P2=scan_con[k]; //位選端
delay1ms(1);
P2=0xff; //消影
}
}
void main(void)
{
TMOD=0X01; //開啟定時器0
TH0=0X3C; //選擇工作方式2
TL0=0XB0; //載入高位初值
TR0=1; //載入低位初值
ET0=1; //開啟定時器中斷0
EA=1; //全局中斷使能
while(1)
{
scan();
keyscan();
}
}
void time_intt0(void) interrupt 1
{
ET0=0; //關(guān)閉定時器0中斷
TR0=0; //
TH0=0X3C;
TL0=0XB0;
TR0=1; //
ms50++; //50毫秒計數(shù)
if(ms50==20) //1秒
{
ms50=0x00;
timedata[0]++;
if(timedata[0]==60)
{
timedata[0]=0;
timedata[1]++;
if(timedata[1]==60)
{
timedata[1]=0;
timedata[2]++;
if(timedata[2]==24)
{
timedata[2]=0;
}
}
}
}
ET0=1;
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1