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

QQ登錄

只需一步,快速開始

搜索
查看: 8694|回復(fù): 14
收起左側(cè)

數(shù)字溫度計(jì)加萬年歷(程序,仿真,原理圖,PCB,元件清單)

  [復(fù)制鏈接]
ID:103893 發(fā)表于 2016-1-20 14:38 | 顯示全部樓層 |閱讀模式
學(xué)校的實(shí)訓(xùn)做的~~程序不是自己寫的,但是可以用。
1.png
電路原理圖pcb:
0.png
0.png
所有資料下載: 數(shù)字溫濕度計(jì).rar (8.73 MB, 下載次數(shù): 231)


1、該程序經(jīng)過電腦軟件Proteus7.4sp3仿真通過。

2、該程序通過實(shí)驗(yàn)板仿真芯片通過。

3、該程序燒寫STC89C51RC,單獨(dú)在實(shí)驗(yàn)板上運(yùn)行通過(晶振11.0592MHZ)

4、該程序用洞洞板制作實(shí)物運(yùn)行成功!并在DS1302時(shí)鐘芯片第8腳上加上了3.6V的

   鎳氫充電電池,斷電后時(shí)間、日歷都正常走。

5、程序中使用的頭文件DS18B20_3.H,來源于網(wǎng)上,寫的非常好,十進(jìn)制溫度最后返回到函數(shù)

   ReadTemperature()中,使用時(shí)主函數(shù)用flag=ReadTemperature();/
   
    就可將18b2頭文件運(yùn)行返回的函數(shù)結(jié)果送到變量FLAG中,用于顯示。
-----------------------------------------------------------------------------
主要器件:

STC89C51+DS1302時(shí)鐘芯片+DS18b20溫度芯片。

-----------------------------------------------------------------------------

主要功能:

1、萬年歷,

2、時(shí)間,

3、星期,

4、溫度顯示,

(以上四項(xiàng)內(nèi)容同時(shí)顯示)

5、三鍵調(diào)時(shí)(設(shè)置鍵,上調(diào)鍵,下調(diào)鍵),

6、斷電走時(shí),

7、上電蜂鳴器提示(長(zhǎng)鳴);

8、按鍵蜂鳴器提示(第一次按動(dòng)設(shè)置鍵長(zhǎng)鳴一響;后面按動(dòng)設(shè)置鍵或上調(diào)鍵、下調(diào)鍵都是短鳴一響)。


元件清單:
物理與機(jī)電工程學(xué)院器材   領(lǐng)用    單
領(lǐng)(借)用人    吳育培、林伏忠    單位
(班級(jí))    12級(jí)電本(2)    用途    電子系統(tǒng)設(shè)計(jì)
領(lǐng)用
時(shí)間    2015.4.20    使用時(shí)間        人數(shù)    2人
序號(hào)    器材名稱及型號(hào)規(guī)格    單位    領(lǐng)用數(shù)量    備注
1    AT89C51單片機(jī)    個(gè)    2   
2    DS1302    個(gè)    2   
3                  輕觸開關(guān)    個(gè)    10   
4    103藍(lán)白電位器    個(gè)    4   
5    5.1K電阻    個(gè)    10   
6          2K 220 電阻    個(gè)    4   
7    瓷片電容(22pf,10pf)    個(gè)    6   
8    電解電容 10uf    個(gè)    4   
9    IC座(8P)    個(gè)    2   
10    IC座(40P)    個(gè)    2   
11    單排針    排    5   
12    覆銅板    塊    1   
13    DS18B20    個(gè)    2   
14    32.768KHZ晶振    個(gè)    2   
15    11.0592MHZ晶振    個(gè)    2   
               
領(lǐng)用人簽字:    畢業(yè)論文指導(dǎo)教師簽字:
實(shí)驗(yàn)室意見:    分管副院長(zhǎng)意見:
分管院領(lǐng)導(dǎo)意見:   

倉管員簽字:                             時(shí)間:



部分程序預(yù)覽:

