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

QQ登錄

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

帖子
查看: 4630|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

12864萬(wàn)年歷制作資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:143558 發(fā)表于 2016-10-20 11:08 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
自己做的12864萬(wàn)年歷,分享給51黑電子論壇的朋友們

所有資料打包下載:
萬(wàn)年歷12864資料.zip (901.26 KB, 下載次數(shù): 82)

DS1302用現(xiàn)成模塊,可以自己網(wǎng)上找電路圖焊
DS18B20引腳看清楚不要搞錯(cuò)
12864為并行方式,PSB跟RST接高電平就行,對(duì)比度通過(guò)103電位器調(diào)背光,可用單片機(jī)控制或
用熱釋電模塊控制。
鬧鐘數(shù)據(jù)掉電會(huì)丟失,可以自己改改程序,用24C02或其它芯片

電路圖沒(méi)有,因?yàn)楹?jiǎn)單,接線時(shí)看程序接或自己接好后改程序的定義



所需元器件:
1.單片機(jī)最小系統(tǒng),包括上電復(fù)位電路跟時(shí)鐘電路
2.12864液晶屏1個(gè)
3.DS18B20數(shù)字溫度芯片(三腳)
4.DS1302模塊
5.蜂鳴器(有源跟無(wú)源各一),三極管8050(3個(gè)),103電位器用在12864調(diào)對(duì)比度
6.按鍵4個(gè),熱釋電模塊一個(gè),開(kāi)關(guān)一個(gè),導(dǎo)線若干,烙鐵,焊錫,
7.其他自己發(fā)揮擴(kuò)展

