找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4269|回复: 6
打印 上一主题 下一主题
收起左侧

12864万年历制作资料

[复制链接]
跳转到指定楼层
楼主
自己做的12864万年历,分享给51黑电子论坛的朋友们

所有资料打包下载:
万年历12864资料.zip (901.26 KB, 下载次数: 82)

DS1302用现成模块,可以自己网上找电路图焊
DS18B20引脚看清楚不要搞错
12864为并行方式,PSB跟RST接高电平就行,对比度通过103电位器调背光,可用单片机控制或
用热释电模块控制。
闹钟数据掉电会丢失,可以自己改改程序,用24C02或其它芯片

电路图没有,因为简单,接线时看程序接或自己接好后改程序的定义



所需元器件:
1.单片机最小系统,包括上电复位电路跟时钟电路
2.12864液晶屏1个
3.DS18B20数字温度芯片(三脚)
4.DS1302模块
5.蜂鸣器(有源跟无源各一),三极管8050(3个),103电位器用在12864调对比度
6.按键4个,热释电模块一个,开关一个,导线若干,烙铁,焊锡,
7.其他自己发挥扩展

部分源码预览:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include"lcd12864.h"
  4. sbit DSPORT=P3^6;         //ds18b20接口
  5. sbit DSIO=P2^1;                 //ds1302接口
  6. sbit RST=P2^3;
  7. sbit SCLK=P2^2;
  8. sbit zz=P2^4;                           //有源蜂鸣器        用三极管8050驱动

  9. sbit s1=P1^0;                          //调节时间
  10. sbit s2=P1^1;                           //加
  11. sbit s3=P1^2;                                 //减
  12. sbit s4=P1^3;                                  //调节闹钟
  13. sbit Beep=P1^7;                        //扬声器   用三极管8050驱动
  14. //---定义全局函数---//
  15. void Ds1302Write(uchar addr, uchar dat);
  16. uchar Ds1302Read(uchar addr);
  17. void Ds1302Init();
  18. void Ds1302ReadTime();

  19. //---加入全局变量--//
  20. uchar timeji=0,n=0,keysun=2;
  21. char SetPlace=-1,naoshi=0x08,naofen=0x00,linsheng=1;                          //参数定义
  22. bit biaozhi=1;
  23. bit biaozhi1=1;
  24. bit naobiao=0;
  25. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  26. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

  27. //---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---//
  28. //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
  29. char TIME[7] = {0x00, 0x57, 0x10, 0x01, 0x01, 0x05, 0x16};

  30. void Delay1ms(unsigned int );
  31. unsigned char Ds18b20Init();
  32. void Ds18b20WriteByte(unsigned char com);
  33. unsigned char Ds18b20ReadByte();
  34. void  Ds18b20ChangTemp();
  35. void  Ds18b20ReadTempCom();
  36. int Ds18b20ReadTemp();

  37. uchar code CharCode[]="    调整时间      年  月  日周  时间  点  分  秒   ";
  38. uchar code CharCode1[]="20  -  -    周                                              . ℃";
  39. uchar code xiqi[]="  一二三四五六日开关";
  40. uchar code naozhong[]="  设置闹钟            点  分        铃声选择      ";
  41. uchar code naozhonglinshen[]="1.天空之城      2.月亮代表我的心3.你是风儿我是沙4.莫斯科郊外的晚5.经典铃声  嘀嘀";
  42. uchar code tab[11][64]={
  43. {/*--  调入了一幅图像:D:\设计\打印\数字取模图片\0.bmp  --*/
  44. /*--  宽度x高度=16x32  --*/
  45. 0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,
  46. 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
  47. 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
  48. 0xF0,0x0F,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0x7F,0xFE,0x7F,0xFE,0x3F,0xFC,0x0F,0xF0,},
  49. {/*--  1  --*/
  50. /*--  宽度x高度=16x32  --*/
  51. 0x01,0x80,0x07,0xC0,0x0F,0xC0,0x1F,0xE0,0x3F,0xE0,0x7F,0xE0,0xFF,0xE0,0xE3,0xE0,
  52. 0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,
  53. 0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,
  54. 0x03,0xE0,0x03,0xE0,0x03,0xE0,0x07,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0x00,0x00,},
  55. {/*--  2  --*/
  56. /*--  宽度x高度=16x32  --*/
  57. 0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0xFF,0xFE,0xFC,0x3F,0xF0,0x1F,0xE0,0x0F,0x00,0x0F,
  58. 0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x1F,0x00,0x3F,0x00,0x7F,0x00,0xFE,
  59. 0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xC0,0x3F,0x80,0x7F,0x00,0x7E,0x00,0xFC,0x00,
  60. 0xFC,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,},
  61. {/*--  调入了一幅图像:D:\设计\打印\数字取模图片\3.bmp  --*/
  62. /*--  宽度x高度=16x32  --*/
  63. 0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0xFC,0x3F,0xF0,0x1F,0xE0,0x1F,0xE0,0x0F,
  64. 0xC0,0x0F,0x00,0x0F,0x00,0x1F,0x00,0x1E,0x00,0x3E,0x00,0xFC,0x1F,0xFC,0x1F,0xF8,
  65. 0x1F,0xFC,0x1F,0xFC,0x00,0x7E,0x00,0x3F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x1F,
  66. 0x00,0x1F,0x00,0x1F,0xC0,0x3F,0xF0,0x7F,0xFF,0xFE,0xFF,0xFE,0xFF,0xFC,0x3F,0xF0,},
  67. {/*--  调入了一幅图像:D:\设计\打印\数字取模图片\4.bmp  --*/
  68. /*--  宽度x高度=16x32  --*/
  69. 0x00,0x0E,0x00,0x1E,0x00,0x3E,0x00,0x7E,0x00,0xFE,0x01,0xFE,0x03,0xFE,0x03,0xFE,
  70. 0x07,0xFE,0x0F,0xFE,0x1F,0xFE,0x1F,0xBE,0x3F,0x3E,0x3E,0x3E,0x7E,0x3E,0x7C,0x3E,
  71. 0xFC,0x3E,0xF8,0x3E,0xF8,0x3E,0xF0,0x3E,0xF0,0x3E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  72. 0xFF,0xFF,0xFF,0xFF,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,},
  73. {/*--  调入了一幅图像:D:\设计\打印\数字取模图片\5.bmp  --*/
  74. /*--  宽度x高度=16x32  --*/
  75. 0x1F,0xFF,0x3F,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,0xFF,0xFC,0x00,0xF8,0x00,0xF8,0x00,
  76. 0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xFC,0x00,0xFF,0xE0,0x7F,0xFC,0x7F,0xFE,
  77. 0x3F,0xFF,0x07,0xFF,0x00,0x7F,0x00,0x1F,0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0F,
  78. 0x00,0x1F,0x00,0x1F,0xF0,0x3F,0xFC,0x7F,0x7F,0xFE,0x7F,0xFE,0x3F,0xFC,0x0F,0xF0,},
  79. {/*--  调入了一幅图像:D:\设计\打印\数字取模图片\6.bmp  --*/
  80. /*--  宽度x高度=16x32  --*/
  81. 0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0xFE,0x03,0xFE,0x07,0xFC,0x0F,0xF0,0x1F,0xC0,
  82. 0x3F,0x00,0x7E,0x00,0x7C,0x00,0x7C,0x00,0xF8,0x00,0xF8,0x00,0xFF,0xE0,0xFF,0xF8,
  83. 0xFF,0xFE,0xFF,0xFE,0xF8,0x7E,0xF0,0x3F,0xF0,0x1F,0xF0,0x1F,0xF0,0x1F,0xF0,0x1F,
  84. 0xF0,0x1F,0xF0,0x1F,0xF8,0x3F,0xFE,0xFF,0x7F,0xFE,0x7F,0xFE,0x3F,0xFC,0x0F,0xF0,},
  85. {/*--  调入了一幅图像:D:\设计\打印\数字取模图片\7.bmp  --*/
  86. /*--  宽度x高度=16x32  --*/
  87. 0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x1F,0x00,0x0F,0x00,0x0F,
  88. 0x00,0x0F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x3E,0x00,0x3E,0x00,0x3E,
  89. 0x00,0x3C,0x00,0x7C,0x00,0x78,0x00,0xF8,0x00,0xF8,0x00,0xF0,0x01,0xF0,0x01,0xF0,
  90. 0x01,0xE0,0x01,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xC0,0x07,0xC0,0x07,0xC0,0x07,0xC0,},
  91. {/*--  调入了一幅图像:D:\设计\打印\数字取模图片\8.bmp  --*/
  92. /*--  宽度x高度=16x32  --*/
  93. 0x0F,0xF0,0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,
  94. 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0x7F,0xFE,0x3F,0xFC,
  95. 0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
  96. 0xF0,0x0F,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0x7F,0xFE,0x3F,0xFC,0x1F,0xF8,0x0F,0xF0,},
  97. {/*--  调入了一幅图像:D:\设计\打印\数字取模图片\6.bmp  --*/
  98. /*--  宽度x高度=16x32  --*/
  99. 0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0xFF,0x7F,0xFC,0x1F,0xF8,0x0F,0xF8,0x0F,
  100. 0xF8,0x0F,0xF8,0x0F,0xF8,0x0F,0xF8,0x0F,0xF8,0x0F,0x7C,0x1F,0x7F,0xFF,0x7F,0xFF,
  101. 0x3F,0xFF,0x03,0xFF,0x00,0x3F,0x00,0x1F,0x00,0x3F,0x00,0x3E,0x00,0x7E,0x00,0xFC,
  102. 0x03,0xF8,0x0F,0xF0,0x3F,0xE0,0x7F,0xC0,0x7F,0x80,0x7E,0x00,0x38,0x00,0x00,0x00,},
  103. {/*--  调入了一幅图像:这是您新建的图像  --*/
  104. /*--  宽度x高度=16x32  --*/
  105. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,
  106. 0x07,0xC0,0x05,0x40,0x07,0xC0,0x06,0xC0,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
  107. 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x07,0xC0,0x05,0x40,0x07,0xC0,0x06,0xC0,
  108. 0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}
  109. };
  110. unsigned int code music_tab[4][201] ={{                                                 //天空之城
  111. 0x39,0x20,0x33,0x20,0x30,0x30,0x33,0x10,0x30,0x40,0x26,0x40,0x33,0x80,
  112. 0x4c,0x40,0x39,0x30,0x40,0x10,0x39,0x40,0x30,0x40,0x40,0x80,0x4c,0x20,
  113. 0x4c,0x20,0x48,0x30,0x4c,0x10,0x48,0x40,0x30,0x40,0x4c,0x80,0x30,0x20,
  114. 0x30,0x20,0x33,0x30,0x48,0x10,0x48,0x40,0x33,0x40,0x33,0x80,0x39,0x20,
  115. 0x33,0x20,0x30,0x30,0x33,0x10,0x30,0x40,0x26,0x40,0x33,0x80,0x4c,0x40,
  116. 0x39,0x30,0x40,0x10,0x39,0x40,0x30,0x40,0x40,0x80,0x55,0x20,0x4c,0x20,
  117. 0x48,0x40,0x30,0x20,0x33,0x30,0x30,0x20,0x2b,0x10,0x2b,0x30,0x26,0x10,
  118. 0x30,0x80,0x30,0x20,0x33,0x20,0x39,0x20,0x39,0x20,0x33,0x20,0x40,0x20,
  119. 0x39,0x80,0x30,0x20,0x2b,0x20,0x26,0x30,0x2b,0x10,0x26,0x40,0x20,0x40,
  120. 0x2b,0xc0,0x30,0x40,0x30,0x20,0x33,0x20,0x30,0x40,0x26,0x40,0x26,0xc0,
  121. 0x33,0x20,0x30,0x40,0x33,0x20,0x30,0x20,0x2b,0x40,0x30,0x60,0x00,0x00,
  122. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  123. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  124. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  125. 0x00,0x00,0x00,0x00,0x00},
  126. {                                                           //月亮代表我的心
  127. 0x40,0x20,0x30,0x60,0x26,0x20,0x20,0x60,0x30,0x20,0x33,0x60,0x26,0x20,
  128. 0x20,0x60,0x20,0x20,0x1c,0x60,0x19,0x20,0x20,0xc0,0x26,0x20,0x2b,0x20,
  129. 0x30,0x60,0x30,0x10,0x30,0x40,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,
  130. 0x30,0x40,0x2b,0x20,0x26,0x20,0x2b,0x60,0x39,0x10,0x33,0x40,0x30,0xc0,
  131. 0x26,0x40,0x26,0x60,0x2b,0x10,0x30,0x40,0x20,0x40,0x33,0xc0,0x39,0x20,
  132. 0x33,0x20,0x39,0x60,0x33,0x10,0x39,0x60,0x40,0x10,0x26,0xc0,0x20,0x40,
  133. 0x26,0x60,0x2b,0x10,0x30,0x40,0x20,0x40,0x33,0xc0,0x39,0x20,0x33,0x20,
  134. 0x30,0x60,0x30,0x10,0x30,0x40,0x2b,0x40,0x2b,0xc0,0x40,0x20,0x30,0x60,
  135. 0x26,0x10,0x20,0x60,0x30,0x10,0x33,0x60,0x26,0x10,0x20,0x60,0x20,0x10,
  136. 0x1c,0x60,0x19,0x10,0x20,0x80,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,
  137. 0x30,0x40,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,0x30,0x40,0x2b,0x20,
  138. 0x26,0x20,0x2b,0x60,0x39,0x10,0x33,0x40,0x2b,0x40,0x30,0xc0,0x00,0x00,
  139. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  140. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  141. 0x00,0x00,0x00,0x00,0x00},
  142. {                                                                //你是风儿我是沙
  143. 0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,0x20,0x10,0x20,0xc0,
  144. 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,0x26,0x20,0x26,0xc0,
  145. 0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,0x20,0x10,0x20,0xc0,
  146. 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,0x30,0x20,0x30,0xc0,
  147. 0x26,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x26,0x10,0x2b,0x10,0x30,0x20,
  148. 0x39,0x20,0x30,0x60,0x2b,0x10,0x26,0x80,0x2b,0x10,0x26,0x10,0x39,0x60,
  149. 0x2b,0x10,0x24,0x60,0x2b,0x10,0x26,0x20,0x26,0x60,0x30,0x60,0x39,0x10,
  150. 0x40,0x80,0x30,0x20,0x39,0x20,0x39,0x20,0x30,0x20,0x26,0x20,0x26,0x20,
  151. 0x26,0x20,0x26,0x20,0x2b,0x40,0x39,0x20,0x2b,0x60,0x30,0x20,0x39,0x20,
  152. 0x39,0x20,0x39,0x20,0x30,0x20,0x2b,0x20,0x2b,0x20,0x2b,0x20,0x26,0x40,
  153. 0x2b,0x20,0x30,0x80,0x26,0x20,0x20,0x20,0x18,0x20,0x1c,0x80,0x1c,0x30,
  154. 0x20,0x10,0x20,0xc0,0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,
  155. 0x26,0x20,0x26,0x80,0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,
  156. 0x20,0x10,0x20,0xc0,0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,
  157. 0x26,0x20,0x26,0xc0,0x00,},
  158. {                                                                        //                        莫斯科郊外的晚上
  159. 0x39,0x20,0x30,0x20,0x26,0x20,0x30,0x20,0x2b,0x40,0x30,0x20,0x33,0x20,
  160. 0x26,0x60,0x2b,0x40,0x39,0x80,0x30,0x20,0x26,0x20,0x20,0x20,0x20,0x20,
  161. 0x1c,0x40,0x20,0x20,0x24,0x20,0x26,0x80,0x24,0x40,0x20,0x40,0x19,0x20,
  162. 0x1c,0x20,0x26,0x40,0x33,0x40,0x39,0x20,0x26,0x20,0x2b,0x20,0x24,0x60,
  163. 0x20,0x20,0x24,0x20,0x26,0x40,0x2b,0x20,0x30,0x20,0x26,0x40,0x2b,0x40,
  164. 0x39,0x80,0x39,0x20,0x30,0x20,0x26,0x20,0x30,0x20,0x2b,0x40,0x30,0x20,
  165. 0x33,0x20,0x26,0x60,0x2b,0x40,0x39,0x80,0x30,0x20,0x26,0x20,0x20,0x20,
  166. 0x20,0x20,0x1c,0x40,0x20,0x20,0x24,0x20,0x26,0x80,0x24,0x40,0x20,0x40,
  167. 0x19,0x20,0x1c,0x20,0x26,0x40,0x33,0x40,0x39,0x20,0x26,0x20,0x2b,0x20,
  168. 0x24,0x60,0x20,0x20,0x24,0x20,0x26,0x40,0x2b,0x20,0x30,0x20,0x26,0x40,
  169. 0x2b,0x40,0x39,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  170. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  171. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  172. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  173. 0x00,0x00,0x00,0x00,0x00} };
  174. void jiemian();
  175. void LcdDisplay(int temp);
  176. void display();
  177. void zhudisplay();
  178. void TimerConfiguration();
  179. void key();
  180. void naoxian();
  181. void didi();
  182. void naoxianguangbiao();
  183. void linshengbofang();
  184. void sfmxiangao(uchar add,uchar bata);
  185. void sfmxiandi(uchar acc,uchar datb);
  186. void zhujiemian();
  187. void shua_display();
  188. void nyrdisplay();
  189. void delay (unsigned char m);   //控制频率延时   
  190. void delayms(unsigned char a);  //豪秒延时子程序   
  191. void main()
  192. {        
  193.         zz=0;
  194.         Beep=0;
  195.         LCD12864_ClearScreen();          //清CGrom
  196.         LCD12864_WriteCmd(0x01);  //清屏
  197.         LCD12864_Init();
  198.         zhujiemian();
  199.         TimerConfiguration();
  200.         while(1)
  201.         {
  202.                  key();
  203.                 if(biaozhi1==1)
  204.                 {
  205.                     shua_display();
  206.                         if(biaozhi==0)
  207.                         {
  208.                                 biaozhi=1;
  209.                                 LcdDisplay(Ds18b20ReadTemp());
  210.                         }
  211.                         if((naoshi==TIME[2])&&(naofen==TIME[1])&&(naobiao==1))//闹钟
  212.                         {
  213.                                 if(linsheng<5)
  214.                                 {
  215.                                         linshengbofang();
  216.                                 }
  217.                                 if(linsheng==5)
  218.                                 {
  219.                                          didi();
  220.                                 }
  221.                         }               
  222.                 }               
  223.         }        
  224. }
  225. void nyrdisplay()
  226. {
  227.         LCD12864_SetWindow(0, 1);
  228.         LCD12864_WriteData(0x30+TIME[6]/16);                        //        年
  229.         LCD12864_WriteData(0x30+(TIME[6]&0x0f));
  230.         LCD12864_WriteData(0x2d);
  231.         LCD12864_WriteData(0x30+TIME[4]/16);                        //月
  232.         LCD12864_WriteData(0x30+(TIME[4]&0x0f));
  233.         LCD12864_WriteData(0x2d);
  234.         LCD12864_WriteData(0x30+TIME[3]/16);                        //日
  235.         LCD12864_WriteData(0x30+(TIME[3]&0x0f));
  236.         LCD12864_SetWindow(0, 7);
  237.         LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]);        //星期
  238.         LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
  239. }
  240. void zhujiemian()
  241. {
  242.         unsigned char i=0,j=0,k=0;
  243.         LCD12864_SetWindow(0, 0);
  244.         while(CharCode1[i]!='\0')
  245.         {                        
  246.                 LCD12864_WriteData(CharCode1[i]);
  247.                 i++;
  248.                 if(i==16)  //第一行满写第三行
  249.                 {
  250.                         LCD12864_SetWindow(1,0);
  251.                 }
  252.                 if(i==32)  //第三行满写第四行
  253.                 {
  254.                         LCD12864_SetWindow(2,0);
  255.                 }
  256.                 if(i==48)  //第三行满写第四行
  257.                 {
  258.                         LCD12864_SetWindow(3,0);
  259.                 }                        
  260.         }
  261.         zhudisplay();
  262.         LCD12864_WriteCmd(0x36);          //开启拓展指令集
  263.         for(i=0;i<16;i++)
  264.         {
  265.                 LCD12864_WriteCmd(0x90+i);
  266.                 LCD12864_WriteCmd(0x90+2);
  267.                 LCD12864_WriteData(tab[10][j++]);
  268.                 LCD12864_WriteData(tab[10][j++]);                 //显示笑脸
  269.                 LCD12864_WriteCmd(0x90+i);
  270.                 LCD12864_WriteCmd(0x90+5);
  271.                 LCD12864_WriteData(tab[10][k++]);
  272.                 LCD12864_WriteData(tab[10][k++]);
  273.         }
  274.         for(i=0;i<16;i++)
  275.         {
  276.                 LCD12864_WriteCmd(0x80+i);
  277.                 LCD12864_WriteCmd(0x98+2);
  278.                 LCD12864_WriteData(tab[10][j++]);          //显示笑脸
  279.                 LCD12864_WriteData(tab[10][j++]);
  280.                 LCD12864_WriteCmd(0x80+i);
  281.                 LCD12864_WriteCmd(0x98+5);
  282.                 LCD12864_WriteData(tab[10][k++]);
  283.                 LCD12864_WriteData(tab[10][k++]);        
  284.         }
  285.         LCD12864_WriteCmd(0x30);         //恢复基本指令集
  286. }
  287. void shua_display()
  288. {
  289.         Ds1302ReadTime();
  290.         if((TIME[2]==0x00)&&(TIME[0]<=5))
  291.                 nyrdisplay();
  292.         if((TIME[1]==0x00)&&(TIME[0]<=3))
  293.         {
  294.                 if((TIME[2]&0x0f)==0)
  295.                 sfmxiangao(0,TIME[2]);
  296.                 sfmxiandi(1,TIME[2]);                //时
  297.                 didi();         //整点报时
  298.         }
  299.         if(TIME[0]<=2)
  300.         {
  301.                 if((TIME[1]&0x0f)==0)
  302.                 sfmxiangao(3,TIME[1]);           //分
  303.                 sfmxiandi(4,TIME[1]);
  304.         }
  305.                 if((TIME[0]&0x0f)==0)        
  306.                 sfmxiangao(6,TIME[0]);           //秒
  307.                 sfmxiandi(7,TIME[0]);               
  308. }
  309. void zhudisplay()
  310. {
  311.         Ds1302ReadTime();
  312.         nyrdisplay();
  313.         sfmxiangao(0,TIME[2]);
  314.         sfmxiandi(1,TIME[2]);                //时
  315.         sfmxiangao(3,TIME[1]);           //分
  316.         sfmxiandi(4,TIME[1]);        
  317.         sfmxiangao(6,TIME[0]);           //秒
  318.         sfmxiandi(7,TIME[0]);        
  319. }      
  320. void int1()  interrupt 3   //采用定时中断1 控制节拍   
  321. {  TH1=0xd8;   
  322.    TL1=0xef;   
  323.    n--;   
  324. }   
  325. void delay (unsigned char m)   //控制频率延时   
  326. {   
  327. unsigned i=3*m;   
  328. while(--i);   
  329. }      
  330. void delayms(unsigned char a)  //豪秒延时子程序   
  331. {   
  332.   while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!   
  333. }      
  334. void linshengbofang()   
  335. { unsigned char p=0,m;   //m为频率常数变量   
  336.   unsigned char i=0,j;      
  337.   for(j=0;j<150;j++)   
  338.     {   
  339.      a:p=music_tab[linsheng][i];   
  340.        if(p==0x00)       { i=0, delayms(1000); return;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
  341.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符   
  342.             else         {m=music_tab[linsheng-1][i++], n=music_tab[linsheng-1][i++];}  //取频率常数 和 节拍常数   
  343.              TR1=1;                                             //开定时器1   
  344.            while(n!=0) Beep=~Beep,delay(m);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
  345.        TR1=0;                                             //关定时器1   
  346.     }   
  347. }
  348. void naojie()
  349. {
  350.         unsigned char i=0;
  351.         LCD12864_SetWindow(0, 0);
  352.         while(naozhong[i]!='\0')
  353.         {                        
  354.                 LCD12864_WriteData(naozhong[i]);
  355.                 i++;
  356.                 if(i==16)  //第一行满写第三行
  357.                         LCD12864_SetWindow(1,0);
  358.                 if(i==32)  //第三行满写第四行
  359.                         LCD12864_SetWindow(2,0);
  360.                 if(i==48)  //第三行满写第四行
  361.                         LCD12864_SetWindow(3,0);
  362.         }
  363. }
  364. void naoxianguangbiao()
  365. {
  366.         if(SetPlace==0)
  367.                  LCD12864_SetWindow(2, 6);
  368.         if(SetPlace==1)
  369.                 LCD12864_SetWindow(2, 4);
  370.         if(SetPlace==2)
  371.                  LCD12864_SetWindow(2, 2);
  372.         if(SetPlace==3)
  373.                  LCD12864_SetWindow(1, 4);
  374.         if(SetPlace==4)
  375.                  LCD12864_SetWindow(1, 2);
  376.         if(SetPlace==5)
  377.                  LCD12864_SetWindow(1, 7);
  378.         if(SetPlace==8)           //闹钟设置
  379.                  LCD12864_SetWindow(0, 6);
  380.         if(SetPlace==9)
  381.                 LCD12864_SetWindow(1, 2);
  382.         if(SetPlace==10)
  383.                  LCD12864_SetWindow(1, 4);
  384.         if(SetPlace==11)
  385.                 LCD12864_SetWindow(3, 0);
  386. }
  387. void sfmxiangao(uchar add,uchar bata)
  388. {
  389.         uchar i,j=0;
  390.         LCD12864_WriteCmd(0x36);          //开启拓展指令集
  391.         for(i=0;i<16;i++)
  392.         {
  393.                 LCD12864_WriteCmd(0x90+i);
  394.                 LCD12864_WriteCmd(0x90+add);
  395.                 LCD12864_WriteData(tab[bata/16][j++]);
  396.                 LCD12864_WriteData(tab[bata/16][j++]);
  397.         }
  398.         for(i=0;i<16;i++)
  399.         {
  400.                 LCD12864_WriteCmd(0x80+i);
  401.                 LCD12864_WriteCmd(0x98+add);
  402.                 LCD12864_WriteData(tab[bata/16][j++]);
  403.                 LCD12864_WriteData(tab[bata/16][j++]);        
  404.         }
  405.         LCD12864_WriteCmd(0x30);         //恢复基本指令集
  406. }
  407. void sfmxiandi(uchar acc,uchar datb)
  408. {
  409.         uchar i,j=0;
  410.         LCD12864_WriteCmd(0x36);          //开启拓展指令集
  411.         for(i=0;i<16;i++)
  412.         {
  413.                 LCD12864_WriteCmd(0x90+i);
  414.                 LCD12864_WriteCmd(0x90+acc);
  415.                 LCD12864_WriteData(tab[datb&0x0f][j++]);
  416.                 LCD12864_WriteData(tab[datb&0x0f][j++]);
  417.         }
  418.         for(i=0;i<16;i++)
  419.         {
  420.                 LCD12864_WriteCmd(0x80+i);
  421.                 LCD12864_WriteCmd(0x98+acc);
  422.                 LCD12864_WriteData(tab[datb&0x0f][j++]);
  423.                 LCD12864_WriteData(tab[datb&0x0f][j++]);        
  424.         }
  425.         LCD12864_WriteCmd(0x30);         //恢复基本指令集
  426. }
  427. void shixian()                           //调节时间显示
  428. {
  429.         if(SetPlace==0)
  430.         {
  431.                 LCD12864_WriteData(0x30+(TIME[0]/16));                                //秒
  432.                 LCD12864_WriteData(0x30+(TIME[0]&0x0f));
  433.                 LCD12864_SetWindow(2, 6);
  434.         }
  435.         if(SetPlace==1)
  436.         {
  437.                 LCD12864_WriteData(0x30+(TIME[1]/16));                                //分
  438.                 LCD12864_WriteData(0x30+(TIME[1]&0x0f));
  439.                 LCD12864_SetWindow(2, 4);        
  440.         }
  441.         if(SetPlace==2)
  442.         {
  443.                 LCD12864_WriteData(0x30+(TIME[2]/16));                                //时
  444.                 LCD12864_WriteData(0x30+(TIME[2]&0x0f));
  445.                 LCD12864_SetWindow(2, 2);                                 
  446.         }
  447.         if(SetPlace==3)
  448.         {
  449.                 LCD12864_WriteData(0x30+(TIME[3]/16));                        //日
  450.                 LCD12864_WriteData(0x30+(TIME[3]&0x0f));
  451.                  LCD12864_SetWindow(1, 4);
  452.         }
  453.         if(SetPlace==4)
  454.         {
  455.                 LCD12864_WriteData(0x30+(TIME[4]/16));                        //月
  456.                 LCD12864_WriteData(0x30+(TIME[4]&0x0f));
  457.                  LCD12864_SetWindow(1, 2);
  458.         }
  459.         if(SetPlace==5)
  460.         {
  461.                 LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]);        //星期
  462.                 LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
  463.                 LCD12864_SetWindow(1, 7);
  464.         }
  465. }
  466. void naoxian()
  467. {
  468.         uchar zishu=0;
  469.         if(SetPlace==8)           //闹钟设置
  470.         {
  471.                  LCD12864_SetWindow(0, 6);
  472.         }
  473.         if(SetPlace==9)
  474.         {
  475.                 LCD12864_WriteData(0x30+(naoshi/16));                                //时
  476.                 LCD12864_WriteData(0x30+(naoshi&0x0f));
  477.                 LCD12864_SetWindow(1, 2);
  478.         }
  479.         if(SetPlace==10)
  480.         {
  481.                 LCD12864_WriteData(0x30+(naofen/16));                                //分
  482.                 LCD12864_WriteData(0x30+(naofen&0x0f));
  483.                  LCD12864_SetWindow(1, 4);
  484.         }
  485.         if(SetPlace==11)
  486.         {        
  487.                  if(linsheng==1)                                         //显示铃声名字
  488.                 {
  489.                         for(zishu=0;zishu<16;zishu++)
  490.                         {
  491.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  492.                         }
  493.                 }                        
  494.                 if(linsheng==2)
  495.                         for(zishu=16;zishu<32;zishu++)
  496.                         {
  497.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  498.                         }                        
  499.                 if(linsheng==3)
  500.                         for(zishu=32;zishu<48;zishu++)
  501.                         {
  502.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  503.                         }                        
  504.                 if(linsheng==4)
  505.                         for(zishu=48;zishu<64;zishu++)
  506.                         {
  507.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  508.                         }
  509.                 if(linsheng==5)
  510.                         for(zishu=64;zishu<80;zishu++)
  511.                         {
  512.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  513.                         }
  514.                         LCD12864_SetWindow(3, 0);
  515.         }
  516. }
  517. void didi()
  518. {
  519.         zz=1;
  520.         Delay1ms(80);
  521.         zz=0;
  522.         Delay1ms(80);
  523.         zz=1;
  524.         Delay1ms(80);
  525.         zz=0;
  526.         Delay1ms(80);
  527.         zz=1;
  528.         Delay1ms(80);
  529.         zz=0;
  530.         Delay1ms(80);
  531.         zz=1;
  532.         Delay1ms(200);
  533.         zz=0;

  534. }
  535. void key()
  536. {
  537.         uchar zishu=0;
  538.         if(s1==0)                //检测按键K1是否按下
  539.         {
  540.                 Delay1ms(10);        //消除抖动
  541.                 if((s1==0)&&(keysun>=2))
  542.                 {
  543.                         while(s1==0);                //松手检测
  544.                         if(SetPlace==-1)
  545.                         {
  546.                                 LCD12864_WriteCmd(0x01);
  547.                                 biaozhi1=0;
  548.                                 keysun=3;
  549.                                 jiemian();
  550.                                 display();
  551.                         }
  552.                         SetPlace++;
  553.                         LCD12864_WriteCmd(0x0f);  //显示开,开光标
  554.                         if(SetPlace==6)
  555.                         {
  556.                                 LCD12864_WriteCmd(0x0c);  //显示开,关光标        
  557.                                 SetPlace=-1;keysun=2;
  558.                                 biaozhi1=1;
  559.                                 Ds1302Init();
  560.                                 zhujiemian();
  561.                         }
  562.                         naoxianguangbiao();                                       
  563.                 }
  564.         }
  565.         if(s4==0)
  566.         {
  567.                 Delay1ms(10);
  568.                 if((s4==0)&&(keysun<=2))
  569.                 {
  570.                         while(s4==0);                //松手检测
  571.                         biaozhi1=0;
  572.                         keysun=1;
  573.                         if(SetPlace==-1)
  574.                         {
  575.                                 LCD12864_WriteCmd(0x01);
  576.                                 naojie();
  577.                                 SetPlace=7;
  578.                                 LCD12864_SetWindow(0, 6);
  579.                                 if(naobiao==0)
  580.                                 {
  581.                                         LCD12864_WriteData(xiqi[18]);
  582.                                         LCD12864_WriteData(xiqi[19]);          //显示关
  583.                                 }
  584.                                 else
  585.                                 {
  586.                                         LCD12864_WriteData(xiqi[16]);
  587.                                         LCD12864_WriteData(xiqi[17]);         //显示开
  588.                                 }
  589.                                 LCD12864_SetWindow(1, 2);        
  590.                                 LCD12864_WriteData(0x30+(naoshi/16));                                //时
  591.                                 LCD12864_WriteData(0x30+(naoshi&0x0f));
  592.                                 LCD12864_SetWindow(1, 4);
  593.                                 LCD12864_WriteData(0x30+(naofen/16));                                //分
  594.                                 LCD12864_WriteData(0x30+(naofen&0x0f));
  595.                                 LCD12864_SetWindow(3, 0);
  596.                                  if(linsheng==1)
  597.                                 {
  598.                                         for(zishu=0;zishu<16;zishu++)
  599.                                         {
  600.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  601.                                         }
  602.                                 }                        
  603.                                 if(linsheng==2)
  604.                                         for(zishu=16;zishu<32;zishu++)
  605.                                         {
  606.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  607.                                         }                        
  608.                                 if(linsheng==3)
  609.                                         for(zishu=32;zishu<48;zishu++)
  610.                                         {
  611.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  612.                                         }                        
  613.                                 if(linsheng==4)
  614.                                         for(zishu=48;zishu<64;zishu++)
  615.                                         {
  616.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  617.                                         }
  618.                                 if(linsheng==5)
  619.                                         for(zishu=64;zishu<80;zishu++)
  620.                                         {
  621.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  622.                                         }
  623.                         }
  624.                         SetPlace++;
  625.                         LCD12864_WriteCmd(0x0f);  //显示开,开光标
  626.                         if(SetPlace>=12)
  627.                         {
  628.                                 LCD12864_WriteCmd(0x0c);  //显示开,关光标        
  629.                                 SetPlace=-1;keysun=2;
  630.                                 biaozhi1=1;
  631.                                 LCD12864_WriteCmd(0x01);
  632.                                 zhujiemian();
  633.                         }
  634.                         naoxianguangbiao();
  635.                         naoxian();
  636.                 }
  637.         }
  638.         if(biaozhi1==0)
  639.         {
  640.                 if(s2==0)                //检测按键K2是否按下
  641.                 {
  642.                         Delay1ms(10);        //消除抖动
  643.                         if(s2==0)
  644.                         {
  645.                                 while(s2==0);         //松手检测
  646.                                 if(SetPlace<=6)
  647.                                 {
  648.                                         TIME[SetPlace]++;
  649.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  650.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  651.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  652.                                                 TIME[SetPlace]=0;
  653.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23
  654.                                                 TIME[SetPlace]=0;
  655.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  656.                                                 TIME[SetPlace]=1;        
  657.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  658.                                                 TIME[SetPlace]=1;
  659.                                         if((TIME[SetPlace]>=0x8)&&(SetPlace==5))                //周只能到7
  660.                                                 TIME[SetPlace]=1;
  661.                                 }
  662.                                 else
  663.                                 {
  664.                                         if(SetPlace==8)
  665.                                         {
  666.                                                 naobiao=~naobiao;
  667.                                                 if(naobiao==0)
  668.                                                 {
  669.                                                         LCD12864_WriteData(xiqi[18]);
  670.                                                         LCD12864_WriteData(xiqi[19]);
  671.                                                 }
  672.                                                 else
  673.                                                 {
  674.                                                         LCD12864_WriteData(xiqi[16]);
  675.                                                         LCD12864_WriteData(xiqi[17]);
  676.                                                 }
  677.                                         }
  678.                                         if(SetPlace==9)
  679.                                         {
  680.                                                 naoshi++;
  681.                                                 if((naoshi&0x0f)>9)                                         //换成BCD码。
  682.                                                         naoshi=naoshi+6;
  683.                                                 if(naoshi>=0x24)
  684.                                                         naoshi=0;
  685.                                         }
  686.                                         if(SetPlace==10)
  687.                                         {
  688.                                                 naofen++;
  689.                                                 if((naofen&0x0f)>9)                                         //换成BCD码。
  690.                                                         naofen=naofen+6;
  691.                                                 if(naofen>=0x60)
  692.                                                 naofen=0;
  693.                                         }
  694.                                         if(SetPlace==11)
  695.                                         {
  696.                                                 linsheng++;
  697.                                                 if(linsheng==6)
  698.                                                 linsheng=1;
  699.                                         }

  700.                                 }                        
  701.                         }
  702.                         shixian();
  703.                         naoxian();
  704.                 }
  705.                 if(s3==0)                //检测按键K3是否按下
  706.                 {
  707.                         Delay1ms(10);        //消除抖动
  708.                         if(s3==0)
  709.                         {
  710.                                 while(s3==0);     //松手检测
  711.                                 if(SetPlace<=6)
  712.                                 {
  713.                                         TIME[SetPlace]--;
  714.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  715.                                                 TIME[SetPlace]=TIME[SetPlace]-6;
  716.                                         if((TIME[SetPlace]<=-1)&&(SetPlace<2))                //分秒只能到59
  717.                                                 TIME[SetPlace]=0x59;
  718.                                         if((TIME[SetPlace]<=-1)&&(SetPlace==2))                //小时只能到23
  719.                                                 TIME[SetPlace]=0x23;
  720.                                         if((TIME[SetPlace]<=0)&&(SetPlace==3))                //日只能到31
  721.                                                 TIME[SetPlace]=0x31;        
  722.                                         if((TIME[SetPlace]<=0)&&(SetPlace==4))                //月只能到12
  723.                                                 TIME[SetPlace]=0x12;
  724.                                         if((TIME[SetPlace]<=0)&&(SetPlace==5))                //周只能到7
  725.                                                 TIME[SetPlace]=7;
  726.                                 }
  727.                                 else
  728.                                 {
  729.                                         if(SetPlace==8)
  730.                                         {
  731.                                                 naobiao=~naobiao;
  732.                                                 if(naobiao==0)
  733.                                                 {
  734.                                                         LCD12864_WriteData(xiqi[18]);
  735.                                                         LCD12864_WriteData(xiqi[19]);          //显示开关
  736.                                                 }
  737.                                                 else
  738.                                                 {
  739.                                                         LCD12864_WriteData(xiqi[16]);
  740.                                                         LCD12864_WriteData(xiqi[17]);         //显示开关
  741.                                                 }
  742.                                         }
  743.                                         if(SetPlace==9)                         //闹钟时
  744.                                         {
  745.                                                 naoshi--;
  746.                                                 if((naoshi&0x0f)>9)                                         //换成BCD码。
  747.                                                         naoshi=naoshi-6;
  748.                                                 if(naoshi<0)
  749.                                                 naoshi=0x23;
  750.                                         }
  751.                                         if(SetPlace==10)         //闹钟分
  752.                                         {
  753.                                                 naofen--;
  754.                                                 if((naofen&0x0f)>9)                                         //换成BCD码。
  755.                                                         naofen=naofen-6;
  756.                                                 if(naofen<0)
  757.                                                 naofen=0x59;
  758.                                         }
  759.                                         if(SetPlace==11)        //铃声选择
  760.                                         {
  761.                                                 linsheng--;
  762.                                                 if(linsheng==0)
  763.                                                 linsheng=5;
  764.                                         }
  765.                                 }                        
  766.                         }
  767.                         naoxian();
  768.                         shixian();
  769.                 }
  770.         }                                
  771. }
  772. void jiemian()
  773. {        
  774.         unsigned char i=0;
  775.         LCD12864_SetWindow(0, 0);
  776.         while(CharCode[i]!='\0')
  777.         {                        
  778.                 LCD12864_WriteData(CharCode[i]);
  779.                 i++;
  780.                 if(i==16)  //第一行满写第二行
  781.                         LCD12864_SetWindow(1,0);
  782.                 if(i==32)  //第二行满写第三行
  783.                         LCD12864_SetWindow(2,0);
  784.                 if(i==48)  //第三行满写第四行
  785.                         LCD12864_SetWindow(3,0);                        
  786.         }
  787. }
  788. void Delay1ms(unsigned int y)
  789. {
  790.         unsigned int x;
  791.         for(y;y>0;y--)
  792.                 for(x=110;x>0;x--);
  793. }
  794. /*******************************************************************************
  795. * 函数名         : Ds18b20Init
  796. * 函数功能                   : 初始化
  797. * 输入           : 无
  798. * 输出                  : 初始化成功返回1,失败返回0
  799. *******************************************************************************/
  800. unsigned char Ds18b20Init()
  801. {
  802.         unsigned int i;
  803.         DSPORT=0;                         //将总线拉低480us~960us
  804.         i=70;        
  805.         while(i--);//延时642us
  806.         DSPORT=1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
  807.         i=0;
  808.         while(DSPORT)        //等待DS18B20拉低总线
  809.         {
  810.                 i++;
  811.                 if(i>5000)//等待>5MS
  812.                         return 0;//初始化失败        
  813.         }
  814.         return 1;//初始化成功
  815. }
  816. /*******************************************************************************
  817. * 函数名         : Ds18b20WriteByte
  818. * 函数功能                   : 向18B20写入一个字节
  819. * 输入           : com
  820. * 输出                  : 无
  821. *******************************************************************************/
  822. void Ds18b20WriteByte(unsigned char dat)
  823. {
  824.         unsigned int i,j;
  825.         for(j=0;j<8;j++)
  826.         {
  827.                 DSPORT=0;                        //每写入一位数据之前先把总线拉低1us
  828.                 i++;
  829.                 DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
  830.                 i=6;
  831.                 while(i--); //延时68us,持续时间最少60us
  832.                 DSPORT=1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  833.                 dat>>=1;
  834.         }
  835. }
  836. /*******************************************************************************
  837. * 函数名         : Ds18b20ReadByte
  838. * 函数功能                   : 读取一个字节
  839. * 输入           : com
  840. * 输出                  : 无
  841. *******************************************************************************/
  842. unsigned char Ds18b20ReadByte()
  843. {
  844.         unsigned char byte,bi;
  845.         unsigned int i,j;        
  846.         for(j=8;j>0;j--)
  847.         {
  848.                 DSPORT=0;//先将总线拉低1us
  849.                 i++;
  850.                 DSPORT=1;//然后释放总线
  851.                 i++;
  852.                 i++;//延时6us等待数据稳定
  853.                 bi=DSPORT;         //读取数据,从最低位开始读取
  854.                 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
  855.                 byte=(byte>>1)|(bi<<7);                                                  
  856.                 i=4;                //读取完之后等待48us再接着读取下一个数
  857.                 while(i--);
  858.         }                                
  859.         return byte;
  860. }
  861. /*******************************************************************************
  862. * 函数名         : Ds18b20ChangTemp
  863. * 函数功能                   : 让18b20开始转换温度
  864. * 输入           : com
  865. * 输出                  : 无
  866. *******************************************************************************/
  867. void  Ds18b20ChangTemp()
  868. {
  869.         Ds18b20Init();
  870.         Delay1ms(1);
  871.         Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  872.         Ds18b20WriteByte(0x44);            //温度转换命令
  873.         Delay1ms(100);        //等待转换成功,而如果你是一直刷着的话,就不用这个延时了  
  874. }
  875. /*******************************************************************************
  876. * 函数名         : Ds18b20ReadTempCom
  877. * 函数功能                   : 发送读取温度命令
  878. * 输入           : com
  879. * 输出                  : 无
  880. *******************************************************************************/
  881. void  Ds18b20ReadTempCom()
  882. {        
  883.         Ds18b20Init();
  884.         Delay1ms(1);
  885.         Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
  886.         Ds18b20WriteByte(0xbe);         //发送读取温度命令
  887. }
  888. /*******************************************************************************
  889. * 函数名         : Ds18b20ReadTemp
  890. * 函数功能                   : 读取温度
  891. * 输入           : com
  892. * 输出                  : 无
  893. *******************************************************************************/

  894. int Ds18b20ReadTemp()
  895. {
  896.         int temp=0;
  897.         unsigned char tmh,tml;
  898.         Ds18b20ChangTemp();                                 //先写入转换命令
  899.         Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
  900.         tml=Ds18b20ReadByte();                //读取温度值共16位,先读低字节
  901.         tmh=Ds18b20ReadByte();                //再读高字节
  902.         temp=tmh;
  903.         temp<<=8;
  904.         temp|=tml;
  905.         return temp;
  906. }
  907. void LcdDisplay(int temp)          //lcd显示
  908. {
  909.    
  910.           unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
  911.         float tp;  
  912.         if(temp< 0)                                //当温度值为负数
  913.           {
  914.                 LCD12864_SetWindow(3, 5);
  915.             LCD12864_WriteData(0x2d);                  //显示负
  916.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  917.                 temp=temp-1;
  918.                 temp=~temp;
  919.                 tp=temp;
  920.                 temp=tp*0.0625*100+0.5;        
  921.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  922.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  923.                 //算由?.5,还是在小数点后面。
  924.                 datas[2] = temp % 1000 / 100;
  925.                 datas[3] = temp % 100 / 10;               
  926.                          //写地址 80表示初始地址
  927.                 LCD12864_WriteData(0x30+datas[2]); //个位
  928.                 LCD12864_WriteData(0x2e);                 //显示 ‘.’
  929.                 LCD12864_WriteData(0x30+datas[3]); //显示小数点

  930.           }
  931.          else
  932.           {                        
  933.                 LCD12864_SetWindow(3, 5);
  934.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  935.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  936.                 temp=tp*0.0625*100+0.5;        
  937.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  938.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  939.                 //算加上0.5,还是在小数点后面。
  940.         
  941.                 datas[1] = temp % 10000 / 1000;
  942.                 datas[2] = temp % 1000 / 100;
  943.                 datas[3] = temp % 100 / 10;               
  944.                          //写地址
  945.                 LCD12864_WriteData(0x30+datas[1]); //十位
  946.                 LCD12864_WriteData(0x30+datas[2]); //个位
  947.                 LCD12864_WriteData(0x2e);                 //显示 ‘.’
  948.                 LCD12864_WriteData(0x30+datas[3]); //显示小数点
  949.         }
  950. }
  951. void Ds1302Write(uchar addr, uchar dat)
  952. {
  953.         uchar n;
  954.         RST = 0;
  955.         _nop_();

  956.         SCLK = 0;//先将SCLK置低电平。
  957.         _nop_();
  958.         RST = 1; //然后将RST(CE)置高电平。
  959.         _nop_();

  960.         for (n=0; n<8; n++)//开始传送八位地址命令
  961.         {
  962.                 DSIO = addr & 0x01;//数据从低位开始传送
  963.                 addr >>= 1;
  964.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  965.                 _nop_();
  966.                 SCLK = 0;
  967.                 _nop_();
  968.         }
  969.         for (n=0; n<8; n++)//写入8位数据
  970.         {
  971.                 DSIO = dat & 0x01;
  972.                 dat >>= 1;
  973.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  974.                 _nop_();
  975.                 SCLK = 0;
  976.                 _nop_();        
  977.         }        
  978.                  
  979.         RST = 0;//传送数据结束
  980.         _nop_();
  981. }
  982. uchar Ds1302Read(uchar addr)
  983. {
  984.         uchar n,dat,dat1;
  985.         RST = 0;
  986.         _nop_();

  987.         SCLK = 0;//先将SCLK置低电平。
  988.         _nop_();
  989.         RST = 1;//然后将RST(CE)置高电平。
  990.         _nop_();

  991.         for(n=0; n<8; n++)//开始传送八位地址命令
  992.         {
  993.                 DSIO = addr & 0x01;//数据从低位开始传送
  994.                 addr >>= 1;
  995.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  996.                 _nop_();
  997.                 SCLK = 0;//DS1302下降沿时,放置数据
  998.                 _nop_();
  999.         }
  1000.         _nop_();
  1001.         for(n=0; n<8; n++)//读取8位数据
  1002.         {
  1003.                 dat1 = DSIO;//从最低位开始接收
  1004.                 dat = (dat>>1) | (dat1<<7);
  1005.                 SCLK = 1;
  1006.                 _nop_();
  1007.                 SCLK = 0;//DS1302下降沿时,放置数据
  1008.                 _nop_();
  1009.         }

  1010.         RST = 0;
  1011.         _nop_();        //以下为DS1302复位的稳定时间,必须的。
  1012.         SCLK = 1;
  1013.         _nop_();
  1014.         DSIO = 0;
  1015.         _nop_();
  1016.         DSIO = 1;
  1017.         _nop_();
  1018.         return dat;        
  1019. }

  1020. void Ds1302Init()
  1021. {
  1022.         uchar n;
  1023.         Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
  1024.         for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
  1025.         {
  1026.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  1027.         }
  1028.         Ds1302Write(0x8E,0x80);                 //打开写保护功能
  1029. }
  1030. void Ds1302ReadTime()
  1031. {
  1032.         uchar n;
  1033.         for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
  1034.         {
  1035.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  1036.         }               
  1037. }
  1038. void TimerConfiguration()
  1039. {
  1040.     TMOD = 0x11; //选择工作方式1
  1041.     TH0 = 0x3C;         //设置初始值,定时50MS
  1042.     TL0 = 0xB0;
  1043.     EA = 1;                         //打开总中断
  1044.     ET0 = 1;                 //打开定时器0中断
  1045.     TR0 = 1;                 //启动定时器0
  1046.         zz=0;//关蜂鸣器     
  1047.          TH1=0xd8;TL1=0xef;   
  1048.         ET1=1;
  1049. }
  1050. void Timer0() interrupt 1
  1051. {
  1052.         TH0 = 0x3C;         //设置初始值
  1053.     TL0 = 0xB0;
  1054.         timeji++;
  1055.         if(timeji==200)
  1056.         {
  1057.                 timeji=0;
  1058.                 biaozhi=0;        
  1059.         }
  1060. }

  1061. void display()
  1062. {
  1063.         LCD12864_SetWindow(1, 0);
  1064.         LCD12864_WriteData(0x30+TIME[6]/16);                        //        年
  1065.         LCD12864_WriteData(0x30+(TIME[6]&0x0f));
  1066.         LCD12864_SetWindow(1, 2);
  1067.         LCD12864_WriteData(0x30+TIME[4]/16);                        //月
  1068.         LCD12864_WriteData(0x30+(TIME[4]&0x0f));
  1069.         LCD12864_SetWindow(1, 4);
  1070.         LCD12864_WriteData(0x30+TIME[3]/16);                        //日
  1071.         LCD12864_WriteData(0x30+(TIME[3]&0x0f));
  1072.         LCD12864_SetWindow(1, 7);
  1073.         LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]);        //星期
  1074.         LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);

  1075.         LCD12864_SetWindow(2, 2);
  1076.         LCD12864_WriteData(0x30+TIME[2]/16);                                //时
  1077.         LCD12864_WriteData(0x30+(TIME[2]&0x0f));                                 
  1078.         LCD12864_SetWindow(2, 4);
  1079.         LCD12864_WriteData(0x30+TIME[1]/16);                                //分
  1080.         LCD12864_WriteData(0x30+(TIME[1]&0x0f));        
  1081.         LCD12864_SetWindow(2, 6);
  1082.         LCD12864_WriteData(0x30+TIME[0]/16);                                //秒
  1083.         LCD12864_WriteData(0x30+(TIME[0]&0x0f));
  1084. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:99130 发表于 2017-5-6 16:27 | 只看该作者
温度显示为什么是00.0呢?是程序的问题还是硬件的问题。。。
回复

使用道具 举报

板凳
ID:99130 发表于 2017-5-6 18:47 | 只看该作者
温度死活就显示-0.0,年显示200?,而且年也无法调节
回复

使用道具 举报

地板
ID:159515 发表于 2017-5-7 13:13 | 只看该作者
提取了数字字体很漂亮
回复

使用道具 举报

5#
ID:202296 发表于 2017-6-4 17:59 | 只看该作者
赞一个
回复

使用道具 举报

6#
ID:169956 发表于 2017-6-13 00:03 | 只看该作者
很好,谢谢
回复

使用道具 举报

7#
ID:143558 发表于 2018-2-2 14:59 | 只看该作者
越快乐越堕落 发表于 2017-5-6 18:47
温度死活就显示-0.0,年显示200?,而且年也无法调节

温度的话要看你DS18b20的接法,你的是仿真还是实物
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表