DS18B20_3.H:

  1. sbit DQ = P2^0;                // 定義DQ引腳為P2.7

  2. /*******************************  延時(shí)函數(shù) ********************************
  3. *  功能:在11.059MHz的晶振條件下調(diào)用本函數(shù)需要24μs ,然后每次計(jì)數(shù)需16μ
  4. **************************************************************************/
  5. void DS18_delay(int useconds) {
  6. int s;
  7. for (s=0; s<useconds;s++);
  8. }


  9. /*******************************  復(fù)位函數(shù) *******************************
  10. * 功能:完成單總線的復(fù)位操作。
  11. * 復(fù)位時(shí)間為480μs,因此延時(shí)時(shí)間為(480-24)/16 = 28.5,取29μs
  12. * 經(jīng)過70μs之后檢測(cè)存在脈沖,因此延時(shí)時(shí)間為(70-24)/16 = 2.875,取3μs
  13. **************************************************************************/
  14. unsigned char ow_reset(void) {
  15. unsigned char presence;
  16. DQ = 0;                          // 將 DQ 線拉低
  17. DS18_delay(29);                         // 保持 480μs
  18. DQ = 1;                         // DQ返回高電平
  19. DS18_delay(3);                         // 等待存在脈沖
  20. presence = DQ;                 // 獲得存在信號(hào)
  21. DS18_delay(25);                         // 等待時(shí)間隙結(jié)束
  22. return(presence);         // 返回存在信號(hào),0 = 器件存在, 1 = 無器件
  23. }


  24. /****************************** 位寫入函數(shù) *******************************
  25. * 功能:向單總線寫入1位值:bitval
  26. *************************************************************************/
  27. void write_bit(char bitval) {
  28. DQ = 0;                                 // 將DQ 拉低開始寫時(shí)間隙
  29. if(bitval==1) DQ =1;         // 如果寫1,DQ 返回高電平
  30. DS18_delay(5);                                 // 在時(shí)間隙內(nèi)保持電平值,
  31. DQ = 1;         // DS18_delay函數(shù)每次循環(huán)延時(shí)16μs,因此DS18_delay(5) = 104μs
  32. }        


  33. /**************************** 字節(jié)寫入函數(shù) *******************************
  34. * 功能:向單總線寫入一個(gè)字節(jié)值:val
  35. *************************************************************************/
  36. void ds18write_byte(char val) {
  37. unsigned char i;
  38. unsigned char temp;
  39. for (i=0; i<8; i++) {        // 寫入字節(jié), 每次寫入一位
  40. temp = val>>i;                 
  41. temp &= 0x01;                 
  42. write_bit(temp);
  43. }
  44. DS18_delay(5);
  45. }

  46. /**************************** 位讀取函數(shù) ********************************
  47. * 功能:從單總線上讀取一位信號(hào),所需延時(shí)時(shí)間為15μs,因此無法調(diào)用前面定義
  48. * 的DS18_delay()函數(shù),而采用一個(gè)for()循環(huán)來實(shí)現(xiàn)延時(shí)。
  49. * ***********************************************************************/
  50. unsigned char read_bit(void) {
  51. unsigned char i;
  52. DQ = 0;                      //將DQ 拉低開始讀時(shí)間隙
  53. DQ = 1;                         // then return high
  54. for (i=0; i<3; i++);         // 延時(shí)15μs
  55. return(DQ);                         // 返回 DQ 線上的電平值
  56. }

  57. /**************************** 字節(jié)讀取函數(shù) *******************************
  58. * 功能:從單總線讀取一個(gè)字節(jié)的值
  59. *************************************************************************/
  60. unsigned char DSread_byte(void) {
  61. unsigned char i;
  62. unsigned char value = 0;
  63. for (i=0;i<8;i++) {                                  // 讀取字節(jié),每次讀取一個(gè)字節(jié)
  64. if(read_bit()) value|=0x01<<i;         // 然后將其左移
  65. DS18_delay(6);                                         
  66. }
  67. return(value);
  68. }


  69. /******************************* 讀取溫度函數(shù) *****************************
  70. * 功能:如果單總線節(jié)點(diǎn)上只有一個(gè)器件則可以直接掉用本函數(shù)。如果節(jié)點(diǎn)上有多個(gè)器
  71. *      件,為了避免數(shù)據(jù)沖突,應(yīng)使用Match ROM函數(shù)來選中特定器件。
  72. * 注: 本函數(shù)是根據(jù)DS1820的溫度數(shù)據(jù)格式編寫的,若用于DS18B20,必須根據(jù)
  73. *      DS18B20的溫度數(shù)據(jù)格式作適當(dāng)修改。
  74. **************************************************************************/unsigned
  75. int ReadTemperature(void) {
  76. unsigned char get[10];
  77. unsigned char temp_lsb,temp_msb;
  78. unsigned int t;
  79. unsigned char k;
  80. ow_reset();
  81. ds18write_byte(0xCC);                                         // 跳過 ROM
  82. ds18write_byte(0x44);                                         // 啟動(dòng)溫度轉(zhuǎn)換
  83. DS18_delay(5);
  84. ow_reset();
  85. ds18write_byte(0xCC);                                         // 跳過 ROM
  86. ds18write_byte(0xBE);                                         // 讀暫存器
  87. for (k=0;k<2;k++){get[k]=DSread_byte();}

  88. temp_msb = get[1]; // Sign byte + lsbit
  89. temp_lsb = get[0]; // Temp data plus lsb

  90. t=temp_msb*256+temp_lsb;
  91. t=t&0x0ff0;
  92. if(t<0xff&&t>0xf0)
  93. t=(-1)*t;
  94. return t>>4;
  95. //temp_f = (((int)temp_c)* 9)/5 + 32;
  96.                  // 輸出華氏溫度值

  97. }

