欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7118|回復: 5
收起左側

論文:單片機測試DS18B20溫度并通過兩個按鍵設置溫度上下限 LCD12864顯示

[復制鏈接]
ID:322775 發表于 2018-5-5 14:32 | 顯示全部樓層 |閱讀模式
0.png

所有資料51hei提供下載:
ff.rar (7.29 MB, 下載次數: 95)


內容摘要
摘要本系統利用單片機AT89C52采用程序設計方法來測試溫度,還可以通過兩個按鍵設置溫度報警上限,當測試溫度超過設定的溫度上限時,蜂鳴器器就會報警且綠燈關閉,紅燈點亮;當溫度低于上限時蜂鳴器關閉且紅燈關閉,綠燈點亮。并通過液晶屏LCD12864顯示其測試溫度以及設置的上限溫度。

1系統設計2
1.1設計任務              2
1.2基本功能              2
1.3擴展功能              2
2系統方案論證2
2.1主控模塊              2
2.2顯示模塊              3
3 DS18B20的理論分析與計算3
4電路與程序設計6
4.1系統總體框圖              6
4.2總體電路              6
4.3程序的設計            
總結
附錄1
附錄2









1系統設計
1.1設計任務
設計一數字溫度測量系統,能自動實現實際溫度的測量與顯示。
1.2基本功能
(1)測溫范圍-30℃~+120℃。
(2)測量誤差在±0.5℃之內。
(3)能正常顯示測量的溫度。
(4)能正常顯示測量的溫度的變換曲線圖。
1.3擴展功能
(1)增加溫控功能,并可修改設置溫控的上下限。
(2)增加溫控報警功能。
2系統方案論證
    本系統主要由主控模塊、顯示模塊、按鍵模塊、蜂鳴器模塊、LED模塊、傳感器模塊組成,下面分別論證這幾個模塊的選擇。
2.1主控模塊
方案:AT89C52單片機是一種高性能8位單片微型計算機。內核本身具有豐富的指令集,足夠實現本次作品的全部基本功能和部分拓展功能,相比Atmega16我們對AT89C52更為熟悉,且芯片價格較低,性價比高。

2.2顯示模塊

方案:采用LCD12864顯示。LCD12864屏幕顯示細膩直觀,且可以顯示中文,但是相對昂貴。



3 DS18B20的理論分析與計算
DS18B20 通過編程,可以實現最高 12 位的溫度存儲值,在寄存器中,以補碼的格式存儲,如圖1所示。
圖1 DS18B20 溫度數據格式
寄存器一共 2 個字節,LSB 是低字節,MSB 是高字節,其中 MSb 是字節的高位,LSb 是字節的低位。大家可以看出來,二進制數字,每一位代表的溫度的含義,都表示出來了。其中 S表示的是符號位,低 11 位都是 2 的冪,用來表示最終的溫度。DS18B20 的溫度測量范圍是從-55 度到+125 度,而溫度數據的表現形式,有正負溫度,寄存器中每個數字如同卡尺的刻度一樣分布,如圖 2所示。
圖2 DS18B20 溫度值
二進制數字最低位變化 1,代表溫度變化 0.0625 度的映射關系。當 0 度的時候,那就是0x0000,當溫度 125 度的時候,對應十六進制是 0x07D0,當溫度是零下 55 度的時候,對應的數字是 0xFC90。反過來說,當數字是 0x0001 的時候,那溫度就是 0.0625 度了。
DS18B20 簡單介紹:
DALLAS 最新單線數字溫度傳感器DS18B20是一種新型的“一線器件”,其體積更小、更適用于多種場合、且適用電壓更寬、更經濟。DALLAS 半導體公司的數字化溫度傳感器DS18B20是世界上第一片支持“一線總線”接口的溫度傳感器。溫度測量范圍為-55~+125 攝氏度,可編程為9位~12 位轉換精度,測溫分辨率可達0.0625攝氏度,分辨率設定參數以及用戶設定的報警溫度存儲在EEPROM 中,掉電后依然保存。被測溫度用符號擴展的16位數字量方式串行輸出;其工作電源既可以在遠端引入,也可以采用寄生電源方式產生;多個DS18B20可以并聯到3 根或2 根線上,CPU只需一根端口線就能與諸多DS18B20 通信,占用微處理器的端口較少,可節省大量的引線和邏輯電路。因此用它來組成一個測溫系統,具有線路簡單,在一根通信線,可以掛很多這樣的數字溫度計,十分方便。
DS18B20 的性能特點如下:
●獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20的雙向通訊
●DS18B20支持多點組網功能,多個DS18B20可以并聯在唯一的三線上,實現組網多點測溫
●DS18B20在使用中不需要任何外圍元件,全部傳感元件及轉換電路集成在形如一只三極管的集成電路內
●適應電壓范圍更寬,電壓范圍:3.0~5.5V,在寄生電源方式下可由數據線供電
●測溫范圍-55℃~+125℃,精度為±0.5℃
●零待機功耗
●測量結果直接輸出數字信號,以“一線總線”穿行傳送給CPU,同時可傳送CRC校驗位,具有極強的抗干擾糾錯能力
●負電壓特性,電源極性接反時,溫度計不會因發熱而燒毀,但不能正常工作
以上特點使DS18B20非常適用與多點、遠距離溫度檢測系統。
DS18B20內部結構主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器。DS18B20的管腳排列、各種封裝形式如圖 4.2 所示,DQ 為數據輸入/輸出引腳。開漏單總線接口引腳。當被用著在寄生電源下,也可以向器件提供電源;GND為地信號;VDD為可選擇的VDD引腳。當工作于寄生電源時,此引腳必須接地。
           

