当前位置:   article > 正文

基于51单片机万年历

单片机万年历

目录

一、项目功能概述

二、原理图设计

三、PCB设计

四、仿真实现

五、程序设计

六、设计资料

 资料下载地址:基于51单片机万年历

一、项目功能概述

1、可以显示年、月、日、时、分、秒、星期、农历

2、按键可以设置闹钟及报警

3、可以调整时间

共四个按键:设置、加、减、切换

二、原理图设计

三、PCB设计

四、仿真实现

五、程序设计

部分代码

  1. #include <reg52.h> //调用单片机头文件
  2. #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
  3. #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
  4. #include "nongli.h"
  5. bit flag_200ms ;
  6. bit flag_100ms ;
  7. sbit beep = P3^7; //蜂鸣器定义
  8. bit flag_beep_en;
  9. uint clock_value; //用作闹钟用的
  10. void yunyin_boshi(); //语音报时程序
  11. sbit dq = P3^2; //18b20 IO口的定义
  12. /***********************语音模块控制IO口的定义************************/
  13. sbit VRST = P2^4;
  14. sbit VBUSY= P2^0;
  15. sbit VSDA = P2^1;
  16. sbit VCS = P2^2;
  17. sbit VSCL = P2^3;
  18. uchar yujing[3];
  19. uint temperature ; //温度变量
  20. uchar flag_nl; //农历 阳历显示标志位
  21. uchar menu_1,menu_2;
  22. uchar key_time,flag_value; //用做连加的中间变量
  23. bit key_500ms ;
  24. uchar n_nian,n_yue,n_ri; //农历显示的函数
  25. #include "ds1302.h"
  26. #include "lcd1602.h"
  27. /***********100us的延时函数***12M晶振**************/
  28. void delay_100us(uchar z)
  29. { //12M
  30. uchar x,y;
  31. for(x=0;x<z;x++)
  32. for(y=0;y<30;y++);
  33. }
  34. /***********************18b20初始化函数*****************************/
  35. void init_18b20()
  36. {
  37. bit q;
  38. dq = 1; //把总线拿高
  39. delay_uint(1); //15us
  40. dq = 0; //给复位脉冲
  41. delay_uint(80); //750us
  42. dq = 1; //把总线拿高 等待
  43. delay_uint(10); //110us
  44. q = dq; //读取18b20初始化信号
  45. delay_uint(20); //200us
  46. dq = 1; //把总线拿高 释放总线
  47. }
  48. /*************写18b20内的数据***************/
  49. void write_18b20(uchar dat)
  50. {
  51. uchar i;
  52. for(i=0;i<8;i++)
  53. { //写数据是低位开始
  54. dq = 0; //把总线拿低写时间隙开始
  55. dq = dat & 0x01; //向18b20总线写数据了
  56. delay_uint(5); // 60us
  57. dq = 1; //释放总线
  58. dat >>= 1;
  59. }
  60. }
  61. if(menu_2 == 3) //设置秒
  62. {
  63. if(key_can == 3) //加
  64. {
  65. miao+=0x01;
  66. if((miao & 0x0f) >= 0x0a)
  67. miao = (miao & 0xf0) + 0x10;
  68. if(miao >= 0x60)
  69. miao = 0;
  70. }
  71. if(key_can == 4) //减
  72. {
  73. if(miao == 0x00)
  74. miao = 0x5a;
  75. if((miao & 0x0f) == 0x00)
  76. miao = (miao | 0x0a) - 0x10;
  77. miao -- ;
  78. }
  79. }
  80. if(menu_2 == 4) //设置星期
  81. {
  82. if(key_can == 3) //加
  83. {
  84. week+=0x01;
  85. if((week & 0x0f) >= 0x0a)
  86. week = (week & 0xf0) + 0x10;
  87. if(week >= 0x08)
  88. week = 1;
  89. }
  90. if(key_can == 4) //减
  91. {
  92. if(week == 0x01)
  93. week = 0x08;
  94. if((week & 0x0f) == 0x00)
  95. week = (week | 0x0a) - 0x10;
  96. week -- ;
  97. }
  98. }
  99. if(menu_2 == 5) //设置年
  100. {
  101. if(key_can == 3) //加
  102. {
  103. nian+=0x01;
  104. if((nian & 0x0f) >= 0x0a)
  105. nian = (nian & 0xf0) + 0x10;
  106. if(nian >= 0x9a)
  107. nian = 1;
  108. }
  109. if(key_can == 4) //减
  110. {
  111. if(nian == 0x01)
  112. nian = 0x9a;
  113. if((nian & 0x0f) == 0x00)
  114. nian = (nian | 0x0a) - 0x10;
  115. nian -- ;
  116. }
  117. }
  118. if(menu_2 == 6) //设置月
  119. {
  120. if(key_can == 3) //加
  121. {
  122. yue+=0x01;
  123. if((yue & 0x0f) >= 0x0a)
  124. yue = (yue & 0xf0) + 0x10;
  125. if(yue >= 0x13)
  126. yue = 1;
  127. }
  128. if(key_can == 4) //减
  129. {
  130. if(yue == 0x01)
  131. yue = 0x13;
  132. if((yue & 0x0f) == 0x00)
  133. yue = (yue | 0x0a) - 0x10;
  134. yue -- ;
  135. }
  136. }
  137. if(menu_2 == 7) //设置日
  138. {
  139. if(key_can == 3) //加
  140. {
  141. ri+=0x01;
  142. if((ri & 0x0f) >= 0x0a)
  143. ri = (ri & 0xf0) + 0x10;
  144. if(ri >= 0x32)
  145. ri = 0;
  146. }
  147. if(key_can == 4) //减
  148. {
  149. if(ri == 0x01)
  150. ri = 0x32;
  151. if((ri & 0x0f) == 0x00)
  152. ri = (ri | 0x0a) - 0x10;
  153. ri -- ;
  154. }
  155. }
  156. if(menu_2 == 3) //设置秒
  157. {
  158. if(key_can == 3) //加
  159. {
  160. fen1+=0x01;
  161. if((fen1 & 0x0f) >= 0x0a)
  162. fen1 = (fen1 & 0xf0) + 0x10;
  163. if(fen1 >= 0x60)
  164. fen1 = 0;
  165. }
  166. if(key_can == 4) //减
  167. {
  168. if(fen1 == 0x00)
  169. fen1 = 0x5a;
  170. if((fen1 & 0x0f) == 0x00)
  171. fen1 = (fen1 | 0x0a) - 0x10;
  172. fen1 -- ;
  173. }
  174. }
  175. if(open1 == 1)
  176. write_string(2,4,"Y");
  177. else
  178. write_string(2,4,"N");
  179. write_sfm2_ds1302(2,7,shi1); //显示闹钟时
  180. write_sfm2_ds1302(2,10,fen1); //显示闹钟分
  181. switch(menu_2) // 光标显示
  182. {
  183. case 1: write_guanbiao(2,4,1); break;
  184. case 2: write_guanbiao(2,7,1); break;
  185. case 3: write_guanbiao(2,10,1); break;
  186. }
  187. }
  188. }
  189. /***********************小延时函数**************************/
  190. void delay_us (unsigned int us)
  191. {
  192. while(us--)
  193. {
  194. _nop_();
  195. }
  196. }
  197. /***********************三线发码子程序************************/
  198. void Send_threelines(unsigned char addr,uchar dat)
  199. {
  200. unsigned char i;
  201. VRST=0;
  202. delay_1ms(5);
  203. VRST=1;
  204. delay_1ms(20); /* 复位拉高20ms*/
  205. VCS=0;
  206. delay_1ms(5); /* 片选拉低5ms */
  207. for(i=0;i<8;i++)
  208. {
  209. VSCL=0;
  210. if(addr&0x01)
  211. {
  212. VSDA=1;
  213. }
  214. else
  215. VSDA=0;
  216. addr>>=1;
  217. delay_us(150); /* 150us */
  218. VSCL=1;
  219. delay_us(150); /* 150us */
  220. }
  221. VCS=1;
  222. delay_1ms(30);
  223. if(dat == 1)
  224. while(VBUSY == 0); //忙等待
  225. }

六、设计资料

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号