久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

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

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

單片機(jī)+DS1302 LCD1602時(shí)間顯示程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
效果和接法看圖吧,只是簡(jiǎn)單用時(shí)鐘芯片顯示時(shí)間


單片機(jī)源程序如下:
  1.   #include <reg51.h>
  2.         #include <string.h>
  3.         #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
  7. sbit SDA=P2^6;  // DS1302數(shù)據(jù)線
  8. sbit CLK=P2^5;  //         DS1302時(shí)鐘線
  9. sbit RST=P2^4;  // DS1302復(fù)位線
  10. //DS18B20數(shù)據(jù)端口定義
  11. sbit DQ=P2^4;    //DS18B20數(shù)據(jù)端口
  12. sbit LCD_RS=P2^0;   // LCD寄存器選擇
  13. sbit LCD_RW=P2^1;   //         LCD讀寫(xiě)/寫(xiě)控制
  14. sbit LCD_EN=P2^2;   //  LCD啟用

  15. uchar tCount=0;
  16. //一年中每個(gè)月的天數(shù),2月的天數(shù)由年份決定
  17. uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
  18. //周日,每周一到周六(0,1-6)【讀取DS1302時(shí)分別是1-7】
  19. uchar *WEEK[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};

  20. //LCD顯示緩沖
  21. uchar LCD_DSY_BUFFER1[]={"00-00-00        "};
  22. uchar LCD_DSY_BUFFER2[]={"00-00-00      "};
  23. uchar DateTime[7];  //所讀取的日期時(shí)間
  24. uchar Adjust_flag=0; //當(dāng)前調(diào)節(jié)的時(shí)間對(duì)像:秒,分,時(shí),日,月,年(1,2,3,4,5,6)
  25. uchar Change_Flag[]=" YMDHM";//(分,時(shí),日,月,年)(不調(diào)節(jié)秒與周)


  26. void DelayMS(uchar x)//延時(shí)
  27. {uchar i;
  28. while(x--)
  29. for(i=0;i<120;i++);
  30. }


  31. void Write_A_Byte_TO_DS1302(uchar x)//向DS1302寫(xiě)入一個(gè)字節(jié)
  32. {uchar i;
  33. for(i=0;i<8;i++)
  34. {SDA=x&1;  CLK=1;  CLK=0; x>>=1;
  35. }
  36. }


  37. uchar Get_A_Byte_FROM_DS1302()//讀取一個(gè)字節(jié)
  38. {uchar i,b,t;
  39. for(i=0;i<8;i++)
  40. {b>>=1; t=SDA; b|=t<<7;  CLK=1;CLK=0;
  41. }

  42. return b/16*10+b%16;//BCD碼轉(zhuǎn)換
  43. }

  44. uchar Read_Data(uchar addr)//指定位置讀數(shù)據(jù)
  45. {uchar dat;
  46. RST=0; CLK=0; RST=1;
  47. Write_A_Byte_TO_DS1302(addr);
  48. dat=Get_A_Byte_FROM_DS1302();
  49. CLK=1;RST=0;
  50. return dat;
  51. }

  52. void Write_DS1302(uchar addr,uchar dat)//向某地址寫(xiě)入數(shù)據(jù)
  53. {CLK=0;RST=1;
  54. Write_A_Byte_TO_DS1302(addr);
  55. Write_A_Byte_TO_DS1302(dat);
  56. CLK=0;RST=0;
  57. }

  58. void SET_DS1302()//設(shè)置時(shí)間
  59. { uchar i;
  60. Write_DS1302(0x8e,0x00);

  61. for(i=0;i<7;i++)
  62. {

  63. Write_DS1302(0X80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));//日,月,周,年,寫(xiě)入 地址每次增2
  64. }
  65. Write_DS1302(0x8e,0x80);//加保護(hù)
  66. }


  67. void GetTime()//讀取本地的時(shí)間
  68. {
  69.   uchar i;
  70.   for(i=0;i<7;i++)
  71.    {
  72.      DateTime[i]=Read_Data(0x81+2*i);
  73.    }
  74. }

  75. //LCD驅(qū)動(dòng)代碼
  76. bit LCD_Busy_Check()//LCD忙
  77. {bit result;
  78. LCD_RS=0;
  79. LCD_RW=1;
  80. LCD_EN=1;
  81. delayNOP();
  82. result=(bit)(P0&0x80);
  83. LCD_EN=0;
  84. return result;
  85. }


  86. void Write_LCD_Command(uchar cmd) //寫(xiě)指令
  87. {while(LCD_Busy_Check());
  88. LCD_RS=0;LCD_RW=0;LCD_EN=0;        _nop_();         _nop_();
  89. P0=cmd;
  90. delayNOP();
  91. LCD_EN=1;
  92. delayNOP();
  93. LCD_EN=0;
  94. }

  95. void Write_LCD_Data(uchar dat)//寫(xiě)數(shù)據(jù)
  96. {while(LCD_Busy_Check());
  97. LCD_RS=1;LCD_RW=0;LCD_EN=0;
  98. P0=dat;
  99. delayNOP();
  100. LCD_EN=1;
  101. delayNOP();
  102. LCD_EN=0;
  103. }


  104. void Init_LCD()//LCD初始化
  105. {Write_LCD_Command(0x01);DelayMS(5);
  106. Write_LCD_Command(0x38);DelayMS(5);
  107. Write_LCD_Command(0x0c);DelayMS(5);
  108. Write_LCD_Command(0x06);DelayMS(5);
  109. }

  110. void Set_LCD_POS(uchar pos)//設(shè)置顯示位置
  111. {        Write_LCD_Command(pos|0x80);
  112.   }


  113. void Display_LCD_String(uchar p,uchar *s)//在LCD上顯示字符串
  114. {uchar i;
  115. Set_LCD_POS(p);
  116. for(i=0;i<16;i++)
  117. {Write_LCD_Data(s[i]);
  118. DelayMS(1);
  119. }
  120. }


  121. void Format_DateTime(uchar d,uchar *a)//日期與時(shí)間值轉(zhuǎn)換為數(shù)字字符
  122. {a[0]=d/10+'0';
  123. a[1]=d%10+'0';
  124. }


  125. uchar isLeapYear(uint y)//判斷是否為閏年
  126. {return (y%4==0&&y%100!=0)||(y%400==0);
  127. }


  128. void RefreshWeekDay()
  129. {uint i,d,w=5; //
  130. for(i=2021;i<2021+DateTime[6];i++)
  131. { d=isLeapYear(i)?366:365;
  132. w=(w+d)%7;
  133. }
  134. d=0;
  135. for(i=1;i<DateTime[4];i++)
  136. d+=MonthsDays[i];
  137. d+=DateTime[3];
  138. DateTime[5]=(w+d)%7+1;
  139. }


  140. //定時(shí)器0每秒刷新LCD顯示
  141. void T0_INT() interrupt 1
  142. { uchar i;
  143. if(++tCount!=2) return;
  144. tCount=0;//刷新

  145. Format_DateTime(DateTime[6],LCD_DSY_BUFFER1);//年
  146. Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+3);//月
  147. Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+6);//日

  148. Format_DateTime(DateTime[2],LCD_DSY_BUFFER2);//時(shí)
  149. Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+3);//分
  150. Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+6);//秒

  151. Display_LCD_String(0x03,LCD_DSY_BUFFER1);//顯示年月日,星期,時(shí)分秒
  152. Set_LCD_POS(0x43);
  153. for(i=0;i<14;i++)
  154. {
  155. Write_LCD_Data(LCD_DSY_BUFFER2[i]);
  156. DelayMS(1);
  157. }
  158. }

  159. //主程序
  160. void main()
  161. {
  162. Init_LCD();//液晶初始化
  163. IE=0X87;//允許INT0,T0中斷
  164. TR0=1;
  165. while(1)
  166. {GetTime();
  167.   
  168. }}
