導航:首頁 > 操作系統 > 單片機lcd時鍾

單片機lcd時鍾

發布時間:2023-06-14 04:15:09

① 求一段為51單片機編寫的LCD電子時鍾的設計,簡單就好!高分伺候!

簡單的時鍾,不用1302即可辦到。

題目要求的設計已經完成,電路圖如下。

程序稍長,放在我的網路空間了。

可以用網路、網頁,進行查找:

做而論道用LCD1602顯示的時鍾

網路一下,即可查到。

② 一、基於單片機的電子時鍾設計 設計內容:1、用LCD液晶作為顯示設備(30分)

http://blog.163.com/asm_c/blog/static/2482031132012330340436/

參考。

③ 求教一個51單片機程序。。(LCD電子時鍾)

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
#define yh 0x80
#define er 0x80+0x40//液晶屏的與 C51 之間的引腳連接定義
sbit rs=P2^5;
sbit en=P2^7;
sbit rw=P2^6;//如果硬體上 rw 接地,就不用寫這句和後面的 rw=0
//DS1302 時鍾晶元與 C51 之間的引腳連接定義
sbit IO=P3^6;
sbit SCLK=P3^5;
sbit RST=P3^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;//校時按鍵與 C51 的引腳連接定義
sbit key1=P3^2;//設置鍵
sbit key2=P3^3;//加鍵
sbit key3=P3^4;//減鍵
uchar code tab1[]={"20//////////"};//年顯示的固定字元
uchar code tab2[]={"LOVE ::::::"};//時間顯示的固定字元

//延時函數,後面經常調用
void delay(uint xms)//延時函數,有參函數
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/********液晶寫入指令函數與寫入數據函數,以後可調用**************/
write_1602com(uchar com) //****液晶寫入指令函數****
{
rs=0; //數據/指令選擇置為指令
rw=0; //讀寫選擇 置為寫
P0=com; //送入數據
delay(1);
en=1; //拉高使能端,為製造有效的下降沿做准備
delay(1);
en=0;
//en 由高變低,產生下降沿,液晶執行命令
}

write_1602dat(uchar dat) //***液晶寫入數據函數****
{
rs=1; //數據/指令選擇置為數據
rw=0; //讀寫選擇置為寫
P0=dat; //送入數據
delay(1);
en=1; //en 置高電平,為製造下降沿做准備
delay(1);
en=0; //en 由高變低,產生下降沿,液晶執行命令

}