復(fù)制代碼



  1. /*******************DS18B20測(cè)溫程序******************************************

  2. 運(yùn)行結(jié)果會(huì)在函數(shù)ReadTemperature()保存兩位十進(jìn)制數(shù)字的溫度值

  3. 調(diào)用時(shí),要這樣:

  4.          uchar temp;  設(shè)定一個(gè)無符號(hào)變量temp
  5.          temp=ReadTemperature();  變量temp=函數(shù)值=二位數(shù)的溫度值

  6.          然后可以用temp參與顯示工作。
  7. ***************************************************************************/

  8. /*********************************端口定義**********************************/
  9. sbit DQ=P3^3;                                   //數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳

  10. /*********************************定義全局變量******************************/
  11. unsigned char tempL=0;                         //臨時(shí)變量低位(無符號(hào)字符變量)
  12. unsigned char tempH=0;                        //臨時(shí)變量高位
  13. unsigned char tempa;                           //溫度值(整型變量)

  14. /****************************************************************************
  15. 函數(shù)功能:延時(shí)子程序
  16. 入口參數(shù):k
  17. 出口參數(shù):
  18. ****************************************************************************/
  19. void DS18_delay(int useconds)
  20. {
  21. int s;
  22. for (s=0; s<useconds;s++);
  23. }

  24. /***************************************************************************
  25. 函數(shù)功能:DS18B20初始化子程序
  26. 入口參數(shù):
  27. 出口參數(shù):
  28. ****************************************************************************/
  29. unsigned char Init_DS18B20(void)
  30. {
  31.         unsigned char x=0;

  32.           DQ=0;                             //發(fā)送復(fù)位脈沖
  33.           DS18_delay(29);                         //延時(shí)(>480ms)
  34.           DQ=1;                                  //拉高數(shù)據(jù)線
  35.           DS18_delay(3);                       //等待(15~60ms) 等待存在脈沖
  36.     x=DQ;  //獲得存在信號(hào)(用于判斷是否有器件)
  37.     DS18_delay(25);  // 等待時(shí)間隙結(jié)束
  38.     return(x);  //返回存在信號(hào),0 = 器件存在, 1 = 無器件
  39. }

  40. /****************************************************************************
  41. 函數(shù)功能:向DS18B20讀一字節(jié)數(shù)據(jù)
  42. 入口參數(shù):
  43. 出口參數(shù):dat
  44. ****************************************************************************/
  45. ReadOneChar(void)                          
  46. {
  47.         unsigned char i=0;                 
  48.         unsigned char dat=0;
  49.     for (i=8;i>0;i--)                  
  50.                 {
  51.                         DQ=1;
  52.                     DS18_delay(1);
  53.                     DQ=0;      
  54.                     dat>>=1;//復(fù)合賦值運(yùn)算,等效dat=dat>>1(dat=dat右移一位后的值)
  55.                            DQ=1;
  56.                     if(DQ)
  57.                            dat|=0x80;
  58.                     DS18_delay(4);
  59.                 }
  60.     return(dat);
  61. }

  62. /****************************************************************************
  63. 函數(shù)功能:向DS18B20寫一字節(jié)數(shù)據(jù)
  64. 入口參數(shù):dat
  65. 出口參數(shù):
  66. ****************************************************************************/
  67. WriteOneChar(unsigned char dat)//有參函數(shù),功能是"寫",而寫的內(nèi)容就是括號(hào)內(nèi)的參數(shù)
  68. {
  69.         unsigned char i=0;                 
  70.         for(i=8;i>0;i--)         
  71.         {
  72.                 DQ=0;            
  73.                 DQ=dat&0x01;
  74.                 DS18_delay(5);
  75.                 DQ=1;
  76.                 dat>>=1;//復(fù)合賦值運(yùn)算,等效dat=dat>>1(dat=dat右移一位后的值)
  77.         }
  78.         DS18_delay(4);
  79. }

  80. /****************************************************************************
  81. 函數(shù)功能:向DS18B20讀溫度值
  82. 入口參數(shù):
  83. 出口參數(shù):temperature
  84. ****************************************************************************/
  85. unsigned int ReadTemperature(void)
  86. {  
  87.         Init_DS18B20();          //初始化,調(diào)用初始化函數(shù)
  88.         WriteOneChar(0xcc);                  //跳過讀序列號(hào)的操作,調(diào)用寫函數(shù),寫0xcc指令碼(跳過讀序列號(hào))
  89.         WriteOneChar(0x44);                 //啟動(dòng)溫度轉(zhuǎn)換,調(diào)用寫函數(shù),寫0x44指令碼(啟動(dòng)溫度轉(zhuǎn)換)
  90.         DS18_delay(125);                                   //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)
  91.         Init_DS18B20();                         //初始化,調(diào)用初始化函數(shù)
  92.         WriteOneChar(0xcc);                  //跳過讀序列號(hào)的操作,調(diào)用寫函數(shù),寫0xcc指令碼(跳過讀序列號(hào)?
  93.         WriteOneChar(0xbe);                 //調(diào)用寫函數(shù),寫0xbe指令碼,讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
  94.         tempL=ReadOneChar();                 //讀出溫度的低位LSB
  95.         tempH=ReadOneChar();                 //讀出溫度的高位MSB  


  96.          //tempH&=0x0f;//高字節(jié)和0f"與"運(yùn)算,留住后4位有用值,賦給tempH
  97.    tempa=((tempH*256)+tempL)*0.0625;  //溫度轉(zhuǎn)換,把高低位做相應(yīng)的運(yùn)算轉(zhuǎn)化為實(shí)際溫度,使用DS18B20溫度傳感器手冊(cè)規(guī)定的公式,結(jié)果是十進(jìn)制數(shù)值

  98.         DS18_delay(20);

  99.         return(tempa);//運(yùn)算結(jié)果返回到函數(shù) :ReadTemperature()調(diào)用時(shí)需要采用i=ReadTemperature(),然后再對(duì)i(任意uchar型變量)進(jìn)行操作
  100. }









