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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2286|回復: 0
打印 上一主題 下一主題
收起左側

單片機+DS1302 LCD1602時間顯示程序

[復制鏈接]
跳轉到指定樓層
樓主
效果和接法看圖吧,只是簡單用時鐘芯片顯示時間


單片機源程序如下:
  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數據線
  8. sbit CLK=P2^5;  //         DS1302時鐘線
  9. sbit RST=P2^4;  // DS1302復位線
  10. //DS18B20數據端口定義
  11. sbit DQ=P2^4;    //DS18B20數據端口
  12. sbit LCD_RS=P2^0;   // LCD寄存器選擇
  13. sbit LCD_RW=P2^1;   //         LCD讀寫/寫控制
  14. sbit LCD_EN=P2^2;   //  LCD啟用

  15. uchar tCount=0;
  16. //一年中每個月的天數,2月的天數由年份決定
  17. uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
  18. //周日,每周一到周六(0,1-6)【讀取DS1302時分別是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];  //所讀取的日期時間
  24. uchar Adjust_flag=0; //當前調節的時間對像:秒,分,時,日,月,年(1,2,3,4,5,6)
  25. uchar Change_Flag[]=" YMDHM";//(分,時,日,月,年)(不調節秒與周)


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


  31. void Write_A_Byte_TO_DS1302(uchar x)//向DS1302寫入一個字節
  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()//讀取一個字節
  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碼轉換
  43. }

  44. uchar Read_Data(uchar addr)//指定位置讀數據
  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)//向某地址寫入數據
  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()//設置時間
  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));//日,月,周,年,寫入 地址每次增2
  64. }
  65. Write_DS1302(0x8e,0x80);//加保護
  66. }


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

  75. //LCD驅動代碼
  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) //寫指令
  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)//寫數據
  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)//設置顯示位置
  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)//日期與時間值轉換為數字字符
  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. //定時器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);//時
  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);//顯示年月日,星期,時分秒
  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. }}
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久色网 | 在线91 | 国产成人精品久久二区二区91 | 正在播放国产精品 | 成人高清视频在线观看 | 精品国产一区二区三区久久久四川 | 91精品国产乱码久久久久久 | 爱草视频 | av毛片 | 91精品国产91久久久久久三级 | 中文字幕蜜臀 | 欧美精品国产精品 | 奇米影视77 | 91婷婷韩国欧美一区二区 | 日韩一区二区免费视频 | 亚洲三区在线观看 | 国产一区二区不卡 | 网站国产 | 精品国产乱码久久久久久图片 | 不卡av在线| 一级毛片免费视频观看 | 国产超碰人人爽人人做人人爱 | 国产日韩视频 | 国产精品日韩欧美一区二区 | 免费午夜电影 | 91精品国产一区二区在线观看 | 亚洲国产精品人人爽夜夜爽 | 少妇精品久久久久久久久久 | 四虎成人av| 日韩久草 | 综合久久综合久久 | 91视频观看 | 在线欧美亚洲 | 一区二区三区四区不卡 | 91精品久久久久久久久久 | 一级国产精品一级国产精品片 | 97成人免费| 成人午夜黄色 | 韩日一区二区三区 | 视频一区二区三区四区五区 | 一二区视频 |