lcd_init() //***液晶初始化函數****//
{
write_1602com(0x38); //設置液晶工作模式,意思:16*2 行顯示,5*7 點陣,8 位數據
write_1602com(0x0c); //開顯示不顯示游標
write_1602com(0x06); //整屏不移動,游標自動右移
write_1602com(0x01); //清顯示
write_1602com(yh+1); //日歷顯示固定符號從第一行第 1 個位置之後開始顯示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]); //向液晶屏寫日歷顯示的固定符號部分
}
write_1602com(er+1);//時間顯示固定符號寫入位置,從第 2 個位置後開始顯示
for(a=0;a<12;a++)
{
write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號
}
}
/***************DS1302 有關子函數********************/
void write_byte(uchar dat)//寫一個位元組
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;//相當於匯編中的 RRC
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte() //讀一個位元組
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------//
void write_1302(uchar add,uchar dat) //向 1302 晶元寫函數,指定寫入地址,數據
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add) //從 1302 讀數據函數,指定讀取數據來源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD 碼轉十進制函數,輸入 BCD,返回十進制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------//
void ds1302_init()//1302 晶元初始化子函數(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x8e,0x80);//打開防寫
}
//時分秒顯示子函數
void write_sfm(uchar add,uchar dat)//向 LCD 寫時分秒,有顯示位置加、現示數據,兩個參數
{
uchar gw,sw;
gw=dat%10;//取得個位數字
sw=dat/10;//取得十位數字
write_1602com(er+add);//er 是頭文件規定的值 0x80+0x40
write_1602dat(0x30+sw);//數字+30 得到該數字的 LCD1602 顯示碼
write_1602dat(0x30+gw);//數字+30 得到該數字的 LCD1602 顯示碼
}
//年月日顯示子函數
void write_nyr(uchar add,uchar dat)//向 LCD 寫年月日,有顯示位置加數、顯示數據,兩個參數
{
uchar gw,sw;
gw=dat%10;//取得個位數字
sw=dat/10;//取得十位數字
write_1602com(yh+add);//設定顯示位置為第一個位置+add
write_1602dat(0x30+sw);//數字+30 得到該數字的 LCD1602 顯示碼
write_1602dat(0x30+gw);//數字+30 得到該數字的 LCD1602 顯示碼
}
void write_week(uchar week)//寫星期函數
{
write_1602com(yh+0x0c);//星期字元的顯示位置
switch(week)
{
case 1:write_1602dat('M');//星期數為一時,顯示
write_1602dat('o');
write_1602dat('n');break;
case 2:write_1602dat('T');//星期數據為二時顯示
write_1602dat('u');
write_1602dat('e');break;
case 3:write_1602dat('W');//星期數據為三時顯示
write_1602dat('e');
write_1602dat('d');break;
case 4:write_1602dat('T');//星期數據為四是顯示
write_1602dat('h');
write_1602dat('u');break;
case 5:write_1602dat('F');//星期數據為五時顯示
write_1602dat('r');
write_1602dat('i');break;
case 6:write_1602dat('S');//星期數據為六時顯示
write_1602dat('t');
write_1602dat('a');break;
case 7:write_1602dat('S');//星期數據為日時顯示
write_1602dat('u');
write_1602dat('n');break;
}
}
//****************鍵盤掃描有關函數**********************
void keyscan()
{
if(key1==0)//key1 為功能鍵(設置鍵)
{
delay(9);//延時,用於消抖動
if(key1==0)//延時後再次確認按鍵按下
{
delay(20);
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//設置按鍵共有秒、分、時、星期、日、月、年、返回,8 個功能循環
switch(key1n)
{
case 1:TR0=0;//關閉定時器
write_1602com(er+0x0E);//設置按鍵按動一次,秒位置顯示游標
write_1602com(0x0f);//設置游標為閃爍
temp=(miao)/10*16+(miao)%10;//秒數據寫入 DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);break;
case 2:write_1602com(er+11);//按 2 次 fen 位置顯示游標
break;
case 3:write_1602com(er+8);//按動 3 次,shi
break;
case 4:write_1602com(yh+0x0e);//按動 4 次,week
break;
case 5:write_1602com(yh+0x0a);//按動 5 次,ri
break;
case 6:write_1602com(yh+0x07);//按動 6 次,yue
break;
case 7:write_1602com(yh+0x04);//按動 7 次,nian
break;
case 8:write_1602com(0x0c);//按動到第 8 次,設置游標不閃爍
TR0=1;//打開定時器
TR0=1;
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao 數據寫入 DS1302
write_1302(0x8e,0x80);break;
}
}
}
//------------------------------加鍵 key2----------------------------//
if(key1n!=0)//當 key1 按下以下。再按以下鍵才有效(按鍵次數不等於零)
{
if(key2==0)//上調鍵
{
delay(10);
if(key2==0)
{
delay(20);
while(!key2);
switch(key1n)
{
case 1:miao++;//設置鍵按動 1 次,調秒
if(miao==60)
miao=0;
write_sfm(0x0D,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x0A,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(7,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C) ;
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
}
//------------------減鍵 key3,各句功能參照'加鍵'注釋---------------
if(key3==0)
{
delay(10);
//調延時,消抖動
if(key3==0)
{
delay(20);
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;
write_sfm(0x0D,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(10,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(7,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十進制轉換成 DS1302 要求的 DCB 碼
write_1302(0x8e,0x00);//允許寫,禁止防寫
write_1302(0x86,temp);//向 DS1302 內寫日期寄存器 86H 寫入調整後的日期數據 BCD 碼
write_1302(0x8e,0x80);//打開防寫
write_1602com(yh+10);//因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10; //十進制轉換成 DS1302 要求的 DCB 碼
write_1302(0x8e,0x00); //允許寫,禁止防寫
write_1302(0x88,temp); //向 DS1302 內寫月份寄存器 88H 寫入調整後的月份數據 BCD 碼
write_1302(0x8e,0x80); //打開防寫
write_1602com(yh+7); //因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10; //十進制轉換成 DS1302 要求的 DCB 碼
write_1302(0x8e,0x00); //允許寫,禁止防寫
write_1302(0x8c,temp); //向 DS1302 內寫年份寄存器 8cH 寫入調整後的年份數據 BCD 碼
write_1302(0x8e,0x80); //打開防寫
write_1602com(yh+4); //因為設置液晶的模式是寫入數據後,指針自動加一,所以需要游標回位
break;
}
}
}
}
}
void init()
//定時器、計數器設置函數
{
TMOD=0x11;
//指定定時/計數器的工作方式為 3
TH0=0;
//定時器 T0 的高四位=0
TL0=0;
//定時器 T0 的低四位=0
EA=1;
//系統允許有開放的中斷
ET0=1;
//允許 T0 中斷
TR0=1;
//開啟中斷,啟動定時器
}
//*******************主函數**************************
void main()
{
lcd_init(); //調用液晶屏初始化子函數
ds1302_init(); //調用 DS1302 時鍾的初始化子函數
init(); //調用定時計數器的設置子函數
delay(80);
while(1)
//無限循環下面的語句:
{
keyscan();
//調用鍵盤掃描子函數
}
}
void timer0() interrupt 1 //取得並顯示日歷和時間
{ //讀取秒時分周日月年七個數據(DS1302 的讀寄存器與寫寄存器不一樣)
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//顯示秒、時、分數據:
write_sfm(13,miao); //秒,從第二行第 8 個字後開始顯示(調用時分秒顯示子函數)
write_sfm(10,fen); //分,從第二行第 5 個字元後開始顯示
write_sfm(7,shi); //小時,從第二行第 2 個字元後開始顯示
//顯示日、月、年數據:
write_nyr(9,ri); //日期,從第二行第 9 個字元後開始顯示
write_nyr(6,yue); //月份,從第二行第 6 個字元後開始顯示
write_nyr(3,nian); //年,從第二行第 3 個字元後開始顯示
write_week(week);
}

閱讀全文

與單片機lcd時鍾相關的資料

熱點內容
rar壓縮包mac 瀏覽:624
php混淆加密工具 瀏覽:579
java把數字拆分 瀏覽:464
如何下載svn伺服器舊版本 瀏覽:559
命令與征服4攻略 瀏覽:914
實數四則運演算法則概念 瀏覽:294
cs16優化命令 瀏覽:871
Minecraft雲伺服器免費 瀏覽:828
png壓縮最小 瀏覽:182
老韓綜app怎麼看不了了 瀏覽:227
只有一個程序員的體驗 瀏覽:323
用伺服器地址怎麼有網 瀏覽:551
路由器伺服器昵稱是什麼 瀏覽:715
程序員男友消失了 瀏覽:401
程序員搜索框自動提示 瀏覽:28
android44api20 瀏覽:677
adb刷recovery命令 瀏覽:697
廣聯達正版加密鎖可以補辦嗎 瀏覽:945
java程序員一天多少行代碼 瀏覽:948
喪屍危機java 瀏覽:128