外部封裝形式                        傳感器電路圖

4電路與程序設計4.1系統總體框圖
系統總體框圖如圖3所示
圖3 系統總體框圖
4.2總體電路
總體電路圖見附錄2。
4.3程序的設計4.3.1程序功能描述
(1)能夠測試-30℃~+120℃的溫度。
(2)按下S1能增加溫度報警上限,按下S2能減少溫度報警上限。
4.3.2試驗程序
實驗程序見附錄1。













總結
本系統以單片機STC89C52芯片為核心部件,利用LCD12864、獨立按鍵、DS18B20并配合C語言算法實現了簡易數字溫度計設計,完成此次設計題目中的全部基本功能和部分拓展功能。在系統設計過程中,力求硬件線路簡單,充分發揮軟件編程方便靈活的特點,來滿足系統設計要求。
在本次設計的過程中,遇到了許多突發事件和困難,設計制作曾一度止步不前,但通過仔細分析和調整后解決了一個又一個的問題。在整個過程中我們深刻的體會到團隊精神的重要性,并提高了自己解決問題的能力。在課程設計的整個過程中,我遇到了許多意想不到的困難,如自己設計電路,進行軟件編譯等等。不僅如此,很多從未遇見過的問題和現象困擾著我,比如在調試的過程中,時常出現問題,但每次經過仔細反復查找,終于可以將這些問題針對性的找到并進行合理的改正,確保其正常實現對應的功能,在自己處理難題的過程中,真正學到了很多新的知識。


