找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3543|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

protues仿真DS1302+LCD1602顯示實(shí)驗(yàn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:576497 發(fā)表于 2019-10-15 11:30 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
萌新小白,第一次發(fā)帖,望見(jiàn)諒!這是我以前做的一個(gè)實(shí)驗(yàn),用protues仿真,DS1302讀取時(shí)間,LCD1602顯示出讀取的時(shí)間。
附件帶源文件和仿真工程。
實(shí)驗(yàn)效果圖:


單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define WRITE_SECOND 0x80
  5. #define WRITE_MINUTE 0x82
  6. #define WRITE_HOUR 0x84
  7. #define READ_SECOND 0x81
  8. #define READ_MINUTE 0x83
  9. #define READ_HOUR 0x85
  10. #define WRITE_PROTECT 0x8E
  11. sbit IO=P1^0;
  12. sbit SCLK=P1^1;
  13. sbit RST=P1^2;
  14. sbit LCD_RS=P2^0;
  15. sbit LCD_RW=P2^1;
  16. sbit LCD_E=P2^2;
  17. uchar DATE[]={"DATE:2000-00-00"};
  18. uchar TIME[]={"TIME:00:00:00  "};
  19. uchar date_time[7];
  20. void delay_ms(uint x)
  21. {
  22.         uint i,j;
  23.         for(i=x;i>0;i--)
  24.         {
  25.                 for(j=112;j>0;j--);
  26.         }
  27. }
  28.         void write_ds1302(uchar date)//寫(xiě)入地址或者數(shù)據(jù)(控制字)
  29. {
  30.         uint i;
  31.         SCLK=0;//開(kāi)始準(zhǔn)備傳輸
  32.         for(i=0;i<8;i++)
  33.         {
  34.                 IO=date&0x01;//讀取每一位的值
  35.                 SCLK=1;
  36.                 delay_ms(2);
  37.                 SCLK=0;
  38.                 date>>=1;//右移一位
  39.         }
  40. }
  41. uchar read_ds1302()//讀取數(shù)據(jù)
  42. {
  43.         uint i;
  44.         uchar date=0x00;
  45.   for(i=0;i<8;i++)
  46.         {
  47.                 date>>=1;
  48.                 if(IO==1)//如果讀取出來(lái)的值是1,則將數(shù)據(jù)定為1,不是就定為0
  49.                 date|=0x80;
  50.                 SCLK=1;
  51.                 delay_ms(2);
  52.                 SCLK=0;
  53.         }
  54.         return date/16*10+date%16;//16進(jìn)制轉(zhuǎn)換成10進(jìn)制
  55. }
  56. void write_time(uchar addr,uchar date)//寫(xiě)入你要修改的時(shí)間值
  57. {
  58.         RST=0;//初始化CE線(xiàn),復(fù)位
  59.         SCLK=0;//時(shí)鐘總線(xiàn)清零
  60.         RST=1;//CE置1,傳輸開(kāi)始
  61.         write_ds1302(addr);//傳入你要寫(xiě)入的時(shí)間(時(shí)間或者日歷地址)
  62.         write_ds1302(date);//寫(xiě)入你要修改的時(shí)間值
  63.         SCLK=1;//時(shí)間線(xiàn)拉高
  64.         RST=0;//寫(xiě)入結(jié)束
  65. }
  66. uchar read_time(uchar addr)//讀取你需要的時(shí)間值
  67. {
  68.         uchar dat;
  69.         RST=0;//初始化CE線(xiàn),復(fù)位
  70.         SCLK=0;//時(shí)鐘總線(xiàn)清零
  71.         RST=1;//CE置1,傳輸開(kāi)始
  72.         write_ds1302(addr);//傳入你要讀取的時(shí)間地址
  73.         dat=read_ds1302();//讀取時(shí)間值
  74.         SCLK=1;//時(shí)間線(xiàn)拉高
  75.         RST=0;//讀取結(jié)束
  76.         return dat;
  77. }
  78. void LCD_write_commd(uchar com)//寫(xiě)入命令,如顯示地址或者是寫(xiě)入CGRAM,此次代碼沒(méi)有這個(gè)功能
  79. {
  80.         LCD_RS=0;//寫(xiě)命令
  81.         LCD_RW=0;
  82.         P0=com;
  83.         delay_ms(2);
  84.         LCD_E=1;
  85.         delay_ms(2);
  86.         LCD_E=0;
  87. }
  88. void LCD_write_date(uchar dat)//寫(xiě)入數(shù)據(jù),這次是寫(xiě)入字符碼,顯示在液晶屏上
  89. {
  90.         LCD_RS=1;//寫(xiě)數(shù)據(jù)
  91.         LCD_RW=0;
  92.         P0=dat;
  93.         delay_ms(2);
  94.         LCD_E=1;
  95.         delay_ms(2);
  96.         LCD_E=0;
  97. }
  98. void init_LCD1602()//初始化
  99. {
  100.         LCD_write_commd(0x38);
  101.         delay_ms(2);
  102.         LCD_write_commd(0x0c);
  103.         delay_ms(2);
  104.         LCD_write_commd(0x06);
  105.         delay_ms(2);
  106.         LCD_write_commd(0x01);
  107.         delay_ms(2);
  108. }
  109. void set_lcd_pos(uchar p)//設(shè)置顯示位置
  110. {
  111.         LCD_write_commd(p|0x80);
  112. }
  113. void LCD_print(uchar p,uchar *s)//顯示
  114. {
  115.         uint i;
  116.         set_lcd_pos(p);
  117.         for(i=0;i<16;i++)
  118.         {
  119.                 LCD_write_date(s[i]);
  120.                 delay_ms(10);
  121.   }
  122. }
  123. void Get_time()//讀取時(shí)間
  124. {
  125.         uchar i,addr=0x81;
  126.         for(i=0;i<7;i++)
  127.         {
  128.                 date_time[i]=read_time(addr);
  129.                 addr+=2;
  130.         }
  131. }
  132. void Format_Datetime(uchar d,uchar *a)//將日期和時(shí)間值轉(zhuǎn)換成數(shù)字字符
  133. {
  134.         a[0]=d/10+'0';
  135.         a[1]=d%10+'0';
  136. }
  137. void init_DS1302()//DS1302初始化
  138. {
  139.         write_time(WRITE_PROTECT,0x00);
  140.         write_time(WRITE_SECOND,0x56);
  141.         write_time(WRITE_MINUTE,0x34);
  142.         write_time(WRITE_HOUR,0x12);
  143.         write_time(WRITE_PROTECT,0x80);
  144.        
  145. }
  146. void main()
  147. {
  148.         //init_DS1302();
  149.         init_LCD1602();//初始化液晶屏
  150.         while(1)
  151.         {
  152.                 Get_time();
  153.           Format_Datetime(date_time[6],DATE+7);
  154.           Format_Datetime(date_time[4],DATE+10);
  155.           Format_Datetime(date_time[3],DATE+13);
  156.           Format_Datetime(date_time[2],TIME+5);
  157.           Format_Datetime(date_time[1],TIME+8);
  158.           Format_Datetime(date_time[0],TIME+11);
  159.     LCD_print(0x00,DATE);
  160.           LCD_print(0x40,TIME);
  161.         }
  162.        
  163. }
復(fù)制代碼

所有資料51hei提供下載:
DS1302 LCD1602顯示.rar (64.47 KB, 下載次數(shù): 92)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:84745 發(fā)表于 2019-10-20 11:58 來(lái)自手機(jī) | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:670001 發(fā)表于 2019-12-21 19:10 | 只看該作者
十分感謝
回復(fù)

使用道具 舉報(bào)

地板
ID:621620 發(fā)表于 2019-12-24 17:04 | 只看該作者
感謝大佬分享,最近實(shí)訓(xùn)需要參考。
回復(fù)

使用道具 舉報(bào)

5#
ID:302325 發(fā)表于 2020-5-12 01:42 | 只看該作者
感謝分享            
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表