|
DS1302時(shí)鐘LCD1602顯示,proteus7和8的仿真都有
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei截圖18141218354188.jpg (133.75 KB, 下載次數(shù): 20)
下載附件
2023-4-11 13:05 上傳
單片機(jī)源程序如下:
- //調(diào)用1602顯示驅(qū)動(dòng),在此文件內(nèi)已包含51頭文件和定義數(shù)據(jù)類(lèi)型
- #include "LCD1602.h"
- /*====================================
- IO接口定義
- ====================================*/
- sbit TSCLK = P1^1; //時(shí)鐘
- sbit TIO = P1^0; //數(shù)據(jù)
- sbit TRST = P1^2; //使能
- #define MAIN_Fosc 11059200UL //宏定義主時(shí)鐘HZ
- #define DS1302_W_ADDR 0x80 //寫(xiě)時(shí)鐘日歷寄存器起始地址
- #define DS1302_R_ADDR 0x81 //讀時(shí)鐘日歷寄存器起始地址
- //時(shí)鐘日歷暫存數(shù)組,秒、分、時(shí)、日、月、周、年
- uchar TimeData[7]={0, 0, 0, 0, 0, 0, 0};
- /*=================================================
- *函數(shù)名稱(chēng):Delay_Ms
- *函數(shù)功能:12T 51單片機(jī)自適應(yīng)主時(shí)鐘毫秒級(jí)延時(shí)函數(shù)
- *說(shuō)明:需定義MAIN_Fosc(晶振主頻單位HZ)
- *輸入:ms:要延時(shí)的毫秒
- =================================================*/
- void Delay_Ms(INT16U ms)
- {
- INT16U i;
- do{
- i = MAIN_Fosc / 96000;
- while(--i); //96T per loop
- }while(--ms);
- }
- /*=================================================
- *函數(shù)名稱(chēng):DS1302_W_Byte
- *函數(shù)功能:DS1302寫(xiě)一字節(jié)數(shù)據(jù)
- *輸入:dat:要寫(xiě)入的數(shù)據(jù)
- =================================================*/
- void DS1302_W_Byte(uchar dat)
- {
- uchar i;
- for(i = 0; i < 8; i++) //每次寫(xiě)1bit,寫(xiě)8次
- {
- TSCLK = 0; //拉低時(shí)鐘總線(xiàn)
- TIO = dat & 0x01; //從一字節(jié)最低位開(kāi)始寫(xiě)
- TSCLK = 1; //拉高時(shí)鐘總線(xiàn),DS1302把數(shù)據(jù)讀走
- dat >>= 1; //數(shù)據(jù)右移一位
- }
- }
- /*=================================================
- *函數(shù)名稱(chēng):DS1302_R_Byte
- *函數(shù)功能:DS1302讀一字節(jié)
- *輸出:dat:讀取的數(shù)據(jù)
- =================================================*/
- uchar DS1302_R_Byte()
- {
- uchar i, dat;
- for(i = 0; i < 8; i++) //每次寫(xiě)1bit,寫(xiě)8次
- {
- TSCLK = 0; //拉低時(shí)鐘總線(xiàn),DS1302把數(shù)據(jù)放到數(shù)據(jù)總線(xiàn)上
- dat >>= 1; //數(shù)據(jù)右移一位,數(shù)據(jù)從最低位開(kāi)始讀
- if(TIO) dat |= 0x80;//讀取數(shù)據(jù)
- TSCLK = 1; //拉高時(shí)鐘總線(xiàn)
- }
- return dat; //返回讀取的數(shù)據(jù)
- }
- /*=================================================
- *函數(shù)名稱(chēng):DS1302_W_DAT
- *函數(shù)功能:寫(xiě)DS1302數(shù)據(jù)一次寫(xiě)2個(gè)字節(jié)
- *說(shuō)明:先寫(xiě)命令后寫(xiě)數(shù)據(jù)
- *調(diào)用:DS1302_W_Byte()
- *輸入:cmd:需要寫(xiě)的命令 ,dat:需要些的數(shù)據(jù)
- =================================================*/
- void DS1302_W_DAT(uchar cmd, uchar dat)
- {
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數(shù)據(jù)總線(xiàn)
- TRST = 1; //拉高使能端,開(kāi)始寫(xiě)數(shù)據(jù)
- DS1302_W_Byte(cmd); //寫(xiě)命令
- DS1302_W_Byte(dat); //寫(xiě)數(shù)據(jù)
- }
- /*=================================================
- *函數(shù)名稱(chēng):DS1302_R_DAT
- *函數(shù)功能:讀DS1302數(shù)據(jù)
- *說(shuō)明:先寫(xiě)入命令字節(jié)后讀出對(duì)應(yīng)數(shù)據(jù)
- *調(diào)用: DS1302_W_Byte();DS1302_R_Byte();
- *輸入: cmd:需要寫(xiě)的命令
- *輸出: dat:讀出的數(shù)據(jù)
- =================================================*/
- uchar DS1302_R_DAT(uchar cmd)
- {
- uchar dat;
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數(shù)據(jù)總線(xiàn)
- TRST = 1; //拉高使能端,開(kāi)始寫(xiě)數(shù)據(jù)
- DS1302_W_Byte(cmd); //寫(xiě)命令
- dat = DS1302_R_Byte(); //讀出數(shù)據(jù)
- return dat; //返回讀出數(shù)據(jù)
- }
- /*=================================================
- *函數(shù)名稱(chēng):DS1302_Clear_WP
- *函數(shù)功能:清除DS1302寫(xiě)保護(hù)
- *說(shuō)明:先寫(xiě)入命令0x8e(寫(xiě)控制寄存器)接著向該寄存器寫(xiě)0
- *調(diào)用:DS1302_W_DAT()
- =================================================*/
- void DS1302_Clear_WP()
- {
- DS1302_W_DAT(0x8e,0x00); //把控制寄存器WP位置0
- }
- /*=================================================
- *函數(shù)名稱(chēng):DS1302_Clear_WP
- *函數(shù)功能:設(shè)置DS1302寫(xiě)保護(hù)
- *說(shuō)明:先寫(xiě)入命令0x8e(寫(xiě)控制寄存器)接著向該寄存器寫(xiě)0x80
- *調(diào)用:DS1302_W_DAT()
- =================================================*/
- void DS1302_Set_WP()
- {
- DS1302_W_DAT(0x8e,0x80); //把控制寄存器WP位置1
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數(shù)據(jù)總線(xiàn)
- }
- /*=================================================
- *函數(shù)名稱(chēng):Read_DS1302_Time
- *函數(shù)功能:讀取DS1302時(shí)鐘數(shù)據(jù)
- *說(shuō)明: 讀取DS1302時(shí)鐘數(shù)據(jù) 返回?cái)?shù)據(jù)存入時(shí)鐘日歷暫存
- 數(shù)組TimeData(數(shù)據(jù)格式BCD碼)
- *調(diào)用:DS1302_Clear_WP();DS1302_R_DAT();DS1302_Set_WP();
- *輸入: addr:需要讀取時(shí)鐘日歷寄存器的起始地址
- =================================================*/
- void Read_DS1302_Time(uchar addr)
- {
- uchar i;
- DS1302_Clear_WP(); //清楚些保護(hù)
- for(i = 0; i < 7; i++) //從DS1302讀取7個(gè)字節(jié)的時(shí)鐘日歷數(shù)據(jù)
- {
- TimeData[i] = DS1302_R_DAT(addr);//先寫(xiě)入要讀取數(shù)據(jù)的寄存器起始地址,再讀出數(shù)據(jù)存入TimeData數(shù)組
- addr += 2; //時(shí)鐘日歷寄存器地址+2轉(zhuǎn)向下一個(gè)寄存器
- }
- DS1302_Set_WP(); //開(kāi)起寫(xiě)保護(hù)
- }
- /*=================================================
- *函數(shù)名稱(chēng):main
- *函數(shù)功能:主函數(shù) 1602液晶顯示DS1302數(shù)據(jù)
- Date:年-月-日-星期
- Time:時(shí):分:秒
- =================================================*/
- void main()
- {
- InitLcd1602(); //1602初始化
- LcdShowStr(0,0,"Date:"); //1602顯示字符串
- LcdShowStr(0,1,"Time:"); //1602顯示字符串
- while(1)
- {
- Read_DS1302_Time(DS1302_R_ADDR); //先寫(xiě)入時(shí)鐘日歷寄存器起始地址再讀出時(shí)鐘日歷寫(xiě)入到TimeData數(shù)組中
- DisplayOneStr (5,0,TimeData[6]); //年
- DisplayOneChar (7,0,'-'); //-
- DisplayOneStr (8,0,TimeData[4]); //月
- DisplayOneChar (10,0,'-'); //-
- DisplayOneStr (11,0,TimeData[3]);//日
- DisplayOneStr (5,1,TimeData[2]); //時(shí)
- DisplayOneChar (7,1,':'); //:
- DisplayOneStr (8,1,TimeData[1]); //分
- DisplayOneChar (10,1,':'); //:
- DisplayOneStr (11,1,TimeData[0]);//秒
- Delay_Ms(1000); //延時(shí)1秒
- }
- }
復(fù)制代碼
Keil代碼與Proteus仿真下載:
DS1302時(shí)鐘LCD1602不帶星期.zip
(95.21 KB, 下載次數(shù): 58)
2023-4-11 13:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|