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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

10元成本制作1637數碼管STC15F104單片機溫度計LM75A可交替顯示設定溫度成功

[復制鏈接]
跳轉到指定樓層
樓主
因T友要求,分享下使用STCF104E單片機加1637數碼管IIC接囗,只用2根線,加LM75A溫控頭IIC接囗,制作的溫度控制器。實測很穩定,只用一個按鍵完成溫度設置,42-99度。正常工作時實測溫度和設置溫度交替顯示,成本很低。不到10元。現上源代碼

制作出來的實物圖如下:


單片機源程序如下:
  1. #include <stc15.h>
  2. #include <INTRINS.H>
  3. #include <stdio.h>
  4. #include  <intrins.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. /* ***************************************************** */
  8. // 起別名定義
  9. /* ***************************************************** */
  10. typedef unsigned char uChar8;
  11. typedef unsigned int  uInt16;
  12. typedef enum{FALSE,TRUE} BOOL;
  13. /* ***************************************************** */
  14. // 宏定義
  15. /* ***************************************************** */
  16. #define LM75ADevIDAddr 0x90         
  17. #define IIC_WRITE 0x00
  18. #define IIC_READ  0x01
  19. /* ***************************************************** */
  20. // 位定義
  21. /* ***************************************************** */
  22. sbit SCL = P3^2;//綠色線
  23. sbit SDA = P3^3;//白色線
  24. long int LM75WD;//定義一個溫度長整型變量
  25. sbit out = P3^5;//輸出繼電器
  26. sbit k = P3^4;//調節溫度
  27. int set;//設置溫度


  28. /* ***************************************************** */
  29. // 全局變量定義
  30. /* ***************************************************** */
  31. bit p_bH0L_Flag;                                        // 溫度"0"上、下標志位
  32. float p_fLM75ATemp;                                        // 溫度值

  33. /* ***************************************************** */
  34. // 函數名稱:Delay5US()
  35. // 函數功能:微秒延時
  36. // 入口參數:延時微秒數(ValUS)
  37. // 出口參數:無
  38. /* ***************************************************** */
  39. void Delay5US(void)
  40. {
  41.        unsigned char i;

  42.         _nop_();
  43.         i = 11;
  44.         while (--i);
  45. }
  46. /* ***************************************************** */
  47. // 函數名稱:DelayMS()
  48. // 函數功能:毫秒延時
  49. // 入口參數:延時毫秒數(ValMS)
  50. // 出口參數:無
  51. /* ***************************************************** */
  52. void DelayMS(uInt16 ValMS)
  53. {
  54.        unsigned char i, j;

  55.         _nop_();
  56.         _nop_();
  57.         _nop_();
  58.         i = 11;
  59.         j = 190;
  60.         do
  61.         {
  62.                 while (--j);
  63.         } while (--i);
  64. }



  65. /* ***************************************************** */
  66. // 函數名稱:IIC_Start()
  67. // 函數功能:IIC起動
  68. // 入口參數:無
  69. // 出口參數:無
  70. /* ***************************************************** */
  71. void IIC_Start(void)
  72. {
  73.         SDA = 1;
  74.         Delay5US();
  75.         SCL = 1;
  76.         Delay5US();
  77.         SDA = 0;
  78.         Delay5US();
  79. }
  80. /* ***************************************************** */
  81. // 函數名稱:IIC_Stop()
  82. // 函數功能:IIC停止
  83. // 入口參數:無
  84. // 出口參數:無
  85. /* ***************************************************** */
  86. void IIC_Stop(void)                     
  87. {
  88.         SDA = 0;
  89.         Delay5US();
  90.         SCL = 1;
  91.         Delay5US();
  92.         SDA =1;
  93. }
  94. /* ***************************************************** */
  95. // 函數名稱:IIC_Ack()
  96. // 函數功能:IIC應答
  97. // 入口參數:無
  98. // 出口參數:無
  99. /* ***************************************************** */
  100. void IIC_Ack(void)                     
  101. {
  102.         SCL = 0;                                // 為產生脈沖準備
  103.         SDA = 0;                                // 產生應答信號
  104.         Delay5US();                                // 延時你懂得
  105.         SCL = 1;Delay5US();  
  106.         SCL = 0;Delay5US();                // 產生高脈沖
  107.         SDA = 1;                                // 釋放總線
  108. }
  109. /* ***************************************************** */
  110. // 函數名稱:IIC_RdAck()
  111. // 函數功能:讀IIC應答
  112. // 入口參數:無
  113. // 出口參數:是否應答真值
  114. /* ***************************************************** */
  115. BOOL IIC_RdAck(void)                     
  116. {
  117.         BOOL AckFlag;
  118.         uChar8 uiVal = 0;
  119.         SCL = 0;Delay5US();   
  120.         SDA = 1;
  121.         SCL = 1;Delay5US();
  122.         while((1 == SDA) && (uiVal < 255))
  123.         {
  124.                 uiVal ++;
  125.                 AckFlag = SDA;
  126.         }
  127.         SCL = 0;  
  128.         return AckFlag;                // 應答返回:0;不應答返回:1
  129. }
  130. /* ***************************************************** */
  131. // 函數名稱:IIC_Nack()
  132. // 函數功能:IIC不應答
  133. // 入口參數:無
  134. // 出口參數:無
  135. /* ***************************************************** */
  136. void IIC_Nack(void)                    
  137. {   
  138.         SDA = 1;
  139.         SCL = 0;Delay5US();      
  140.         SCL = 1;Delay5US();      
  141.         SCL = 0;
  142. }
  143. /* ***************************************************** */
  144. // 函數名稱:OutputOneByte()
  145. // 函數功能:從IIC器件中讀出一個字節
  146. // 入口參數:無
  147. // 出口參數:讀出的一個字節(uByteVal)
  148. /* ***************************************************** */
  149. uChar8 OutputOneByte(void)        
  150. {
  151.         uChar8 uByteVal = 0;
  152.         uChar8 iCount;
  153.         SDA = 1;
  154.         for (iCount = 0;iCount < 8;iCount++)
  155.         {
  156.                 SCL = 0;
  157.                 Delay5US();
  158.                 SCL = 1;
  159.                 Delay5US();
  160.                 uByteVal <<= 1;
  161.                 if(SDA)
  162.                         uByteVal |= 0x01;
  163.         }         
  164.         SCL = 0;
  165.         return(uByteVal);
  166. }
  167. /* ***************************************************** */
  168. // 函數名稱:InputOneByte()
  169. // 函數功能:向IIC器件寫入一個字節
  170. // 入口參數:待寫入的一個字節(uByteVal)
  171. // 出口參數:無
  172. /* ***************************************************** */
  173. void InputOneByte(uChar8 uByteVal)
  174. {
  175.     uChar8 iCount;
  176.     for(iCount = 0;iCount < 8;iCount++)
  177.         {  
  178.                 SCL = 0;
  179.                 Delay5US();                        
  180.                 SDA = (uByteVal & 0x80) >> 7;
  181.                 Delay5US();         
  182.                 SCL = 1;
  183.                 Delay5US();
  184.                 uByteVal <<= 1;
  185.     }
  186.         SCL = 0;            
  187. }
  188. /* ***************************************************** */
  189. // 函數名稱:IIC_WrDevAddAndDatAdd()
  190. // 函數功能:向IIC器件寫入器件和數據地址
  191. // 入口參數:器件地址(uDevAdd),數據地址(uDatAdd)
  192. // 出口參數:寫入是否成功真值
  193. /* ***************************************************** */
  194. BOOL IIC_WrDevAddAndDatAdd(uChar8 uDevAdd,uChar8 uDatAdd)
  195. {
  196.         IIC_Start();                        // 發送開始信號
  197.         InputOneByte(uDevAdd);        // 輸入器件地址
  198.         IIC_RdAck();                          // 讀應答信號
  199.         InputOneByte(uDatAdd);        // 輸入數據地址
  200.         IIC_RdAck();                        // 讀應答信號
  201.         return TRUE;         
  202. }
  203. /* ***************************************************** */
  204. // 函數名稱:IIC_RdDatFromAdd()
  205. // 函數功能:向IIC器件讀數據
  206. // 入口參數:器件ID(uDevID)、數據存儲地址(uStaAddVal)
  207. //                         待存數據(*p)、連續存儲數據的個數(uiLenVal)
  208. // 出口參數:無
  209. /* ***************************************************** */
  210. void IIC_RdDatFromAdd(uChar8 uDevID, uChar8 uStaAddVal, uChar8 *p, uChar8 uiLenVal)
  211. {                                                   
  212.         uChar8 iCount;
  213.         IIC_WrDevAddAndDatAdd(uDevID | IIC_WRITE,uStaAddVal);  
  214.         IIC_Start();
  215.         InputOneByte(uDevID | IIC_READ);
  216.         // IIC_READ 為寫命令后綴符
  217.         IIC_RdAck();     
  218.         for(iCount = 0;iCount < uiLenVal;iCount++)
  219.         {
  220.                 *p++ = OutputOneByte();
  221.                    if(iCount != (uiLenVal - 1))
  222.                         IIC_Ack();                 
  223.         }      
  224.         IIC_Nack();        
  225.         IIC_Stop();         
  226. }
  227. /* ***************************************************** */
  228. // 函數名稱:LM75A_ReadReg()
  229. // 函數功能:讀LM75A任意寄存器值
  230. // 入口參數:寄存器地址(addr),uLenVal,讀出字節的長度
  231. // 出口參數:寄存器內容(*val)
  232. /* ***************************************************** */
  233. void LM75A_ReadReg(uChar8 addr, uChar8 *val, uChar8 uLenVal)
  234. {
  235.         IIC_RdDatFromAdd(LM75ADevIDAddr, addr, val, uLenVal);
  236. }
  237. /* ***************************************************** */
  238. // 函數名稱:LM75A_TempConv()
  239. // 函數功能:溫度轉換
  240. // 入口參數:無
  241. // 出口參數:無
  242. /* ***************************************************** */
  243. void LM75A_TempConv(void)
  244. {
  245.         uChar8 TempML[2]={0};                                                // 臨時數值,用于存放Temp的高低字節
  246.         uInt16 uiTemp;                                                                // 用于存放Temp的11位字節數據
  247.         LM75A_ReadReg(0x00,TempML,2);                                // 讀出溫度,并存于數組TempHL中
  248.         uiTemp = (uInt16)TempML[0];                                        // 將高字節存入變量uiTemp中
  249.         uiTemp = (uiTemp << 8 | TempML[1]) >> 5;        // 接著并入后3位,最后右移5位就是11位補碼數(8+3共11位)
  250.         /* ***** 首先判斷溫度是“0上”還是是“0下” ***** */        
  251.         if(!(TempML[0] & 0x80))                                                // 最高位為“0”則為“0上”
  252.         {
  253.                 p_bH0L_Flag = 0;
  254.                 p_fLM75ATemp = uiTemp * 0.125;        
  255.         }
  256.         else                                                                                // 這時為“0下”(p_fLM75ATemp)℃
  257.         {
  258.                 p_bH0L_Flag = 1;
  259.                 p_fLM75ATemp = (0x800 - uiTemp) * 0.125;// 由于計算機中負數是以補碼形式存的,所以有這樣的算法。
  260.         }
  261. }

  262. sbit SCL1=P3^0; //CLK
  263. sbit SDA1=P3^1; //DIO
  264. unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};

  265. void Delay1000ms()                //@11.0592MHz
  266. {
  267.         unsigned char i, j, k;

  268.         _nop_();
  269.         _nop_();
  270.         i = 43;
  271.         j = 6;
  272.         k = 203;
  273.         do
  274.         {
  275.                 do
  276.                 {
  277.                         while (--k);
  278.                 } while (--j);
  279.         } while (--i);
  280. }


  281. void IIC_delay(void)
  282. {
  283.     unsigned char i;
  284.     for(i=0;i<20;i++) _nop_();
  285. }
  286. void start_IIC(void)// 啟動IIC

  287. {
  288.     SCL1=1; //給芯片發送開始信號
  289.     SDA1=1;
  290.     IIC_delay();
  291.     SDA1=0;
  292.     IIC_delay();
  293.     SCL1=0; //開始信號傳送完
  294.     IIC_delay();
  295. }
  296. void stop_IIC(void) //停止IIC
  297. {
  298.     SCL1=0;
  299.     IIC_delay();
  300.     SDA1=0;
  301.     IIC_delay();
  302.     SCL1=1;
  303.     IIC_delay();
  304.     SDA1=1;
  305. }
  306. void ack_IIC()
  307. {
  308.     SCL1=0;
  309.     _nop_();_nop_();_nop_();
  310.     while(SDA1);
  311.     SCL1=1;
  312.     _nop_();_nop_();_nop_();
  313.     SCL1=0;
  314. }
  315. void WriteByte(unsigned char WriteData) //寫一個字節數據
  316. {
  317.     unsigned char i;
  318.     for(i=0;i<8;i++)//開始傳送8位數據,每循環一次傳送一位數據
  319.     {
  320.         SCL1=0;
  321.         IIC_delay();
  322.         WriteData=WriteData>>1;
  323.         SDA1=CY;
  324.         IIC_delay();
  325.         SCL1=1;
  326.         IIC_delay();
  327.     }
  328. //8位數據傳送完
  329.     ack_IIC(); //判斷芯片發過來的ACK應答信號
  330. }
  331. void write_LEDSROM(unsigned char addr,unsigned char WData) //寫一字節數據到LEDSROM
  332. {
  333.     start_IIC(); //調用開始信號
  334.     WriteByte(addr); //寫起始地址命令(0C0H),地址00H單元。
  335.     WriteByte(WData);//給顯示寄存器寫顯示數據,值可根據實參改變
  336.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  337. }


  338. void dsplay(int temp) //顯示
  339. {
  340.           
  341.     SDA1=1;
  342.     SCL1=1;
  343.     start_IIC(); //調用開始信號
  344.     WriteByte(0x40);//寫命令40H(數據設置)
  345.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  346.        
  347.        
  348.     write_LEDSROM(0xC0,xsbcdbuf[temp/1000]); //第一個數碼管
  349.    // write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]);  //第二個數碼管,0x80打開DP小數點
  350.           write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]|0x80);  //第二個數碼管,0x80打開DP小數點
  351.     write_LEDSROM(0xC2,xsbcdbuf[temp%100/10]); //第三個數碼管
  352.          //write_LEDSROM(0xC3,xsbcdbuf[temp%10]);//第四個數碼管
  353.        
  354.     write_LEDSROM(0xC3,0x39);//第四個數碼管
  355.        
  356.        
  357.        
  358.        
  359.        
  360.     IIC_delay();
  361.     start_IIC(); //調用開始信號
  362.     WriteByte(0x8a); //送開屏命令,(8BH),亮度可以根據低三位調節。//顯示亮度
  363.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  364. }
  365. void dsplay2(int temp) //顯示
  366. {
  367.           
  368.     SDA1=1;
  369.     SCL1=1;
  370.     start_IIC(); //調用開始信號
  371.     WriteByte(0x40);//寫命令40H(數據設置)
  372.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  373.        
  374.        
  375.     write_LEDSROM(0xC0,xsbcdbuf[temp/1000]); //第一個數碼管
  376.     write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]);  //第二個數碼管,0x80打開DP小數點
  377.          // write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]|0x80);  //第二個數碼管,0x80打開DP小數點
  378.    // write_LEDSROM(0xC2,xsbcdbuf[temp%100/10]); //第三個數碼管
  379.          //write_LEDSROM(0xC3,xsbcdbuf[temp%10]);//第四個數碼管
  380.        
  381.     //write_LEDSROM(0xC3,0x39);//第四個數碼管
  382.        
  383.             write_LEDSROM(0xC3,0x00);//第4個數碼管//關閉
  384.             write_LEDSROM(0xC2,0x00);//第3個數碼管
  385.        
  386.        
  387.     IIC_delay();
  388.     start_IIC(); //調用開始信號
  389.     WriteByte(0x8a); //送開屏命令,(8BH),亮度可以根據低三位調節。//顯示亮度
  390.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  391. }
  392. /* ***************************************************** */
  393. // 函數名稱:main()
  394. // 函數功能:讀取LN75A溫度值,數碼管顯示并串口打印
  395. // 入口參數:無
  396. // 出口參數:無
  397. /* ***************************************************** */
  398. void main()
  399. {
  400. ……………………

  401. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
1637數顯STC15F104E LM75A溫度OK2.zip (50.93 KB, 下載次數: 65)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:358930 發表于 2018-12-5 22:49 | 只看該作者
源代碼錯了,幫從源文件粘貼下,謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久久爱 | 欧洲精品视频一区 | 国产成人99久久亚洲综合精品 | 亚洲国产精品一区二区三区 | 中文字幕亚洲精品在线观看 | 久久久久久久久久久91 | 欧美亚洲视频 | 国产成人精品久久二区二区91 | 中文字幕av在线一二三区 | 中文字幕国产 | 91免费看片 | 91九色porny首页最多播放 | 国产欧美日韩一区二区三区在线观看 | 国产精品99久久久久久宅男 | 三级黄视频在线观看 | 精品视频 免费 | 91麻豆精品国产91久久久更新资源速度超快 | 在线三级网址 | 亚洲一一在线 | 亚洲色图在线观看 | 久久91精品国产一区二区 | 成人网址在线观看 | 古典武侠第一页久久777 | 国产精品福利网站 | 日本精品视频 | 日本一区二区三区免费观看 | 中文字幕免费 | www.天天操| 久久99精品久久久久婷婷 | 国产在线视频一区二区 | 欧美成人精品一区二区三区 | 亚洲国产精品久久人人爱 | 亚洲情侣视频 | 国产精品视频播放 | 91精品国产乱码久久久久久久久 | 亚洲欧洲精品在线 | 国产一区二区麻豆 | 国产欧美日韩在线播放 | 亚洲成人一区 | 91精品一区二区 | 成人在线视频免费观看 |