久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2645|回復: 1
打印 上一主題 下一主題
收起左側

初學8051:DS18B20,給初學者

[復制鏈接]
跳轉到指定樓層
樓主
ID:51812 發表于 2015-11-30 21:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
初學8051,把買的的學習板帶的程序給修改了、數碼管顯示,串口上位機顯示
STC89C52RC
壓縮包內有 下位機C51程序,proteus仿真,C#寫的簡單的串口。

在冰柜里測了低溫,在proteus里仿真了100°C以上的高溫,都能正確顯示。在腋窩里測了下體溫,用了好長時間才穩定在36.5°C 。

DS18B20.rar

239.42 KB, 下載次數: 22, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2015-12-2 00:38 | 只看該作者
  1. 樓主的程序:
  2. /*****************************************************************
  3. *程序名稱:DS18B20 4位數碼管 上位機
  4. *程序功能:讀寫DS18B20,數碼管顯示溫度值,上位機顯示。
  5. *開發工具:谷雨電子 多功能51開發板
  6. *MCU型號:STC89C52RC
  7. *時鐘頻率:11.0592MHZ
  8. *程序作者:LCG
  9. *版權說明:
  10. *****************************************************************/

  11. #include <reg52.h>

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

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

  32. //***********************以下為函數聲明部分*****************
  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. // 函數名稱 :void delay (uint us)
  47. // 函數功能 :延時
  48. // 入口參數 :us 延時時間的長短
  49. // 出口參數 :無
  50. //=================================================================
  51. void delay(uint us)
  52. {
  53.         //此函數精確計算[12MHz晶振]:18+6*(t-1)=延時時間(us)
  54.         while (us--);
  55. }

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

  74. //=================================================================
  75. // 函數名稱 :uchar ReadOneChar(void)
  76. // 函數功能 :DS18B20讀字節函數
  77. // 入口參數 :無
  78. // 出口參數 :dat 讀回的字節數據
  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; // 給脈沖信號
  87.                 dat >>= 1;
  88.                 DQ = 1; // 給脈沖信號
  89.                 if (DQ)
  90.                         dat |= 0x80;
  91.                 delay(4);
  92.         }
  93.         return dat;
  94. }

  95. //=================================================================
  96. // 函數名稱 :void WriteOneChar(uchar dat)
  97. // 函數功能 :DS18B20寫字節函數
  98. // 入口參數 :dat 要寫入的字節數據
  99. // 出口參數 :無
  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. // 函數名稱 :float ReadTemperature(void)
  115. // 函數功能 :DS18B20讀取溫度值函數
  116. // 入口參數 :無
  117. // 出口參數 :讀取的溫度值,為float型的數據
  118. //=================================================================
  119. void ReadTemperature(void)
  120. {
  121.         Init_DS18B20();
  122.         WriteOneChar(0xcc); // 跳過讀序號列號的操作
  123.         WriteOneChar(0x44); // 啟動溫度轉換
  124.         Init_DS18B20();
  125.         WriteOneChar(0xcc); //跳過讀序號列號的操作
  126.         WriteOneChar(0xbe); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  127.         tL = ReadOneChar();
  128.         tH = ReadOneChar();
  129.        
  130.         //合并為字
  131.         t = tH;
  132.         t <<= 8;
  133.         t = t | tL;
  134.        
  135.         if((tH & 0xf8)==0xf8) //負溫度
  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保留一位小數并對float型強制取整
  146.        
  147.         bw=CurrentT/1000; //百位
  148.         sw=CurrentT%1000/100; //十位
  149.         gw=CurrentT%100/10; //個位
  150.         sfw=CurrentT%10; //小數十分位
  151. }

  152. //=================================================================
  153. // 函數名稱 :void DispLCG(int pos, int Data)
  154. // 函數功能 :顯示LCG
  155. // 入口參數 :Pos 數碼管的位置
  156. //            Data 要顯示的數字
  157. // 出口參數 :無
  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. // 函數名稱 :void LedDispDig(int Pos,int Dig)
  179. // 函數功能 :在指定的數碼管上顯示數字
  180. // 入口參數 :Pos 數碼管的位置
  181. //            Dig 要顯示的數字
  182. //                                                isDot 是否是個位數,個位數帶小數點
  183. // 出口參數 :無
  184. //=================================================================
  185. void LedDispDig(int Pos, int Dig, uchar isDot)
  186. {
  187.         if (isDot==1)
  188.         {
  189.                 P0=LEDNumberDot[Dig]; //帶小數點
  190.         }
  191.         else
  192.         {
  193.                 P0 = LEDNumber[Dig]; //不帶小數點
  194.         }
  195.         P1 |= 0x0f;
  196.         P1 &= 0xff - (0x01 << Pos);
  197. }

  198. //=================================================================
  199. // 函數名稱 :void scan(float Temp)
  200. // 函數功能 :數碼管動態掃描顯示溫度
  201. // 入口參數 :Temp 數碼管上要顯示的溫度值
  202. // 出口參數 :無
  203. //=================================================================
  204. void DisplayTemp(void)
  205. {       
  206.         //針對4位數碼管
  207.         if(tempSign==1) //負溫度,不會超過 -100,百位總是0,所以只判斷十位來確定在哪個位顯示負號
  208.         {
  209.                 if(sw==0)
  210.                 {
  211.                         LedDispDig(1,10,0);//十位顯示負號,LEDNumber中第11個元素
  212.                         delay(300);
  213.                         LedDispDig(2,gw,1); //個位,1顯示小數點
  214.                         delay(300);
  215.                         LedDispDig(3,sfw,0); //小數十分位
  216.                 }
  217.                 else
  218.                 {
  219.                         LedDispDig(0,10,0);//百位顯示負號,LEDNumber中第11個元素
  220.                         delay(300);
  221.                         LedDispDig(1,sw,0); //十位
  222.                         delay(300);
  223.                         LedDispDig(2,gw,1); //個位,1顯示小數點
  224.                         delay(300);
  225.                         LedDispDig(3,sfw,0); //小數十分位
  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); //個位,1顯示小數點
  243.                 delay(300);
  244.                 LedDispDig(3,sfw,0); //小數十分位
  245.         }
  246.         //P1 |= 0x0f;                        //顯示小數點
  247.         //P1 &= 0xfb;
  248.         //P0=0x7f;
  249.         //delay(300);
  250. }

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

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

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

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

  292.         IT1 = 1;               //負跳變方式產生中斷
  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.                 //針對4位數碼管
  304.                 if(tempSign==1) //負溫度不會超過 -100,百位總是0
  305.                 {
  306.                         Tranfer('-');//發送負號
  307.                         if(sw==0) //十位為零,不發送百位和十位
  308.                         {
  309.                                 Tranfer(gw+0x30); //個位
  310.                                 Tranfer(sfw+0x30); //小數十分位
  311.                         }
  312.                         else
  313.                         {
  314.                                 Tranfer(sw+0x30); //十位
  315.                                 Tranfer(gw+0x30); //個位
  316.                                 Tranfer(sfw+0x30); //小數十分位
  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); //個位
  328.                         Tranfer(sfw+0x30); //小數十分位
  329.                 }
  330.                 Tranfer('b');
  331.         }
  332. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线二区 | 一区二区在线免费观看 | 精品国产乱码久久久久久影片 | 农村真人裸体丰满少妇毛片 | 国产福利资源 | 一区二区三区亚洲 | 日韩视频精品在线 | av日韩精品 | 在线观看国产视频 | 国产一二三区精品视频 | 日韩欧美中文 | 99久久婷婷国产综合精品电影 | 中文字幕免费 | 国产精品夜色一区二区三区 | 91新视频 | 亚洲精品一区二区三区蜜桃久 | 9久久婷婷国产综合精品性色 | 久在线观看| 日日噜噜噜夜夜爽爽狠狠视频97 | av先锋资源 | 黄网站在线播放 | 一级毛片免费看 | 国产一区二区不卡 | 欧美视频在线免费 | 91精品国产乱码久久久 | 男女羞羞的网站 | 欧美激情综合网 | 国产乱码精品一区二区三区忘忧草 | www.亚洲 | 日韩国产精品一区二区三区 | 国产一级在线观看 | 91精品国产一区二区 | 亚洲欧美在线观看 | 久久精品一区二区 | 亚洲天堂免费在线 | 中文字幕 欧美 日韩 | 欧美日韩国产一区二区三区 | 国产成人精品免费 | 国产免费xxx | 欧美性大战xxxxx久久久 | 99视频免费在线观看 |