萌新小白,第一次發帖,望見諒!這是我以前做的一個實驗,用protues仿真,DS1302讀取時間,LCD1602顯示出讀取的時間。
附件帶源文件和仿真工程。
實驗效果圖:
1571110130(1).jpg (36.23 KB, 下載次數: 38)
下載附件
LCD顯示DS1302的時間
2019-10-15 11:27 上傳
單片機源程序如下:
- #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)//寫入地址或者數據(控制字)
- {
- uint i;
- SCLK=0;//開始準備傳輸
- for(i=0;i<8;i++)
- {
- IO=date&0x01;//讀取每一位的值
- SCLK=1;
- delay_ms(2);
- SCLK=0;
- date>>=1;//右移一位
- }
- }
- uchar read_ds1302()//讀取數據
- {
- uint i;
- uchar date=0x00;
- for(i=0;i<8;i++)
- {
- date>>=1;
- if(IO==1)//如果讀取出來的值是1,則將數據定為1,不是就定為0
- date|=0x80;
- SCLK=1;
- delay_ms(2);
- SCLK=0;
- }
- return date/16*10+date%16;//16進制轉換成10進制
- }
- void write_time(uchar addr,uchar date)//寫入你要修改的時間值
- {
- RST=0;//初始化CE線,復位
- SCLK=0;//時鐘總線清零
- RST=1;//CE置1,傳輸開始
- write_ds1302(addr);//傳入你要寫入的時間(時間或者日歷地址)
- write_ds1302(date);//寫入你要修改的時間值
- SCLK=1;//時間線拉高
- RST=0;//寫入結束
- }
- uchar read_time(uchar addr)//讀取你需要的時間值
- {
- uchar dat;
- RST=0;//初始化CE線,復位
- SCLK=0;//時鐘總線清零
- RST=1;//CE置1,傳輸開始
- write_ds1302(addr);//傳入你要讀取的時間地址
- dat=read_ds1302();//讀取時間值
- SCLK=1;//時間線拉高
- RST=0;//讀取結束
- return dat;
- }
- void LCD_write_commd(uchar com)//寫入命令,如顯示地址或者是寫入CGRAM,此次代碼沒有這個功能
- {
- LCD_RS=0;//寫命令
- LCD_RW=0;
- P0=com;
- delay_ms(2);
- LCD_E=1;
- delay_ms(2);
- LCD_E=0;
- }
- void LCD_write_date(uchar dat)//寫入數據,這次是寫入字符碼,顯示在液晶屏上
- {
- LCD_RS=1;//寫數據
- 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)//設置顯示位置
- {
- 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()//讀取時間
- {
- 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)//將日期和時間值轉換成數字字符
- {
- 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);
- }
-
- }
復制代碼
所有資料51hei提供下載:
DS1302 LCD1602顯示.rar
(64.47 KB, 下載次數: 92)
2019-10-15 11:29 上傳
點擊文件名下載附件
源文件和仿真工程 下載積分: 黑幣 -5
|