標(biāo)題: 基于DS1302時(shí)鐘液晶12864顯示2路鬧鐘仿真及源程序 [打印本頁]
作者: bbxyliyang 時(shí)間: 2023-11-12 09:51
標(biāo)題: 基于DS1302時(shí)鐘液晶12864顯示2路鬧鐘仿真及源程序
一、系統(tǒng)方案
1、本設(shè)計(jì)采用51單片機(jī)作為主控器。
2、DS1302采集年月日時(shí)分秒送到液晶12864顯示。
3、按鍵年月日時(shí)分秒,兩路鬧鐘。
1.png (5.74 KB, 下載次數(shù): 21)
下載附件
2023-11-12 09:51 上傳
二、硬件設(shè)計(jì)
原理圖如下:
2.png (68.84 KB, 下載次數(shù): 26)
下載附件
2023-11-12 09:51 上傳
三、單片機(jī)軟件設(shè)計(jì)
1、首先是系統(tǒng)初始化
uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定義時(shí)間變量 秒 分 時(shí) 日 月 年
uchar alarm_time[2] = { 10, 6}; //鬧鐘設(shè)置 alarm_time[0]: 分鐘 alarm_time[1] :小時(shí)
uchar alarm_time2[2] = { 15, 7};
Lcd_Initial(); //LCD初始化
Clock_Fresh( clock_time ); //我把時(shí)間刷新放在這里,proteus會調(diào)用當(dāng)前系統(tǒng)時(shí)間,
Clock_Initial( clock_time ); //時(shí)鐘初試化
/***********************中斷初始化***************************/
EA = 1; //開總中斷
ET0 = 1; //Timer0 開中斷
TMOD = 0x01; //Timer0 工作方式 1
TH0 = 0x3c;
TL0 = 0XB0; //延時(shí) 50 ms
2、液晶顯示程序
void showXY(uchar row,uchar col,uchar x,uchar y,uchar *tab){
uchar i,j;
bit right;
if(col<64){right=0;}
else {col-=64;right=1;}
for(i=0;i<y;i++){
if(right)cs1=1,cs2=0;
else cs1=0,cs2=1;
Lcd_Write_Command(addX0+row+i);
Lcd_Write_Command(addY0+col);
for(j=0;j<x;j++){
if(col+j<64)Lcd_Write_Byte(tab[i*x+j]);
else if(right==0)
{
cs1=1,cs2=0;
Lcd_Write_Command(addX0+row+i);
Lcd_Write_Command(addY0+(col+j-64));
Lcd_Write_Byte(tab[i*x+j]);
}
}
}
}
/* 返回一個(gè)8*16字符索引位置 */
uchar enN(uchar *s){
uchar i;
for(i=0;zm8x16_index[ i]!=0;i++)
[ i] if(zm8x16_index[ i]==s[0])break;
return i;
}
/* 返回一個(gè)16*16字符索引位置 */
uchar cnN(uchar *s){
uchar i;
for(i=0;zm16x16_index[ i]!=0;i+=2)
if(zm16x16_index[ i]==*s&&zm16x16_index[i+1]==*(s+1))break ;
return i/2;
}
/* 顯示中英文字符串 */
void showStr(uchar row,uchar col,uchar *s)
{
uchar i;
for(i=0;s[ i]!=0;i++){
if(s[ i]<0x80){
showXY(row,col,8,2,zm8x16_Table[enN(&s[ i])]);
col+=8;
}else{
showXY(row,col,16,2,zm16x16_Table[cnN(&s[ i])]);
col+=16;i+=1;
}
if(col>120)
{
col=0;
row+=2;
}
}
}
3、按鍵程序
/********************************************************************************************
* 函數(shù)名稱:Key_Idle()
* 功 能:鍵盤松開
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void Key_Idle()
{
while( ( P1 & 0x0f ) != 0x0f );
}
/********************************************************************************************
* 函數(shù)名稱:Key_Scan()
* 功 能:鍵盤掃描
* 入口參數(shù):無
* 出口參數(shù):鍵值
*********************************************************************************************/
uchar Key_Scan()
{
if( ( P1 & 0x0f ) != 0x0f ) //判斷按鍵
{
Delay(10); //消除抖動
// Lcd_Initial();
if( ( P1 & 0x0f ) != 0x0f )
{
switch ( P1 & 0x0f ) //將按鍵碼轉(zhuǎn)換成鍵值
{
case 0x0e: return up_array;
case 0x0d: return down_array;
case 0x0b: return clear_array;
case 0x07: return function_array;
default : return null;
}
}
}
return null;
}
4、核心算法程序
void main( void )
{
uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定義時(shí)間變量 秒 分 時(shí) 日 月 年
uchar alarm_time[2] = { 10, 6}; //鬧鐘設(shè)置 alarm_time[0]: 分鐘 alarm_time[1] :小時(shí)
uchar alarm_time2[2] = { 15, 7};
Lcd_Initial(); //LCD初始化
Clock_Fresh( clock_time ); //我把時(shí)間刷新放在這里,proteus會調(diào)用當(dāng)前系統(tǒng)時(shí)間,
Clock_Initial( clock_time ); //時(shí)鐘初試化
/***********************中斷初始化***************************/
EA = 1; //開總中斷
ET0 = 1; //Timer0 開中斷
TMOD = 0x01; //Timer0 工作方式 1
TH0 = 0x3c;
TL0 = 0XB0; //延時(shí) 50 ms
while( 1 )
{
{
Clock_Fresh( clock_time ); //時(shí)間刷新
Lcd_Clock( clock_time ); //時(shí)間顯示
Calendar_Convert( 0 , clock_time );
Week_Convert( 0, clock_time );
//鬧鐘1報(bào)警
if( * alarm_time == HexNum_Convert(* ( clock_time + 1 ) )) //分鐘相吻合
if( * ( alarm_time + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小時(shí)相吻合
{
if(HexNum_Convert(*( clock_time )) == 2)
TR0 = 1; //啟動Timer0
}
//鬧鐘2報(bào)警
if( * alarm_time2 == HexNum_Convert(* ( clock_time + 1 ) )) //分鐘相吻合
if( * ( alarm_time2 + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小時(shí)相吻合
{
if(HexNum_Convert(*( clock_time )) == 2)
TR0 = 1; //啟動Timer0
}
}
switch( Key_Scan() )
{
case up_array:
{
//Lcd_Initial();
Key_Idle();
}
break;
case down_array:
{
// Lcd_Initial();
Key_Idle();
}
break;
case clear_array:
{
// Lcd_Initial();
Key_Idle();
}
break;
case function_array:
{
//Lcd_Initial();
Key_Function( clock_time, alarm_time ,alarm_time2);
}
break;
case null:
break;
}
}
}
四、 proteus仿真設(shè)計(jì)
Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒有硬件平臺的基礎(chǔ)上通過自身的軟件仿真出硬件平臺的運(yùn)行情況,這樣就可以通過軟件仿真來驗(yàn)證我們設(shè)計(jì)的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達(dá)到我們設(shè)定的目的,避免我們搭建實(shí)物的時(shí)候,如果當(dāng)初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費(fèi)人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個(gè)問題,我們在設(shè)計(jì)之初,就使用該軟件進(jìn)行模擬仿真,測試,選擇滿足我們設(shè)計(jì)的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實(shí)物,調(diào)試,最終完成本設(shè)計(jì)的作品。
3.png (68.77 KB, 下載次數(shù): 31)
下載附件
2023-11-12 09:51 上傳
作者: yyzf998 時(shí)間: 2023-11-12 18:35
程序不完整,群主應(yīng)該不給予黑幣獎(jiǎng)勵(lì)!
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
日韩毛片在线
|
日韩成人小视频
|
日一日操一操
|
波多野结衣一区二区三区在线观看
|
精品无人国产偷自产在线
|
日韩三级中文字幕
|
黄色草逼视频
|
日本视频免费观看
|
亚洲欧美日韩成人
|
国产精品免费一区二区三区
|
日本久久精品视频
|
天天干天天弄
|
成人精品福利
|
中文字幕在线免费
|
国产高清一区二区
|
日韩小视频
|
av在线免费观看网址
|
久久综合在线
|
精品福利在线
|
日韩免费精品视频
|
51免费看成人啪啪片
|
九九色影院
|
激情丁香|
不卡视频在线
|
日韩成人精品
|
中文字幕在线观看日本
|
色婷婷视频在线观看
|
91麻豆精品国产91久久久久久久久
|
伊人久久av
|
午夜|
三级免费网站
|
久久精品一区二区三区四区
|
日日夜夜天天操
|
久久久久综合
|
天天躁日日躁狠狠躁
|
黄色成人毛片
|
中文字幕免费
|
波多野结衣乳巨码无在线观看
|
91成人精品一区在线播放
|
国产黄色片视频
|
成人免费黄色片
|