復(fù)制代碼

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久亚洲精品 | 亚洲欧美视频一区 | 亚洲精品久久国产高清情趣图文 | 一区二区三区四区免费观看 | 亚洲免费在线 | 亚洲韩国精品 | 91av在线视频观看 | 伊人久久综合 | 涩涩视频在线观看 | 亚洲一区播放 | 国产在线一区二区 | 亚洲精品久久久久久一区二区 | 日韩高清中文字幕 | 久久国产电影 | 免费在线成人 | 免费成人高清在线视频 | 精品欧美乱码久久久久久1区2区 | 亚洲精品久久久久久一区二区 | 99精品久久久 | 久久久高清 | 亚洲九九精品 | 久久久久国产一区二区三区 | 日本一二三区电影 | 国产精品色婷婷久久58 | 国产午夜视频 | 国产精品免费一区二区 | 日韩福利 | 国产91观看 | 国产婷婷色一区二区三区 | 伊人伊人伊人 | 中文字幕一区二区三区在线乱码 | 九九爱这里只有精品 | 亚洲精选一区二区 | 理论片午午伦夜理片影院 | 黄视频免费观看 | 91xxx在线观看 | 中国三级黄色录像 | 国产欧美久久一区二区三区 | 三级免费网 | 久久成人精品一区二区三区 | 亚洲大片|