單片機源程序如下:
  1. #include<reg51.h>
  2. #include<stdlib.h>
  3. #include<stdio.h>//頭文件
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit DQ=P2^2;//ds18b20與單片機連接口
  7. sbit PWM=P1^0;//控制信號的輸出
  8. sbit TTT=P2^3;//控制信號的輸出
  9. unsigned char code str[]={"my name is lhh "};
  10. unsigned char code str_[]={"MADE IN NUPT... "};
  11. unsigned char code str1[]={"temper:"};
  12. unsigned char code str2[]={"         "};
  13. unsigned char code nul[]={"        "};
  14. unsigned char code str3[]={"target:  "};
  15. unsigned char  str4[6];//設定溫度的存儲
  16. uchar data disdata[5];

  17. uchar a[4]={0,0,0,0},j,i,k,num=0;      //定義變量
  18. sbit js=P3^2;   //紅外接收端
  19. uchar zhb_flag=0;//保證一次解碼,只執行一次代碼

  20. uint tvalue;//溫度值
  21. uchar tflag;//溫度正負標志
  22. uint  count=0;//按鍵次數初始化為0
  23. uint  number=4;//暫時規定輸入的溫度為xx.x的形式
  24. uchar j,key;
  25. uint time_flag=0;
  26. bit enterflag=0;     // 確認鍵按下與否標志
  27. uint new_t;    //轉化后的十進制實時溫度
  28. uint target=0;  //轉化后的十進制的目標溫度---有鍵盤輸入

  29. //------------定義接口-------------//
  30. sbit RS=P3^5 ;
  31. sbit RW=P3^6;
  32. sbit E=P3^4;
  33. sbit PSB= P3^7;   //H=并口; L="串口";
  34. #define Lcd_Bus P0
  35. // P0 接 LCM
  36. #define uchar unsigned char
  37. #define FIRST_ADDR 0
  38. //定義字符/漢字顯示起始位置
  39. /*------------------檢查忙位-----------------------------*/
  40. void chk_busy()
  41. {
  42.     RS=0 ;
  43.     RW=1 ;
  44.     E=1 ;
  45.     Lcd_Bus=0xff ;
  46.     while((Lcd_Bus&0x80)==0x80);
  47.     E=0 ;
  48. }
  49. /*------------------延時子程序-----------------------------*/
  50. void lcd_delay(unsigned int t)
  51. {
  52.     unsigned int i,j ;
  53.     for(i=0;i<t;i++)
  54.     for(j=0;j<10;j++);
  55. }

  56. /*------------------寫命令到LCD------------------------------*/
  57. void write_com(unsigned char cmdcode)
  58. {
  59.     chk_busy();
  60.     RS=0 ;
  61.     RW=0 ;
  62.     E=1 ;
  63.     Lcd_Bus=cmdcode ;
  64.     lcd_delay(5);
  65.     //------------------在數據寫入的時候加入適當的延時
  66.     E=0 ;
  67.     lcd_delay(5);
  68. }

  69. /*-------------------寫數據到LCD----------------------------*/
  70. void write_data(unsigned char Dispdata)
  71. {
  72.     chk_busy();
  73.     RS=1 ;
  74.     RW=0 ;
  75.     E=1 ;
  76.     Lcd_Bus=Dispdata ;
  77.     lcd_delay(5);
  78.     //------------------在數據寫入的時候加入適當的延時
  79.     E=0 ;
  80.     lcd_delay(5);
  81. }
  82. /*------------------初始化LCD屏--------------------------*/
  83. void lcdreset()
  84. {
  85.     PSB = 1;
  86.     lcd_delay(2000);
  87.     write_com(0x30);
  88.     lcd_delay(10);
  89.     //選擇基本指令集
  90.     write_com(0x30);
  91.     //選擇8bit數據流
  92.     lcd_delay(5);
  93.     write_com(0x0c);
  94.     //開顯示(無游標、不反白)
  95.     lcd_delay(10);
  96.     write_com(0x01);
  97.     //清除顯示,并且設定地址指針為00H
  98.     lcd_delay(500);
  99.     write_com(0x06);
  100.     //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位
  101.     lcd_delay(0);
  102. }
  103. /*------------------顯示字符串--------------------------*/
  104. void hzkdis(unsigned char code*s)
  105. {
  106.     while(*s>0)
  107.     {
  108.         write_data(*s);
  109.         s++;
  110.         lcd_delay(50);
  111.     }
  112. }
  113. /*------------------首屏顯示--------------------------*/
  114. void ceshi()
  115. {
  116.     write_com(0x01);
  117.     //清除顯示,并且設定地址指針為00H
  118.     lcd_delay(5);

  119.     write_com(0x80);
  120.     //第一行(如果是地址是:80H,即LCD的第一行的第一個位置顯示)
  121.     hzkdis("通信1503");

  122.     write_com(0x90);
  123.     //第二行(如果是地址是:90H,即LCD的第二行的第一個位置顯示)
  124.     hzkdis(str);

  125.     write_com(0x88);
  126.     //第三行(如果是地址是:88H,即LCD的第二行的第一個位置顯示)
  127.     hzkdis("李浩浩常凡");

  128.     write_com(0x98);
  129.     //第四行(如果是地址是:98H,即LCD的第二行的第一個位置顯示)
  130.     hzkdis("1513024090");
  131. }
  132. //------------------清整個GDRAM空間----------------------------
  133. void clrgdram()
  134. {
  135.     unsigned char x,y ;
  136.     for(y=0;y<64;y++)
  137.     for(x=0;x<16;x++)
  138.     {
  139.         write_com(0x34);
  140.         write_com(y+0x80);
  141.         //行地址
  142.         write_com(x+0x80);
  143.         //列地址
  144.         write_com(0x30);
  145.         write_data(0x00);
  146.         write_data(0x00);
  147.     }
  148. }
  149. //------------------------------------------------------------
  150. void clrscreen()
  151. {
  152.     write_com(0x01);
  153.     lcd_delay(10);
  154. }
  155. unsigned char ReadByte(void)
  156. {
  157.     unsigned char byReturnValue ;
  158.     chk_busy();
  159.     Lcd_Bus=0xff ;
  160.     RS=1 ;
  161.     RW=1 ;
  162.     E=0 ;
  163.     E=1 ;
  164.     byReturnValue=Lcd_Bus ;
  165.     E=0 ;

  166.     return byReturnValue ;
  167. }

  168. /*增加畫點子程序
  169. 函數功能:在坐標為(x,y)點畫一個點
  170. 參數意義
  171. X:12864屏幕的橫坐標,范圍是0到128(從左到右)
  172. Y:12864的縱坐標,范圍是0到64(從上到下)
  173. Color:為1的時候表示為黑點
  174. */
  175. void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
  176. {
  177.     unsigned char Row,Tier,Tier_bit ;
  178.     unsigned char ReadOldH,ReadOldL ;
  179.     write_com(0x34);
  180.     write_com(0x36);
  181.     Tier=X>>4 ;
  182.     Tier_bit=X&0x0f ;
  183.     if(Y<32)
  184.     {
  185.         Row=Y ;
  186.     }
  187.     else
  188.     {
  189.         Row=Y-32 ;
  190.         Tier+=8 ;
  191.     }
  192.     write_com(Row+0x80);
  193.     write_com(Tier+0x80);
  194.     ReadByte();
  195.     ReadOldH=ReadByte();
  196.     ReadOldL=ReadByte();
  197.     write_com(Row+0x80);
  198.     write_com(Tier+0x80);
  199.     if(Tier_bit<8)
  200.     {
  201.         switch(Color)
  202.         {
  203.             case 0 :
  204.             ReadOldH&=(~(0x01<<(7-Tier_bit)));
  205.             break ;
  206.             case 1 :
  207.             ReadOldH|=(0x01<<(7-Tier_bit));
  208.             break ;
  209.             case 2 :
  210.             ReadOldH^=(0x01<<(7-Tier_bit));
  211.             break ;
  212.             default :
  213.             break ;
  214.         }
  215.         write_data(ReadOldH);
  216.         write_data(ReadOldL);
  217.     }
  218.     else
  219.     {
  220.         switch(Color)
  221.         {
  222.             case 0 :
  223.             ReadOldL&=(~(0x01<<(15-Tier_bit)));
  224.             break ;
  225.             case 1 :
  226.             ReadOldL|=(0x01<<(15-Tier_bit));
  227.             break ;
  228.             case 2 :
  229.             ReadOldL^=(0x01<<(15-Tier_bit));
  230.             break ;
  231.             default :
  232.             break ;
  233.         }
  234.         write_data(ReadOldH);
  235.         write_data(ReadOldL);
  236.     }
  237.     write_com(0x30);
  238. }


  239. void send_to_pc(void)
  240. {
  241. uint pc_flag=0;
  242. SCON=0x50;//串口方式1,允許接收
  243. TMOD=0x20;//定時器1,定時方式2
  244. TCON=0x40;//設定時器1開始計數
  245. TH1=0xE8;//11.0592MHz, 1200波特率
  246. TL1=0xE8;
  247. TI=1;
  248. TR1=1;
  249. while(1)
  250. {
  251.   if(pc_flag==1)
  252.   {
  253.    TMOD=1;
  254.   }
  255.   else
  256.   {
  257.    printf("Now temperture is ");
  258.    printf(disdata);
  259.    printf("*0.1 C");
  260.    pc_flag++;
  261.   }
  262. }
  263. }




  264. void delay_18B20(unsigned int i)//延時1微秒
  265. {
  266. while(i--);
  267. }



  268. void ds1820rst()/*ds1820復位*/
  269. {
  270. unsigned char x=0;
  271. DQ = 1;          //DQ復位
  272. delay_18B20(4); //延時
  273. DQ = 0;          //DQ拉低
  274. delay_18B20(100); //精確延時大于480us
  275. DQ = 1;          //拉高
  276. delay_18B20(40);
  277. }



  278. uchar ds1820rd()/*讀數據*/
  279. {
  280. unsigned char i=0;
  281. unsigned char dat = 0;
  282. for (i=8;i>0;i--)
  283.     {   
  284.   DQ = 0; //給脈沖信號
  285.         dat>>=1;
  286.         DQ = 1; //給脈沖信號
  287.         if(DQ)
  288.    dat|=0x80;
  289.         delay_18B20(10);
  290. }
  291. return(dat);
  292. }





  293. void ds1820wr(uchar wdata)/*寫數據*/
  294. {
  295.     unsigned char i=0;
  296.     for (i=8; i>0; i--)
  297. {
  298.   DQ = 0;
  299.         DQ = wdata&0x01;
  300.         delay_18B20(10);
  301.         DQ = 1;
  302.         wdata>>=1;
  303. }
  304. }


  305. read_temp1()/*讀取溫度值并轉換*/
  306. {
  307.     ds1820rst();   
  308.     ds1820wr(0xcc);//*跳過讀序列號*/
  309.     ds1820wr(0x44);//*啟動溫度轉換*/
  310.     ds1820rst();   
  311. }
  312. read_temp2()
  313. {
  314.     uchar a,b;
  315.     ds1820wr(0xcc);//*跳過讀序列號*/
  316.     ds1820wr(0xbe);//*讀取溫度*/
  317.     a=ds1820rd();
  318.     b=ds1820rd();
  319.     tvalue=b;
  320.     tvalue<<=8;
  321.     tvalue=tvalue|a;
  322.     if(tvalue<0x0fff)
  323.   tflag=0;
  324.     else
  325. {
  326.   tvalue=~tvalue+1;
  327.         tflag=1;
  328. }
  329.     tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
  330.     return(tvalue);
  331. }



  332. /*******************************************************************/


  333. void ds1820disp1()//溫度值顯示
  334. {  
  335.     uchar flagdat;
  336.                            if (tvalue>4200)
  337.   {
  338.           TTT=0;
  339.   }
  340.     disdata[0]=tvalue/1000+0x30;//百位數
  341.     disdata[1]=tvalue%1000/100+0x30;//十位數
  342.     disdata[2]=tvalue%100/10+0x30;//個位數
  343.     disdata[3]=tvalue%10+0x30;//小數位
  344.     if(tflag==0)
  345.   flagdat=0x20;//正溫度不顯示符號
  346.     else
  347.   flagdat=0x2d;//負溫度顯示負號:-
  348.     if(disdata[0]==0x30)
  349.     {
  350.   disdata[0]=0x20;//如果百位為0,不顯示
  351.   if(disdata[1]==0x30)
  352.   {
  353.    disdata[1]=0x20;//如果百位為0,十位為0也不顯示
  354.   }
  355. }
  356. }



  357. void ds1820disp2()
  358. {
  359.     lcd_delay(5);
  360. write_com(0x80);
  361.     hzkdis("溫度為:");
  362. lcd_delay(50);
  363. write_com(0x84);
  364. write_data(disdata[1]);
  365. write_com(0x85);
  366. write_data(disdata[2]);
  367. write_com(0x86);
  368. write_data(0x2e);
  369. write_com(0x87);
  370. write_data(disdata[3]);
  371.   if(disdata[1]>=3+0x30||(disdata[2]>=8+0x30))
  372. { write_com(0x98);
  373.     hzkdis("sos");        }
  374.         else
  375.          { write_com(0x98);
  376.     hzkdis("   ");        }




  377. lcd_delay(50);
  378.     new_t=disdata[1]*10+disdata[2];
  379. }

  380. void delay(uint us)   //delay time
  381. {
  382. while(us--);
  383. }
  384. void HW_key(void)
  385. {
  386. if(zhb_flag==1)
  387. {
  388.   if((a[2]+a[3])==0xff)  //判斷接收到數據是否正確
  389.   {
  390.    switch(a[2])   //將接受到的數據與所建表一一對應
  391.    {
  392.             case 0x00:
  393.     {
  394.      num=0;
  395.      if (count<number)
  396.      {
  397.       str4[count]='0';
  398.       count++;
  399.      }break;//數字鍵0
  400.     }
  401.             case 0x01:
  402.     {
  403.      num=1;
  404.      if (count<number)
  405.      {
  406.       str4[count]='1';
  407.       count++;
  408.      }break;//數字鍵1
  409.     }
  410.             case 0x02:
  411.     {
  412.      num=2;
  413.      if (count<number)
  414.      {
  415.       str4[count]='2';
  416.       count++;
  417.      }break;//數字鍵2
  418.     }
  419.             case 0x03:
  420.     {
  421.      num=3;
  422.      if (count<number)
  423.      {
  424.       str4[count]='3';
  425.       count++;
  426.      }break;//數字鍵3
  427.     }
  428.             case 0x04:
  429.     {
  430.      num=4;
  431.      if (count<number)
  432.      {
  433.       str4[count]='4';
  434.       count++;
  435.      }break;//數字鍵4
  436.     }
  437.             case 0x05:
  438.     {
  439.      num=5;
  440.      if (count<number)
  441.      {
  442.       str4[count]='5';
  443.       count++;
  444.      }break;//數字鍵5
  445.     }
  446.    case 0x06:
  447.     {
  448.      num=6;
  449.      if (count<number)
  450.      {
  451.       str4[count]='6';
  452.       count++;
  453.      }break;//數字鍵6
  454.     }
  455.    case 0x07:
  456.     {
  457.      num=7;
  458.      if (count<number)
  459.      {
  460.       str4[count]='7';
  461.       count++;
  462.      }break;//數字鍵7
  463.     }
  464.    case 0x08:
  465.     {
  466.      num=8;
  467.      if (count<number)
  468.      {
  469.       str4[count]='8';
  470.       count++;
  471.      }break;//數字鍵8
  472.     }
  473.    case 0x09:
  474.     {
  475.      num=9;
  476.      if (count<number)
  477.      {
  478.       str4[count]='9';
  479.       count++;
  480.      }break;//數字鍵9
  481.     }
  482.    case 0x0a:
  483.     {
  484.      num=10;
  485.      if (count<number)
  486.      {
  487.       str4[count]='.';
  488.       count++;
  489.      }break;//鍵"--/-"
  490.     }
  491.    case 0x0b:
  492.     {
  493.      num=11;
  494.      break;//鍵LG
  495.     }
  496.    case 0x0f:
  497.     {
  498.      num=12; break;//AV鍵
  499.     }
  500.    case 0x10:
  501.     {
  502.      num=13;
  503.      send_to_pc();break;//靜音鍵
  504.     }
  505.    case 0x15:
  506.     {
  507.      num=14;
  508.      break;//開關鍵
  509.     }
  510.    case 0x16:
  511.     {
  512.      num=15;break;//選臺鍵
  513.     }
  514.    case 0x17:
  515.     {
  516.     /* num=16; count = 0;//清零
  517.      for (j=0;j<number;j++)
  518.      {
  519.       str4[j]=' ';
  520.      }
  521.                     str4[j]='/0';
  522.      PWM=1;
  523.      time_flag=0;
  524.      wr_com(0xcd);
  525.      display(nul);
  526.      target=0;
  527.      enterflag = 0;break;//睡眠鍵*/
  528.     }

  529.             default:break;
  530.   }
  531.   if (enterflag==1)     // 如果按下確認鍵
  532.   {
  533.    //   enterflag = 0;      // 標志位置回0
  534. /*   wr_com(0xcd);
  535.             wr_dat(0xdf);
  536.             wr_dat(0x43);
  537.    target=str4[0]*10+str4[1];
  538.    time_flag=1;*/
  539.   }
  540. /*  wr_com(0xc0);
  541.         display(str3);
  542.         wr_com(0xc8);
  543.         display(str4);
  544.   zhb_flag=0;*/
  545.   }
  546.        }
  547. }
  548. /*void pitu_wave(void)
  549. {
  550.    uchar i,a;
  551.    uchar colour=1;
  552.    for(i=0;i<128;i+=2)
  553.     {
  554.          a=64-new_t;
  555.          DrawPoint(i,a,colour);
  556.     }
  557. }*/
  558. /********************主程序***********************************/
  559. void main()
  560. {
  561.     uchar wave=0;
  562.   uchar i=0,a;
  563.    uchar colour=1;
  564.     RW=0 ;
  565.     lcdreset();
  566.     ceshi();
  567.     clrgdram();
  568.     delay(2000);
  569.     clrscreen();
  570.     EA=1;    //初始化
  571. ET0=1;  //開計數中斷0
  572. EX0=1;   //開外部中斷0
  573. TMOD=1; //設置工作方式
  574. IT0=1;    //啟動計時器
  575.     while(1)
  576.     {  
  577.   read_temp1();//讀取溫度
  578.   read_temp2();//讀取溫度

  579.   ds1820disp1();//顯示
  580.   ds1820disp2();//顯示
  581.   wave++;

  582.   if(wave>=10)
  583.   {
  584.         a=64-new_t;
  585.      if(i>=128)
  586.      {
  587.        i=0;
  588.     clrgdram();
  589.              delay(2000);
  590.              clrscreen();
  591.      }
  592.            DrawPoint(i++,a,colour);
  593.      wave=0;
  594.   }
  595.   HW_key();
  596.     }
  597. }
  598. void zhb(void) interrupt 0 // 外部中斷子程序(譯碼過程)
  599. {
  600.     zhb_flag=1;
  601. TH0=0;   //計數器清零
  602. TL0=0;
  603. TR0=1;   //啟動計數器
  604. while(!js)   //等待低電平結束
  605. {
  606.   delay(5);
  607.   if(TH0>45)  //判斷低電平是否高于11.52ms如果高于則跳出等待和中斷
  608.    return;
  609. }
  610. TR0=0;
  611. if(TH0<30)  //判斷低電平是否低于7.68ms如果低于跳出中斷
  612.   return;
  613. TH0=0;
  614. TR0=1;
  615. while(js)   //等待高電平結束
  616. {
  617.   delay(5);
  618.   if(TH0>28)  //判斷高電平是否高于7.168ms如果高于則跳出等待和中斷
  619.    return;
  620. }

  621. //至此為起始信號檢測

  622. TR0=0;
  623. TH0=0;
  624. for(i=0;i<4;i++)  //一次鎖存紅外接收的四個十六進制數到a[4]中
  625. {
  626.   for(j=0;j<8;j++)
  627.   {
  628. …………
  629. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


回復

使用道具 舉報

ID:171111 發表于 2018-5-13 19:03 | 顯示全部樓層
這個很不錯 謝謝分享
回復

使用道具 舉報

ID:496717 發表于 2019-4-5 09:38 | 顯示全部樓層
為啥看不到附件
回復

使用道具 舉報

ID:461985 發表于 2019-4-14 22:38 | 顯示全部樓層
謝謝分享   
回復

使用道具 舉報

ID:512294 發表于 2019-4-15 08:32 來自觸屏版 | 顯示全部樓層
不錯,有pcb圖嗎
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
ID:569657 發表于 2019-9-10 19:27 | 顯示全部樓層
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表