復(fù)制代碼


評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:115465 發(fā)表于 2016-4-20 16:04 | 顯示全部樓層
請(qǐng)問這個(gè)溫度計(jì)加萬年歷的程序有嗎,就這些?
回復(fù)

使用道具 舉報(bào)

ID:117249 發(fā)表于 2016-4-28 10:43 | 顯示全部樓層
程序是完整的么?
回復(fù)

使用道具 舉報(bào)

ID:74303 發(fā)表于 2016-4-28 11:20 | 顯示全部樓層
電路不完整,程序不完整。都沒說到的蜂鳴器功能
回復(fù)

使用道具 舉報(bào)

ID:117251 發(fā)表于 2016-4-28 12:09 | 顯示全部樓層
請(qǐng)問有程序流程圖么
回復(fù)

使用道具 舉報(bào)

ID:117306 發(fā)表于 2016-4-28 15:02 | 顯示全部樓層
看起來不錯(cuò)。是完整的嘛
回復(fù)

使用道具 舉報(bào)

ID:109246 發(fā)表于 2016-5-25 17:05 | 顯示全部樓層
不完整
回復(fù)

使用道具 舉報(bào)

ID:119445 發(fā)表于 2016-5-25 20:10 | 顯示全部樓層
謝謝分享,參考一下!
回復(fù)

使用道具 舉報(bào)

ID:119445 發(fā)表于 2016-5-25 20:15 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:114695 發(fā)表于 2016-5-26 21:31 | 顯示全部樓層
謝謝分享,參考一下!
回復(fù)

使用道具 舉報(bào)

ID:116662 發(fā)表于 2016-8-6 09:26 來自觸屏版 | 顯示全部樓層
是完整的資料嗎,先觀察一下
回復(fù)

使用道具 舉報(bào)

ID:148320 發(fā)表于 2016-11-16 18:54 | 顯示全部樓層
eeeeee 發(fā)表于 2016-4-28 10:43
**** 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽 ****

不完整
回復(fù)

使用道具 舉報(bào)

ID:185064 發(fā)表于 2017-3-31 14:27 | 顯示全部樓層
有鬧鐘  就好了
回復(fù)

使用道具 舉報(bào)

ID:185172 發(fā)表于 2017-3-31 19:09 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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