標(biāo)題:
Proteus仿真51單片機電子日歷時鐘萬年歷+矩陣按鍵+數(shù)碼管+設(shè)置時間
[打印本頁]
作者:
1723000545
時間:
2020-6-29 12:15
標(biāo)題:
Proteus仿真51單片機電子日歷時鐘萬年歷+矩陣按鍵+數(shù)碼管+設(shè)置時間
1.數(shù)碼管顯示
2.時間和日期每隔5秒自動切換一次
3.數(shù)碼管顯示
4.可設(shè)置時間和日期
5.矩陣按鍵控制,可更改
6.自動判斷閏年
1.按下切換按鍵可切換當(dāng)前顯示時間還是日期
2.按下設(shè)置按鍵進入時間和日期的設(shè)置,設(shè)置哪一項,哪一項下面就會出現(xiàn)兩個點
3.再次按下設(shè)置按鍵即可推出設(shè)置繼續(xù)運行
4.自動判斷閏年
5.日期更正(比如當(dāng)前為5月31日,當(dāng)切換月份時,切換到6月,則天數(shù)自動由31改為30)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
~IRRB}@UJ68L~X`5H79Z[[8.png
(64.06 KB, 下載次數(shù): 91)
下載附件
2020-6-29 12:13 上傳
單片機源程序如下:
#include <reg52.h>
sbit key0 = P3^0; //年份 時間 切換
sbit key1 = P3^1; //設(shè)置
sbit key2 = P3^2; //增加
sbit key3 = P3^3; //減少
sbit led0 = P3^7; //時間日期設(shè)置指示燈
sbit led1 = P3^6; // 正常運行指示燈
sbit led2 = P3^5; // 當(dāng)前為時間指示燈
sbit led3 = P3^4; // 閏年指示燈
sbit s1 = P0^0;
sbit s2 = P0^1;
sbit s3 = P0^2;
typedef unsigned char uchar;
typedef unsigned int uint;
uint smg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar time[8],date[8];
int year = 2020;
char month=6,day=28,hour=18,min=22,s=0;
uchar t=0; //日期和時間切換控制變量
void delay(uint i); //延時函數(shù)
void smg_show(char num_[]); //數(shù)碼管顯示函數(shù)
int keyscan(); //矩陣按鍵掃描函數(shù)
void data_edit(); //數(shù)碼管數(shù)據(jù)編輯函數(shù)
char year_judge(); //閏年判斷函數(shù)
void relationship(); //日期時間關(guān)系編輯函數(shù)
void set_time(uchar change); //時間日期設(shè)置函數(shù)
void Timer0Init(); //定時器0初始化函數(shù)
void main()
{
uchar key;
uchar change=0; //為1,顯示日期 為0,顯示時間
Timer0Init(); //定時器0初始化
led1 = 0; //正常運行指示燈
year_judge();
//led3 = 0;
while(1)
{
key = keyscan(); //掃描矩陣按鍵
if(t==5)
{
change = ~change;
t = 0;
}
if(change)led2 = 1;
else led2 = 0;
if(key == 0)
{
led1 = 1;
set_time(change); //時間日期設(shè)置函數(shù)
led1 = 0;
}
if(key == 1)
{
change = ~change;
t = 0;
}
relationship(); //時間日期關(guān)系控制
data_edit();//數(shù)碼管參數(shù)編輯函數(shù)
if(s%2)
{
time[2] = 11;
time[5] = 11;
}
if(change)
smg_show(date); //數(shù)碼管顯示函數(shù)
else
smg_show(time); //數(shù)碼管顯示函數(shù)
}
}
/*****************************************
延時函數(shù)
*****************************************/
void delay(uint x)
{
uchar y;
for(x;x>0;x--)
for(y=110;y>0;y--);
}
/*****************************************
數(shù)碼管顯示函數(shù)
*****************************************/
void smg_show(char num_[])
{
char i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:
s3 = 0;s2 = 0;s1 = 0;break;
case 1:
s3 = 0;s2 = 0;s1 = 1;break;
case 2:
s3 = 0;s2 = 1;s1 = 0;break;
case 3:
s3 = 0;s2 = 1;s1 = 1;break;
case 4:
s3 = 1;s2 = 0;s1 = 0;break;
case 5:
s3 = 1;s2 = 0;s1 = 1;break;
case 6:
s3 = 1;s2 = 1;s1 = 0;break;
case 7:
s3 = 1;s2 = 1;s1 = 1;break;
}
P1=~smg[num_[i]];
delay(10);
P1=0xff;
delay(10);
}
}
/*****************************************
矩陣按鍵函數(shù)
*****************************************/
int keyscan()
{
uchar i,j=0;
uchar d = 50;
uint k = 0xff;
P2 = 0XF0;
if((P2&0xf0)==0xf0)
return k;
if((P2&0xf0)==0xf0)
return k;
for(i=0;i<4;i++)
{
P2=~(1<<i);
k=(P2&0xf0);
if(k!=0xf0)
{
while((k&(1<<(j+4))))
j++;
k = i*4+j;
P2 = 0xf0;
while(P2!=0xf0);
break;
}
}
return k;
}
/*****************************************
數(shù)據(jù)編輯函數(shù)函數(shù)
*****************************************/
void data_edit()
{
time[0] = hour/10;
time[1] = hour%10;
time[2] = 10;
time[3] = min/10;
time[4] = min%10;
time[6] = s/10;
time[7] = s%10;
time[5] = 10;
date[0] = year/1000;
date[1] = year/100%10;
date[2] = year/10%10;
date[3] = year%10;
//date[2] = 10;
date[4] = month/10;
date[5] = month%10;
//date[5] = 10;
date[6] = day/10;
date[7] = day%10;
}
復(fù)制代碼
全部資料51hei下載地址:
電子日歷時鐘.zip
(73.82 KB, 下載次數(shù): 238)
2020-7-4 11:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
jnlaok
時間:
2020-7-3 14:41
感謝樓主提供的全面素材,為我等初學(xué)者帶來福音。
作者:
mememezzx
時間:
2020-9-15 21:50
請問下,keyscan函數(shù)里,
if((P2&0xf0)==0xf0)
return k;
寫了兩遍,是寫錯了嗎
作者:
6620680
時間:
2020-12-4 11:24
早幾年這類產(chǎn)品銷量不錯!
作者:
呆憨
時間:
2020-12-11 09:32
感謝樓主的分享,對我有許多的幫助
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1