利用51微控制器做一個簡易時鐘
阿新 • • 發佈:2019-02-10
利用獨立鍵盤,數碼管完成一個簡易的時鐘,按鍵一可以修改時間,按鍵二可以設定鬧鐘,按鍵三進行加一操作,按鍵四進行減一操作。
主函式:
void main()
{
bsp_init();
while(1)
{
TimeTim(); //正常時間在走
bsp_KeyScan(); //鍵盤掃描看哪個功能鍵被按下
bsp_KeyProc(keyvalue); //根據鍵值進行相應的功能處理
SetValueShow(); //數碼管上顯示的值
ShowSegCC() ; //顯示在數碼管上
bsp_CheckAlarm(); //鬧鐘檢查
}
}
時鐘模組:
unsigned char hour = 2, min = 2, sec = 3; //設定時間初值
unsigned char ahour = 0, amin = 0, asec = 0; //設定鬧鐘初值
unsigned char time = 0;
void delay_us(unsigned char t)
{
while(--t);
}
void delay_ms(unsigned int t) //t最大為255
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}
void TimeTim()
{
if(settype == 0 && alarmvalue == 0) //當不在鬧鐘狀態也不在修改時間狀態的時候時間正常走
{
if(count == 20)
{
count = 0;
sec++;
if(sec == 60)
{
sec = 0 ;
min++;
if(min == 60)
{
min = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
}
}
}
}
}
//檢查時間是否到了鬧鐘時間
void bsp_CheckAlarm(void)
{
if((hour == ahour) && (min == amin) && (sec == asec))
{
hour = 0;
min = 0;
sec = 0;
}
}
鍵盤模組:
sbit SETTIME = P0^0; //修改時間
sbit SETALARM = P0^1; //設定鬧鐘
sbit INC = P0^2; //加1
sbit DEC = P0^3; //減1
unsigned char keyvalue = 0;
unsigned char settype = 0; //0是初始狀態正常顯示,1是修改秒,2是修改分,3是修改時
unsigned char alarmvalue = 0; //0是初始狀態,1是修改秒,2是修改分,3是修改時
void bsp_KeyScan(void)
{
if(SETTIME == 0)//K1按鍵被按下
{
keyvalue = 1;
while(!SETTIME);//等待按鍵釋放
}
if(SETALARM == 0)
{
keyvalue = 2;
while(!SETALARM);
}
if(INC == 0)
{
keyvalue = 3;
while(!INC);
}
if(DEC == 0)
{
keyvalue = 4;
while(!DEC);
}
}
void bsp_KeyProc(unsigned char keyv)
{
if(keyv == 1)
{
settype++;
if(settype == 4)
{
settype = 0;
}
keyvalue = 0; //鍵值要清0!!!
}
if(keyv == 2)
{
alarmvalue++;
if(alarmvalue == 4)
{
alarmvalue = 0;
}
keyvalue = 0;
}
if(keyv == 3)
{
timeadd();
keyvalue = 0;
}
if(keyv == 4)
{
timedec();
keyvalue = 0;
}
}
void timeadd()
{
//設定時間加1
if(settype == 1)
{
if(sec < 59)
{
sec++;
}
else
{
sec = 0;
}
}
else if(settype == 2)
{
if(min < 59)
{
min++;
}
else
{
min = 0;
}
}
else if(settype == 3)
{
if(hour < 23)
{
hour++;
}
else
{
hour = 0;
}
}
//設定鬧鐘加1
if(alarmvalue == 1)
{
if(asec < 59)
{
asec++;
}
else
{
asec = 0;
}
}
else if(alarmvalue == 2)
{
if(amin < 59)
{
amin++;
}
else
{
amin = 0;
}
}
else if(alarmvalue == 3)
{
if(ahour < 23)
{
ahour++;
}
else
{
ahour = 0;
}
}
}
void timedec()
{
//設定時鐘減1
if(settype == 1)
{
if(sec > 0)
{
sec--;
}
else
{
sec = 59;
}
}
else if(settype == 2)
{
if(min > 0)
{
min--;
}
else
{
min = 59;
}
}
else if(settype == 3)
{
if(hour > 0)
{
hour--;
}
else
{
hour = 23;
}
}
//設定鬧鐘減1
if(alarmvalue == 1)
{
if(asec > 0)
{
asec--;
}
else
{
asec = 59;
}
}
else if(alarmvalue == 2)
{
if(amin > 0)
{
amin--;
}
else
{
amin = 59;
}
}
else if(alarmvalue == 3)
{
if(ahour > 0)
{
ahour--;
}
else
{
ahour = 23;
}
}
}
數碼管模組:
#define SEGPORT P1
sbit WEI = P2^1;
sbit DUAN = P2^0;
unsigned char code TableCA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽數碼管段選碼錶,無小數點
unsigned char code TableSel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共陰數碼管位選碼錶
unsigned char code TableCC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰數碼管段選碼錶,無小數點
unsigned char Show[8] = {0};
//unsigned int showvalue = 0;
//unsigned int time = 0;
void ShowSegCA(unsigned char t)
{
SEGPORT = TableCA[t];
}
//1到255顯示
void ShowSegCC(void)
{
static unsigned char i = 0;
//消隱
SEGPORT = 0x00;
DUAN = 1;
DUAN = 0;
//選通位碼
WEI = 1;
SEGPORT = TableSel[i];
WEI = 0;
//選通位碼
DUAN = 1;
SEGPORT = Show[i];
DUAN = 0;
i++;
if(i == 8)
{
i = 0;
}
delay_ms(1);
}
void SetValueShow(void)
{
if(alarmvalue == 0) //當不在鬧鐘狀態時數碼管顯示正常的時間
{
Show[0] = TableCC[hour/10];
if(settype == 3)
Show[1] = TableCC[hour%10] | 0x80;
else
Show[1] = TableCC[hour%10];
Show[2] = 0x40;
Show[3] = TableCC[min/10];
if(settype == 2)
Show[4] = TableCC[min%10] | 0x80;
else
Show[4] = TableCC[min%10];
Show[5] = 0x40;
Show[6] = TableCC[sec/10];
if(settype == 1)
Show[7] = TableCC[sec%10] | 0x80;
else
Show[7] = TableCC[sec%10];
}
//在鬧鐘狀態數碼管顯示鬧鐘設定的時間
else
{
Show[0] = TableCC[ahour/10];
if(alarmvalue == 3)
Show[1] = TableCC[ahour%10] | 0x80;
else
Show[1] = TableCC[ahour%10];
Show[2] = 0x40;
Show[3] = TableCC[amin/10];
if(alarmvalue == 2)
Show[4] = TableCC[amin%10] | 0x80;
else
Show[4] = TableCC[amin%10];
Show[5] = 0x40;
Show[6] = TableCC[asec/10];
if(alarmvalue == 1)
Show[7] = TableCC[asec%10] | 0x80;
else
Show[7] = TableCC[asec%10];
}
}
定時器模組:
unsigned char count = 0;
void Timer0_Init(void)
{
TMOD |= 0x01;
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0(void) interrupt 1
{
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
count++;
}