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

QQ登錄

只需一步,快速開始

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

初學(xué)8051:DS18B20,給初學(xué)者

[復(fù)制鏈接]
ID:51812 發(fā)表于 2015-11-30 21:38 | 顯示全部樓層 |閱讀模式
初學(xué)8051,把買的的學(xué)習(xí)板帶的程序給修改了、數(shù)碼管顯示,串口上位機(jī)顯示
STC89C52RC
壓縮包內(nèi)有 下位機(jī)C51程序,proteus仿真,C#寫的簡(jiǎn)單的串口。

在冰柜里測(cè)了低溫,在proteus里仿真了100°C以上的高溫,都能正確顯示。在腋窩里測(cè)了下體溫,用了好長(zhǎng)時(shí)間才穩(wěn)定在36.5°C 。

DS18B20.rar

239.42 KB, 下載次數(shù): 22, 下載積分: 黑幣 -5

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2015-12-2 00:38 | 顯示全部樓層
  1. 樓主的程序:
  2. /*****************************************************************
  3. *程序名稱:DS18B20 4位數(shù)碼管 上位機(jī)
  4. *程序功能:讀寫DS18B20,數(shù)碼管顯示溫度值,上位機(jī)顯示。
  5. *開發(fā)工具:谷雨電子 多功能51開發(fā)板
  6. *MCU型號(hào):STC89C52RC
  7. *時(shí)鐘頻率:11.0592MHZ
  8. *程序作者:LCG
  9. *版權(quán)說明:
  10. *****************************************************************/

  11. #include <reg52.h>

  12. #define uint unsigned int
  13. #define uchar unsigned char

  14. //定義DS18B20通信端口,修改硬件時(shí)要修改的部分
  15. sbit DQ = P2 ^ 0;
  16. //0-9的8位共陽數(shù)碼管位碼 其中負(fù)號(hào)0xbf
  17. uchar const LEDNumber[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf };
  18. //0-9的8位共陽數(shù)碼管位碼  帶小數(shù)點(diǎn)
  19. uchar const LEDNumberDot[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  20. //LCG
  21. uchar const LCGData[]={0xC7,0xC6,0xC2};
  22. //溫度是否是負(fù)
  23. uchar tempSign;
  24. //傳感器的溫度的高位低位
  25. uchar tH=0x00;tL=0x00;
  26. //當(dāng)前溫度
  27. float tt=0;//臨時(shí)
  28. int CurrentT=0;
  29. int t=0;//臨時(shí)
  30. //數(shù)位
  31. uchar bw,sw,gw,sfw;//百位,十位,個(gè)位,十分位

  32. //***********************以下為函數(shù)聲明部分*****************
  33. void DispLCG(int pos, int Data);
  34. void LCGDisp(void);
  35. void delay(uint us);
  36. void Init_DS18B20(void);
  37. uchar ReadOneChar(void);
  38. void WriteOneChar(uchar dat);
  39. void ReadTemperature(void);
  40. void LedDispDig(int Pos, int Dig, uchar isDot);
  41. void DisplayTemp(void);
  42. void init_serial(void);
  43. void Tranfer(char Data);

  44. //char Temp_lower, Temp_upper;         //溫度的上限和下限

  45. //=================================================================
  46. // 函數(shù)名稱 :void delay (uint us)
  47. // 函數(shù)功能 :延時(shí)
  48. // 入口參數(shù) :us 延時(shí)時(shí)間的長(zhǎng)短
  49. // 出口參數(shù) :無
  50. //=================================================================
  51. void delay(uint us)
  52. {
  53.         //此函數(shù)精確計(jì)算[12MHz晶振]:18+6*(t-1)=延時(shí)時(shí)間(us)
  54.         while (us--);
  55. }

  56. //=================================================================
  57. // 函數(shù)名稱 :void Init_DS18B20(void)
  58. // 函數(shù)功能 :DS18B20初始化函數(shù)
  59. // 入口參數(shù) :無
  60. // 出口參數(shù) :無
  61. //=================================================================
  62. void Init_DS18B20(void)
  63. {
  64.         uchar x = 0;
  65.         DQ = 1;   //DQ復(fù)位
  66.         delay(8); //稍做延時(shí)
  67.         DQ = 0;   //單片機(jī)將DQ拉低
  68.         delay(80); //精確延時(shí) 大于 480us
  69.         DQ = 1;   //拉高總線
  70.         delay(14);
  71.         x = DQ;     //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  72.         delay(20);
  73. }

  74. //=================================================================
  75. // 函數(shù)名稱 :uchar ReadOneChar(void)
  76. // 函數(shù)功能 :DS18B20讀字節(jié)函數(shù)
  77. // 入口參數(shù) :無
  78. // 出口參數(shù) :dat 讀回的字節(jié)數(shù)據(jù)
  79. //=================================================================
  80. uchar ReadOneChar(void)
  81. {
  82.         uchar i = 0;
  83.         uchar dat = 0;

  84.         for (i = 0; i < 8; i++)
  85.         {
  86.                 DQ = 0; // 給脈沖信號(hào)
  87.                 dat >>= 1;
  88.                 DQ = 1; // 給脈沖信號(hào)
  89.                 if (DQ)
  90.                         dat |= 0x80;
  91.                 delay(4);
  92.         }
  93.         return dat;
  94. }

  95. //=================================================================
  96. // 函數(shù)名稱 :void WriteOneChar(uchar dat)
  97. // 函數(shù)功能 :DS18B20寫字節(jié)函數(shù)
  98. // 入口參數(shù) :dat 要寫入的字節(jié)數(shù)據(jù)
  99. // 出口參數(shù) :無
  100. //=================================================================
  101. void WriteOneChar(uchar dat)
  102. {
  103.         uchar i = 0;
  104.         for (i = 0; i <8; i++)
  105.         {
  106.                 DQ = 0;
  107.                 DQ = dat & 0x01;
  108.                 delay(5);
  109.                 DQ = 1;
  110.                 dat >>= 1;
  111.         }
  112. }

  113. //=================================================================
  114. // 函數(shù)名稱 :float ReadTemperature(void)
  115. // 函數(shù)功能 :DS18B20讀取溫度值函數(shù)
  116. // 入口參數(shù) :無
  117. // 出口參數(shù) :讀取的溫度值,為float型的數(shù)據(jù)
  118. //=================================================================
  119. void ReadTemperature(void)
  120. {
  121.         Init_DS18B20();
  122.         WriteOneChar(0xcc); // 跳過讀序號(hào)列號(hào)的操作
  123.         WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  124.         Init_DS18B20();
  125.         WriteOneChar(0xcc); //跳過讀序號(hào)列號(hào)的操作
  126.         WriteOneChar(0xbe); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  127.         tL = ReadOneChar();
  128.         tH = ReadOneChar();
  129.        
  130.         //合并為字
  131.         t = tH;
  132.         t <<= 8;
  133.         t = t | tL;
  134.        
  135.         if((tH & 0xf8)==0xf8) //負(fù)溫度
  136.         {
  137.                  tt=(~t+1)*0.0625;
  138.                 tempSign = 1;       
  139.         }
  140.         else //正溫度
  141.         {
  142.                 tt=t*0.0625;
  143.                 tempSign=0;
  144.         }
  145.         CurrentT=(int)(tt*10); //tt*10保留一位小數(shù)并對(duì)float型強(qiáng)制取整
  146.        
  147.         bw=CurrentT/1000; //百位
  148.         sw=CurrentT%1000/100; //十位
  149.         gw=CurrentT%100/10; //個(gè)位
  150.         sfw=CurrentT%10; //小數(shù)十分位
  151. }

  152. //=================================================================
  153. // 函數(shù)名稱 :void DispLCG(int pos, int Data)
  154. // 函數(shù)功能 :顯示LCG
  155. // 入口參數(shù) :Pos 數(shù)碼管的位置
  156. //            Data 要顯示的數(shù)字
  157. // 出口參數(shù) :無
  158. //=================================================================
  159. void DispLCG(int Pos, int Data)
  160. {
  161.         P0 = LCGData[Data];
  162.         P1 |= 0x0f;
  163.         P1 &= 0xff - (0x01 << Pos);
  164. }
  165. void LCGDisp(void)
  166. {
  167.         int i,j;
  168.         for(j=0;j<500;j++) //大約2秒
  169.         {
  170.                 for(i=0;i<3;++i)
  171.                 {
  172.                         DispLCG(i,i);
  173.                         delay(300);
  174.                 }
  175.         }
  176. }
  177. //=================================================================
  178. // 函數(shù)名稱 :void LedDispDig(int Pos,int Dig)
  179. // 函數(shù)功能 :在指定的數(shù)碼管上顯示數(shù)字
  180. // 入口參數(shù) :Pos 數(shù)碼管的位置
  181. //            Dig 要顯示的數(shù)字
  182. //                                                isDot 是否是個(gè)位數(shù),個(gè)位數(shù)帶小數(shù)點(diǎn)
  183. // 出口參數(shù) :無
  184. //=================================================================
  185. void LedDispDig(int Pos, int Dig, uchar isDot)
  186. {
  187.         if (isDot==1)
  188.         {
  189.                 P0=LEDNumberDot[Dig]; //帶小數(shù)點(diǎn)
  190.         }
  191.         else
  192.         {
  193.                 P0 = LEDNumber[Dig]; //不帶小數(shù)點(diǎn)
  194.         }
  195.         P1 |= 0x0f;
  196.         P1 &= 0xff - (0x01 << Pos);
  197. }

  198. //=================================================================
  199. // 函數(shù)名稱 :void scan(float Temp)
  200. // 函數(shù)功能 :數(shù)碼管動(dòng)態(tài)掃描顯示溫度
  201. // 入口參數(shù) :Temp 數(shù)碼管上要顯示的溫度值
  202. // 出口參數(shù) :無
  203. //=================================================================
  204. void DisplayTemp(void)
  205. {       
  206.         //針對(duì)4位數(shù)碼管
  207.         if(tempSign==1) //負(fù)溫度,不會(huì)超過 -100,百位總是0,所以只判斷十位來確定在哪個(gè)位顯示負(fù)號(hào)
  208.         {
  209.                 if(sw==0)
  210.                 {
  211.                         LedDispDig(1,10,0);//十位顯示負(fù)號(hào),LEDNumber中第11個(gè)元素
  212.                         delay(300);
  213.                         LedDispDig(2,gw,1); //個(gè)位,1顯示小數(shù)點(diǎn)
  214.                         delay(300);
  215.                         LedDispDig(3,sfw,0); //小數(shù)十分位
  216.                 }
  217.                 else
  218.                 {
  219.                         LedDispDig(0,10,0);//百位顯示負(fù)號(hào),LEDNumber中第11個(gè)元素
  220.                         delay(300);
  221.                         LedDispDig(1,sw,0); //十位
  222.                         delay(300);
  223.                         LedDispDig(2,gw,1); //個(gè)位,1顯示小數(shù)點(diǎn)
  224.                         delay(300);
  225.                         LedDispDig(3,sfw,0); //小數(shù)十分位
  226.                 }
  227.         }
  228.         else //正溫度
  229.         {
  230.                 if(bw!=0)
  231.                 {
  232.                         LedDispDig(0,bw,0); //百位
  233.                         delay(300);
  234.                         LedDispDig(1,sw,0); //十位
  235.                         delay(300);
  236.                 }
  237.                 else if(sw!=0) //十位
  238.                 {
  239.                         LedDispDig(1,sw,0);
  240.                         delay(300);
  241.                 }
  242.                 LedDispDig(2,gw,1); //個(gè)位,1顯示小數(shù)點(diǎn)
  243.                 delay(300);
  244.                 LedDispDig(3,sfw,0); //小數(shù)十分位
  245.         }
  246.         //P1 |= 0x0f;                        //顯示小數(shù)點(diǎn)
  247.         //P1 &= 0xfb;
  248.         //P0=0x7f;
  249.         //delay(300);
  250. }

  251. //====================================================================================
  252. //函數(shù)名稱:void init_serial(void)
  253. //函數(shù)功能:初始化串口
  254. //入口參數(shù):無
  255. //出口參數(shù):無
  256. //====================================================================================
  257. void init_serial(void)
  258. {
  259.         TMOD = 0x22;    //定時(shí)器T1使用工作方式2
  260.         TH1 = 250;     //設(shè)置初值
  261.         TL1 = 250;
  262.         TR1 = 1;      //開始計(jì)時(shí)
  263.         PCON = 0x80;     //SMOD=1;
  264.         SCON = 0x50;     //工作方式1,波特率9600bit/s,允許接收
  265.         TI = 1;
  266. }

  267. //====================================================================================
  268. //函數(shù)名稱:void Tranfer(char Data)     
  269. //函數(shù)功能:發(fā)送數(shù)據(jù)程序
  270. //入口參數(shù):Data 要發(fā)送的數(shù)據(jù)
  271. //出口參數(shù):無
  272. //====================================================================================
  273. void Tranfer(char Data)
  274. {
  275.         while (TI == 0);
  276.         SBUF = Data;
  277.         TI = 0;
  278. }

  279. //====================================================================================
  280. //函數(shù)名稱:int main(void)     
  281. //函數(shù)功能:主函數(shù),主要用于上位機(jī)發(fā)送
  282. //入口參數(shù):無
  283. //出口參數(shù):無
  284. //====================================================================================
  285. int main(void)
  286. {
  287.         float Temp;

  288.         //顯示LCG
  289.         LCGDisp();
  290.        
  291.         tempSign = 0;

  292.         IT1 = 1;               //負(fù)跳變方式產(chǎn)生中斷
  293.         EX1 = 1;               //開外部中斷1
  294.         EA = 1;                                 //開總中斷
  295.         Init_DS18B20();
  296.         init_serial();
  297.         while (1)
  298.         {
  299.                 ReadTemperature();
  300.                 DisplayTemp();
  301.                
  302.                 Tranfer('a');
  303.                 //針對(duì)4位數(shù)碼管
  304.                 if(tempSign==1) //負(fù)溫度不會(huì)超過 -100,百位總是0
  305.                 {
  306.                         Tranfer('-');//發(fā)送負(fù)號(hào)
  307.                         if(sw==0) //十位為零,不發(fā)送百位和十位
  308.                         {
  309.                                 Tranfer(gw+0x30); //個(gè)位
  310.                                 Tranfer(sfw+0x30); //小數(shù)十分位
  311.                         }
  312.                         else
  313.                         {
  314.                                 Tranfer(sw+0x30); //十位
  315.                                 Tranfer(gw+0x30); //個(gè)位
  316.                                 Tranfer(sfw+0x30); //小數(shù)十分位
  317.                         }
  318.                 }
  319.                 else //第一位百位
  320.                 {
  321.                         if(bw!=0)
  322.                         {
  323.                                 Tranfer(bw+0x30); //百位
  324.                                 Tranfer(sw+0x30); //十位
  325.                         }
  326.                         else if(sw!=0) Tranfer(sw+0x30); //十位
  327.                         Tranfer(gw+0x30); //個(gè)位
  328.                         Tranfer(sfw+0x30); //小數(shù)十分位
  329.                 }
  330.                 Tranfer('b');
  331.         }
  332. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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