|
萌新小白,第一次發(fā)帖,望見(jiàn)諒!這是我以前做的一個(gè)實(shí)驗(yàn),用protues仿真,DS1302讀取時(shí)間,LCD1602顯示出讀取的時(shí)間。
附件帶源文件和仿真工程。
實(shí)驗(yàn)效果圖:
1571110130(1).jpg (36.23 KB, 下載次數(shù): 38)
下載附件
LCD顯示DS1302的時(shí)間
2019-10-15 11:27 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define WRITE_SECOND 0x80
- #define WRITE_MINUTE 0x82
- #define WRITE_HOUR 0x84
- #define READ_SECOND 0x81
- #define READ_MINUTE 0x83
- #define READ_HOUR 0x85
- #define WRITE_PROTECT 0x8E
- sbit IO=P1^0;
- sbit SCLK=P1^1;
- sbit RST=P1^2;
- sbit LCD_RS=P2^0;
- sbit LCD_RW=P2^1;
- sbit LCD_E=P2^2;
- uchar DATE[]={"DATE:2000-00-00"};
- uchar TIME[]={"TIME:00:00:00 "};
- uchar date_time[7];
- void delay_ms(uint x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- {
- for(j=112;j>0;j--);
- }
- }
- void write_ds1302(uchar date)//寫(xiě)入地址或者數(shù)據(jù)(控制字)
- {
- uint i;
- SCLK=0;//開(kāi)始準(zhǔn)備傳輸
- for(i=0;i<8;i++)
- {
- IO=date&0x01;//讀取每一位的值
- SCLK=1;
- delay_ms(2);
- SCLK=0;
- date>>=1;//右移一位
- }
- }
- uchar read_ds1302()//讀取數(shù)據(jù)
- {
- uint i;
- uchar date=0x00;
- for(i=0;i<8;i++)
- {
- date>>=1;
- if(IO==1)//如果讀取出來(lái)的值是1,則將數(shù)據(jù)定為1,不是就定為0
- date|=0x80;
- SCLK=1;
- delay_ms(2);
- SCLK=0;
- }
- return date/16*10+date%16;//16進(jìn)制轉(zhuǎn)換成10進(jìn)制
- }
- void write_time(uchar addr,uchar date)//寫(xiě)入你要修改的時(shí)間值
- {
- RST=0;//初始化CE線(xiàn),復(fù)位
- SCLK=0;//時(shí)鐘總線(xiàn)清零
- RST=1;//CE置1,傳輸開(kāi)始
- write_ds1302(addr);//傳入你要寫(xiě)入的時(shí)間(時(shí)間或者日歷地址)
- write_ds1302(date);//寫(xiě)入你要修改的時(shí)間值
- SCLK=1;//時(shí)間線(xiàn)拉高
- RST=0;//寫(xiě)入結(jié)束
- }
- uchar read_time(uchar addr)//讀取你需要的時(shí)間值
- {
- uchar dat;
- RST=0;//初始化CE線(xiàn),復(fù)位
- SCLK=0;//時(shí)鐘總線(xiàn)清零
- RST=1;//CE置1,傳輸開(kāi)始
- write_ds1302(addr);//傳入你要讀取的時(shí)間地址
- dat=read_ds1302();//讀取時(shí)間值
- SCLK=1;//時(shí)間線(xiàn)拉高
- RST=0;//讀取結(jié)束
- return dat;
- }
- void LCD_write_commd(uchar com)//寫(xiě)入命令,如顯示地址或者是寫(xiě)入CGRAM,此次代碼沒(méi)有這個(gè)功能
- {
- LCD_RS=0;//寫(xiě)命令
- LCD_RW=0;
- P0=com;
- delay_ms(2);
- LCD_E=1;
- delay_ms(2);
- LCD_E=0;
- }
- void LCD_write_date(uchar dat)//寫(xiě)入數(shù)據(jù),這次是寫(xiě)入字符碼,顯示在液晶屏上
- {
- LCD_RS=1;//寫(xiě)數(shù)據(jù)
- LCD_RW=0;
- P0=dat;
- delay_ms(2);
- LCD_E=1;
- delay_ms(2);
- LCD_E=0;
- }
- void init_LCD1602()//初始化
- {
- LCD_write_commd(0x38);
- delay_ms(2);
- LCD_write_commd(0x0c);
- delay_ms(2);
- LCD_write_commd(0x06);
- delay_ms(2);
- LCD_write_commd(0x01);
- delay_ms(2);
- }
- void set_lcd_pos(uchar p)//設(shè)置顯示位置
- {
- LCD_write_commd(p|0x80);
- }
- void LCD_print(uchar p,uchar *s)//顯示
- {
- uint i;
- set_lcd_pos(p);
- for(i=0;i<16;i++)
- {
- LCD_write_date(s[i]);
- delay_ms(10);
- }
- }
- void Get_time()//讀取時(shí)間
- {
- uchar i,addr=0x81;
- for(i=0;i<7;i++)
- {
- date_time[i]=read_time(addr);
- addr+=2;
- }
- }
- void Format_Datetime(uchar d,uchar *a)//將日期和時(shí)間值轉(zhuǎn)換成數(shù)字字符
- {
- a[0]=d/10+'0';
- a[1]=d%10+'0';
- }
- void init_DS1302()//DS1302初始化
- {
- write_time(WRITE_PROTECT,0x00);
- write_time(WRITE_SECOND,0x56);
- write_time(WRITE_MINUTE,0x34);
- write_time(WRITE_HOUR,0x12);
- write_time(WRITE_PROTECT,0x80);
-
- }
- void main()
- {
- //init_DS1302();
- init_LCD1602();//初始化液晶屏
- while(1)
- {
- Get_time();
- Format_Datetime(date_time[6],DATE+7);
- Format_Datetime(date_time[4],DATE+10);
- Format_Datetime(date_time[3],DATE+13);
- Format_Datetime(date_time[2],TIME+5);
- Format_Datetime(date_time[1],TIME+8);
- Format_Datetime(date_time[0],TIME+11);
- LCD_print(0x00,DATE);
- LCD_print(0x40,TIME);
- }
-
- }
復(fù)制代碼
所有資料51hei提供下載:
DS1302 LCD1602顯示.rar
(64.47 KB, 下載次數(shù): 92)
2019-10-15 11:29 上傳
點(diǎn)擊文件名下載附件
源文件和仿真工程 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|