部分源碼預(yù)覽:
  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驅(qū)動(dòng)

  9. sbit s1=P1^0;                          //調(diào)節(jié)時(shí)間
  10. sbit s2=P1^1;                           //加
  11. sbit s3=P1^2;                                 //減
  12. sbit s4=P1^3;                                  //調(diào)節(jié)鬧鐘
  13. sbit Beep=P1^7;                        //揚(yáng)聲器   用三極管8050驅(qū)動(dòng)
  14. //---定義全局函數(shù)---//
  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;                          //參數(shù)定義
  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時(shí)鐘初始化2013年1月1日星期二12點(diǎn)00分00秒。---//
  28. //---存儲(chǔ)順序是秒分時(shí)日月周年,存儲(chǔ)格式是用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[]="    調(diào)整時(shí)間      年  月  日周  時(shí)間  點(diǎn)  分  秒   ";
  38. uchar code CharCode1[]="20  -  -    周                                              . ℃";
  39. uchar code xiqi[]="  一二三四五六日開(kāi)關(guān)";
  40. uchar code naozhong[]="  設(shè)置鬧鐘            點(diǎn)  分        鈴聲選擇      ";
  41. uchar code naozhonglinshen[]="1.天空之城      2.月亮代表我的心3.你是風(fēng)兒我是沙4.莫斯科郊外的晚5.經(jīng)典鈴聲  嘀嘀";
  42. uchar code tab[11][64]={
  43. {/*--  調(diào)入了一幅圖像:D:\設(shè)計(jì)\打印\數(shù)字取模圖片\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. {/*--  調(diào)入了一幅圖像:D:\設(shè)計(jì)\打印\數(shù)字取模圖片\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. {/*--  調(diào)入了一幅圖像:D:\設(shè)計(jì)\打印\數(shù)字取模圖片\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. {/*--  調(diào)入了一幅圖像:D:\設(shè)計(jì)\打印\數(shù)字取模圖片\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. {/*--  調(diào)入了一幅圖像:D:\設(shè)計(jì)\打印\數(shù)字取模圖片\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. {/*--  調(diào)入了一幅圖像:D:\設(shè)計(jì)\打印\數(shù)字取模圖片\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. {/*--  調(diào)入了一幅圖像:D:\設(shè)計(jì)\打印\數(shù)字取模圖片\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. {/*--  調(diào)入了一幅圖像:D:\設(shè)計(jì)\打印\數(shù)字取模圖片\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. {/*--  調(diào)入了一幅圖像:這是您新建的圖像  --*/
  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. {                                                                //你是風(fēng)兒我是沙
  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);   //控制頻率延時(shí)   
  190. void delayms(unsigned char a);  //豪秒延時(shí)子程序   
  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)  //第一行滿寫(xiě)第三行
  249.                 {
  250.                         LCD12864_SetWindow(1,0);
  251.                 }
  252.                 if(i==32)  //第三行滿寫(xiě)第四行
  253.                 {
  254.                         LCD12864_SetWindow(2,0);
  255.                 }
  256.                 if(i==48)  //第三行滿寫(xiě)第四行
  257.                 {
  258.                         LCD12864_SetWindow(3,0);
  259.                 }                        
  260.         }
  261.         zhudisplay();
  262.         LCD12864_WriteCmd(0x36);          //開(kāi)啟拓展指令集
  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);         //恢復(fù)基本指令集
  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]);                //時(shí)
  297.                 didi();         //整點(diǎn)報(bào)時(shí)
  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]);                //時(shí)
  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   //采用定時(shí)中斷1 控制節(jié)拍   
  321. {  TH1=0xd8;   
  322.    TL1=0xef;   
  323.    n--;   
  324. }   
  325. void delay (unsigned char m)   //控制頻率延時(shí)   
  326. {   
  327. unsigned i=3*m;   
  328. while(--i);   
  329. }      
  330. void delayms(unsigned char a)  //豪秒延時(shí)子程序   
  331. {   
  332.   while(--a);                  //采用while(--a) 不要采用while(a--); 各位可編譯一下看看匯編結(jié)果就知道了!   
  333. }      
  334. void linshengbofang()   
  335. { unsigned char p=0,m;   //m為頻率常數(shù)變量   
  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;}     //如果碰到結(jié)束符,延時(shí)1秒,回到開(kāi)始再來(lái)一遍   
  341.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延時(shí)100ms,繼續(xù)取下一音符   
  342.             else         {m=music_tab[linsheng-1][i++], n=music_tab[linsheng-1][i++];}  //取頻率常數(shù) 和 節(jié)拍常數(shù)   
  343.              TR1=1;                                             //開(kāi)定時(shí)器1   
  344.            while(n!=0) Beep=~Beep,delay(m);                         //等待節(jié)拍完成, 通過(guò)P1口輸出音頻(可多聲道哦!)   
  345.        TR1=0;                                             //關(guān)定時(shí)器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)  //第一行滿寫(xiě)第三行
  357.                         LCD12864_SetWindow(1,0);
  358.                 if(i==32)  //第三行滿寫(xiě)第四行
  359.                         LCD12864_SetWindow(2,0);
  360.                 if(i==48)  //第三行滿寫(xiě)第四行
  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)           //鬧鐘設(shè)置
  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);          //開(kāi)啟拓展指令集
  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);         //恢復(fù)基本指令集
  406. }
  407. void sfmxiandi(uchar acc,uchar datb)
  408. {
  409.         uchar i,j=0;
  410.         LCD12864_WriteCmd(0x36);          //開(kāi)啟拓展指令集
  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);         //恢復(fù)基本指令集
  426. }
  427. void shixian()                           //調(diào)節(jié)時(shí)間顯示
  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));                                //時(shí)
  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)           //鬧鐘設(shè)置
  470.         {
  471.                  LCD12864_SetWindow(0, 6);
  472.         }
  473.         if(SetPlace==9)
  474.         {
  475.                 LCD12864_WriteData(0x30+(naoshi/16));                                //時(shí)
  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)                //檢測(cè)按鍵K1是否按下
  539.         {
  540.                 Delay1ms(10);        //消除抖動(dòng)
  541.                 if((s1==0)&&(keysun>=2))
  542.                 {
  543.                         while(s1==0);                //松手檢測(cè)
  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);  //顯示開(kāi),開(kāi)光標(biāo)
  554.                         if(SetPlace==6)
  555.                         {
  556.                                 LCD12864_WriteCmd(0x0c);  //顯示開(kāi),關(guān)光標(biāo)        
  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);                //松手檢測(cè)
  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]);          //顯示關(guān)
  583.                                 }
  584.                                 else
  585.                                 {
  586.                                         LCD12864_WriteData(xiqi[16]);
  587.                                         LCD12864_WriteData(xiqi[17]);         //顯示開(kāi)
  588.                                 }
  589.                                 LCD12864_SetWindow(1, 2);        
  590.                                 LCD12864_WriteData(0x30+(naoshi/16));                                //時(shí)
  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);  //顯示開(kāi),開(kāi)光標(biāo)
  626.                         if(SetPlace>=12)
  627.                         {
  628.                                 LCD12864_WriteCmd(0x0c);  //顯示開(kāi),關(guān)光標(biāo)        
  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)                //檢測(cè)按鍵K2是否按下
  641.                 {
  642.                         Delay1ms(10);        //消除抖動(dòng)
  643.                         if(s2==0)
  644.                         {
  645.                                 while(s2==0);         //松手檢測(cè)
  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))                //小時(shí)只能到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)                //檢測(cè)按鍵K3是否按下
  706.                 {
  707.                         Delay1ms(10);        //消除抖動(dòng)
  708.                         if(s3==0)
  709.                         {
  710.                                 while(s3==0);     //松手檢測(cè)
  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))                //小時(shí)只能到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]);          //顯示開(kāi)關(guān)
  736.                                                 }
  737.                                                 else
  738.                                                 {
  739.                                                         LCD12864_WriteData(xiqi[16]);
  740.                                                         LCD12864_WriteData(xiqi[17]);         //顯示開(kāi)關(guān)
  741.                                                 }
  742.                                         }
  743.                                         if(SetPlace==9)                         //鬧鐘時(shí)
  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)  //第一行滿寫(xiě)第二行
  781.                         LCD12864_SetWindow(1,0);
  782.                 if(i==32)  //第二行滿寫(xiě)第三行
  783.                         LCD12864_SetWindow(2,0);
  784.                 if(i==48)  //第三行滿寫(xiě)第四行
  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. * 函數(shù)名         : Ds18b20Init
  796. * 函數(shù)功能                   : 初始化
  797. * 輸入           : 無(wú)
  798. * 輸出                  : 初始化成功返回1,失敗返回0
  799. *******************************************************************************/
  800. unsigned char Ds18b20Init()
  801. {
  802.         unsigned int i;
  803.         DSPORT=0;                         //將總線拉低480us~960us
  804.         i=70;        
  805.         while(i--);//延時(shí)642us
  806.         DSPORT=1;                        //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在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. * 函數(shù)名         : Ds18b20WriteByte
  818. * 函數(shù)功能                   : 向18B20寫(xiě)入一個(gè)字節(jié)
  819. * 輸入           : com
  820. * 輸出                  : 無(wú)
  821. *******************************************************************************/
  822. void Ds18b20WriteByte(unsigned char dat)
  823. {
  824.         unsigned int i,j;
  825.         for(j=0;j<8;j++)
  826.         {
  827.                 DSPORT=0;                        //每寫(xiě)入一位數(shù)據(jù)之前先把總線拉低1us
  828.                 i++;
  829.                 DSPORT=dat&0x01; //然后寫(xiě)入一個(gè)數(shù)據(jù),從最低位開(kāi)始
  830.                 i=6;
  831.                 while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us
  832.                 DSPORT=1;        //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫(xiě)入第二個(gè)數(shù)值
  833.                 dat>>=1;
  834.         }
  835. }
  836. /*******************************************************************************
  837. * 函數(shù)名         : Ds18b20ReadByte
  838. * 函數(shù)功能                   : 讀取一個(gè)字節(jié)
  839. * 輸入           : com
  840. * 輸出                  : 無(wú)
  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++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定
  853.                 bi=DSPORT;         //讀取數(shù)據(jù),從最低位開(kāi)始讀取
  854.                 /*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/
  855.                 byte=(byte>>1)|(bi<<7);                                                  
  856.                 i=4;                //讀取完之后等待48us再接著讀取下一個(gè)數(shù)
  857.                 while(i--);
  858.         }                                
  859.         return byte;
  860. }
  861. /*******************************************************************************
  862. * 函數(shù)名         : Ds18b20ChangTemp
  863. * 函數(shù)功能                   : 讓18b20開(kāi)始轉(zhuǎn)換溫度
  864. * 輸入           : com
  865. * 輸出                  : 無(wú)
  866. *******************************************************************************/
  867. void  Ds18b20ChangTemp()
  868. {
  869.         Ds18b20Init();
  870.         Delay1ms(1);
  871.         Ds18b20WriteByte(0xcc);                //跳過(guò)ROM操作命令                 
  872.         Ds18b20WriteByte(0x44);            //溫度轉(zhuǎn)換命令
  873.         Delay1ms(100);        //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個(gè)延時(shí)了  
  874. }
  875. /*******************************************************************************
  876. * 函數(shù)名         : Ds18b20ReadTempCom
  877. * 函數(shù)功能                   : 發(fā)送讀取溫度命令
  878. * 輸入           : com
  879. * 輸出                  : 無(wú)
  880. *******************************************************************************/
  881. void  Ds18b20ReadTempCom()
  882. {        
  883.         Ds18b20Init();
  884.         Delay1ms(1);
  885.         Ds18b20WriteByte(0xcc);         //跳過(guò)ROM操作命令
  886.         Ds18b20WriteByte(0xbe);         //發(fā)送讀取溫度命令
  887. }
  888. /*******************************************************************************
  889. * 函數(shù)名         : Ds18b20ReadTemp
  890. * 函數(shù)功能                   : 讀取溫度
  891. * 輸入           : com
  892. * 輸出                  : 無(wú)
  893. *******************************************************************************/

  894. int Ds18b20ReadTemp()
  895. {
  896.         int temp=0;
  897.         unsigned char tmh,tml;
  898.         Ds18b20ChangTemp();                                 //先寫(xiě)入轉(zhuǎn)換命令
  899.         Ds18b20ReadTempCom();                        //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  900.         tml=Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節(jié)
  901.         tmh=Ds18b20ReadByte();                //再讀高字節(jié)
  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}; //定義數(shù)組
  911.         float tp;  
  912.         if(temp< 0)                                //當(dāng)溫度值為負(fù)數(shù)
  913.           {
  914.                 LCD12864_SetWindow(3, 5);
  915.             LCD12864_WriteData(0x2d);                  //顯示負(fù)
  916.                 //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
  917.                 temp=temp-1;
  918.                 temp=~temp;
  919.                 tp=temp;
  920.                 temp=tp*0.0625*100+0.5;        
  921.                 //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  922.                 //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  923.                 //算由?.5,還是在小數(shù)點(diǎn)后面。
  924.                 datas[2] = temp % 1000 / 100;
  925.                 datas[3] = temp % 100 / 10;               
  926.                          //寫(xiě)地址 80表示初始地址
  927.                 LCD12864_WriteData(0x30+datas[2]); //個(gè)位
  928.                 LCD12864_WriteData(0x2e);                 //顯示 ‘.’
  929.                 LCD12864_WriteData(0x30+datas[3]); //顯示小數(shù)點(diǎn)

  930.           }
  931.          else
  932.           {                        
  933.                 LCD12864_SetWindow(3, 5);
  934.                 tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
  935.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  936.                 temp=tp*0.0625*100+0.5;        
  937.                 //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  938.                 //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  939.                 //算加上0.5,還是在小數(shù)點(diǎn)后面。
  940.         
  941.                 datas[1] = temp % 10000 / 1000;
  942.                 datas[2] = temp % 1000 / 100;
  943.                 datas[3] = temp % 100 / 10;               
  944.                          //寫(xiě)地址
  945.                 LCD12864_WriteData(0x30+datas[1]); //十位
  946.                 LCD12864_WriteData(0x30+datas[2]); //個(gè)位
  947.                 LCD12864_WriteData(0x2e);                 //顯示 ‘.’
  948.                 LCD12864_WriteData(0x30+datas[3]); //顯示小數(shù)點(diǎn)
  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++)//開(kāi)始傳送八位地址命令
  961.         {
  962.                 DSIO = addr & 0x01;//數(shù)據(jù)從低位開(kāi)始傳送
  963.                 addr >>= 1;
  964.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  965.                 _nop_();
  966.                 SCLK = 0;
  967.                 _nop_();
  968.         }
  969.         for (n=0; n<8; n++)//寫(xiě)入8位數(shù)據(jù)
  970.         {
  971.                 DSIO = dat & 0x01;
  972.                 dat >>= 1;
  973.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  974.                 _nop_();
  975.                 SCLK = 0;
  976.                 _nop_();        
  977.         }        
  978.                  
  979.         RST = 0;//傳送數(shù)據(jù)結(jié)束
  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++)//開(kāi)始傳送八位地址命令
  992.         {
  993.                 DSIO = addr & 0x01;//數(shù)據(jù)從低位開(kāi)始傳送
  994.                 addr >>= 1;
  995.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  996.                 _nop_();
  997.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  998.                 _nop_();
  999.         }
  1000.         _nop_();
  1001.         for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
  1002.         {
  1003.                 dat1 = DSIO;//從最低位開(kāi)始接收
  1004.                 dat = (dat>>1) | (dat1<<7);
  1005.                 SCLK = 1;
  1006.                 _nop_();
  1007.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  1008.                 _nop_();
  1009.         }

  1010.         RST = 0;
  1011.         _nop_();        //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
  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);                 //禁止寫(xiě)保護(hù),就是關(guān)閉寫(xiě)保護(hù)功能
  1024.         for (n=0; n<7; n++)//寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  1025.         {
  1026.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  1027.         }
  1028.         Ds1302Write(0x8E,0x80);                 //打開(kāi)寫(xiě)保護(hù)功能
  1029. }
  1030. void Ds1302ReadTime()
  1031. {
  1032.         uchar n;
  1033.         for (n=0; n<7; n++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  1034.         {
  1035.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  1036.         }               
  1037. }
  1038. void TimerConfiguration()
  1039. {
  1040.     TMOD = 0x11; //選擇工作方式1
  1041.     TH0 = 0x3C;         //設(shè)置初始值,定時(shí)50MS
  1042.     TL0 = 0xB0;
  1043.     EA = 1;                         //打開(kāi)總中斷
  1044.     ET0 = 1;                 //打開(kāi)定時(shí)器0中斷
  1045.     TR0 = 1;                 //啟動(dòng)定時(shí)器0
  1046.         zz=0;//關(guān)蜂鳴器     
  1047.          TH1=0xd8;TL1=0xef;   
  1048.         ET1=1;
  1049. }
  1050. void Timer0() interrupt 1
  1051. {
  1052.         TH0 = 0x3C;         //設(shè)置初始值
  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);                                //時(shí)
  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. }
復(fù)制代碼


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:99130 發(fā)表于 2017-5-6 16:27 | 只看該作者
溫度顯示為什么是00.0呢?是程序的問(wèn)題還是硬件的問(wèn)題。。。
回復(fù)

使用道具 舉報(bào)

板凳
ID:99130 發(fā)表于 2017-5-6 18:47 | 只看該作者
溫度死活就顯示-0.0,年顯示200?,而且年也無(wú)法調(diào)節(jié)
回復(fù)

使用道具 舉報(bào)

地板
ID:159515 發(fā)表于 2017-5-7 13:13 | 只看該作者
提取了數(shù)字字體很漂亮
回復(fù)

使用道具 舉報(bào)

5#
ID:202296 發(fā)表于 2017-6-4 17:59 | 只看該作者
贊一個(gè)
回復(fù)

使用道具 舉報(bào)

6#
ID:169956 發(fā)表于 2017-6-13 00:03 | 只看該作者
很好,謝謝
回復(fù)

使用道具 舉報(bào)

7#
ID:143558 發(fā)表于 2018-2-2 14:59 | 只看該作者
越快樂(lè)越墮落 發(fā)表于 2017-5-6 18:47
溫度死活就顯示-0.0,年顯示200?,而且年也無(wú)法調(diào)節(jié)

溫度的話要看你DS18b20的接法,你的是仿真還是實(shí)物
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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