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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

1602液晶顯示用于產品的LM75A溫控制器STC15F104E MCU源碼

[復制鏈接]
跳轉到指定樓層
樓主
微型貼片單片機STC15F104E單片機做的LM75A溫控制器,帶1602液晶顯示器,有溫度設置。用最小的單片機做最多的功能

制作出來的實物圖如下:


單片機源碼:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit sda=P3^1;
  6. sbit scl=P3^0;

  7. void delay()        //@11.0592MHz  stc12(100us)
  8. {
  9.         unsigned char i, j;

  10.         i = 2;
  11.         j = 15;
  12.         do
  13.         {
  14.                 while (--j);
  15.         } while (--i);
  16. }

  17. void delay1(uint x)//@11.0592MHz  stc12(1ms)
  18. {
  19. unsigned char i, j;

  20.         _nop_();
  21.         i = 11;
  22.         j = 190;
  23.         do
  24.         {
  25.                 while (--j);
  26.         } while (--i);
  27. }
  28. /* ***************************************************** */
  29. // 起別名定義
  30. /* ***************************************************** */
  31. typedef unsigned char uChar8;
  32. typedef unsigned int  uInt16;
  33. typedef enum{FALSE,TRUE} BOOL;
  34. /* ***************************************************** */
  35. // 宏定義
  36. /* ***************************************************** */
  37. #define LM75ADevIDAddr 0x90         
  38. #define IIC_WRITE 0x00
  39. #define IIC_READ  0x01
  40. /* ***************************************************** */
  41. // 位定義
  42. /* ***************************************************** */
  43. sbit SCL = P3^2;//綠色線
  44. sbit SDA = P3^3;//白色線
  45. long int LM75WD;
  46. long int SET=28000; //28.000度  


  47. //sbit led1=P3^0;//溫度燈報警
  48. //sbit led2=P3^1;//壓力燈報警

  49. sbit OUT=P3^5;//控制器輸出

  50. sbit IN=P3^4;//開關輸入設置溫度
  51. /* ***************************************************** */
  52. // 全局變量定義
  53. /* ***************************************************** */
  54. bit p_bH0L_Flag;                                        // 溫度"0"上、下標志位
  55. float p_fLM75ATemp;                                        // 溫度值

  56. /* ***************************************************** */
  57. // 函數名稱:Delay5US()
  58. // 函數功能:微秒延時
  59. // 入口參數:延時微秒數(ValUS)
  60. // 出口參數:無
  61. /* ***************************************************** */
  62. void Delay5US(void)
  63. {
  64.        unsigned char i;

  65.         _nop_();
  66.         i = 11;
  67.         while (--i);
  68. }
  69. /* ***************************************************** */
  70. // 函數名稱:DelayMS()
  71. // 函數功能:毫秒延時
  72. // 入口參數:延時毫秒數(ValMS)
  73. // 出口參數:無
  74. /* ***************************************************** */
  75. void DelayMS(uInt16 ValMS)
  76. {
  77.        unsigned char i, j;

  78.         _nop_();
  79.         _nop_();
  80.         _nop_();
  81.         i = 11;
  82.         j = 190;
  83.         do
  84.         {
  85.                 while (--j);
  86.         } while (--i);
  87. }



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

  285. /********************************1602**************************************/
  286. void start() //開始信號
  287. {
  288. sda=1;
  289. delay();
  290. scl=1;
  291. delay();
  292. sda=0;
  293. delay();
  294. }
  295. void stop() //停止
  296. {
  297. sda=0;
  298. delay();
  299. scl=1;
  300. delay();
  301. sda=1;
  302. delay();
  303. }
  304. void respons() //應答
  305. {
  306. uchar i;
  307. scl=1;
  308. delay();
  309. while((sda==1)&&(i<250))i++;
  310. scl=0;
  311. delay();
  312. }
  313. void init()
  314. {
  315. sda=1;
  316. delay();
  317. scl=1;
  318. delay();
  319. }
  320. void write_byte(uchar date)
  321. {
  322. uchar i,temp;
  323. temp=date;
  324. for(i=0;i<8;i++)
  325. {
  326. temp=temp<<1;
  327. scl=0;
  328. delay();
  329. sda=CY;
  330. delay();
  331. scl=1;
  332. delay();
  333. }
  334. scl=0;
  335. delay();
  336. sda=1;
  337. delay();
  338. }

  339. void write_add(uchar date1)
  340. {
  341. start();
  342. write_byte(0x4e); //8574A 地址+寫入 (8574 地址+寫入0x4e)//0x27+0x27=0x4e//全部空0x3f+0x3f=0x7e
  343. respons();
  344. write_byte(date1);                                                                                                         
  345. respons();
  346. stop();
  347. }                                                                                                                                                                                          
  348. void write_com(uchar com)        //寫命令函數
  349. {        uchar com1,com2;
  350. com1=com|0x0f;
  351. write_add(com1&0xfc);
  352. delay1(2);
  353. write_add(com1&0xf8);
  354. com2=com<<4;
  355. com2=com2|0x0f;
  356. write_add(com2&0xfc);
  357. delay1(2);
  358. write_add(com2&0xf8);
  359. }
  360. void write_date(uchar date)        //寫數據函數
  361. {
  362. uchar date1,date2;
  363. date1=date|0x0f;
  364. write_add(date1&0xfd);
  365. delay1(2);
  366. write_add(date1&0xf9);
  367. date2=date<<4;
  368. date2=date2|0x0f;
  369. write_add(date2&0xfd);
  370. delay1(2);
  371. write_add(date2&0xf9);
  372. }
  373. void write_zfc(uchar *p)//定義一個帶指針的函數?(字符串)
  374. {
  375.         while(*p!=0)//不能用";"
  376.         write_date(*p++);
  377. }
  378. void init_lcd()        //初始化函數
  379. {
  380. write_add(0x08);        //默認開始狀態為關使能端,見時序圖 選擇狀態為 寫
  381. write_com(0x0f);
  382. write_com(0x28);        //顯示模式設置 0x28中高位2,設置4線。
  383. write_add(0x0c);
  384. write_add(0x08);        //使能4線
  385. write_com(0x28);        //顯示模式設置,為0x28。
  386. write_com(0x01);        //顯示清屏,將上次的內容清除,默認為0x01.
  387. write_com(0x0c);        //顯示功能設置0x0f為開顯示,顯示光標,光標閃爍;0x0c為開顯示,不顯光標,光標不閃
  388. write_com(0x06);        //設置光標狀態默認0x06,為讀一個字符光標加1.
  389. }

  390. void display(long temp)        //顯示函數
  391. {

  392. uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  393.         //temp=12345678;
  394.         dt1 = temp%10;//1位
  395.         dt2 = temp%100/10;//2位
  396.         dt3 = temp%1000/100;//3位
  397.         dt4 = temp%10000/1000;//4位

  398.         dt5 = temp%100000/10000;//5位
  399.         dt6 = temp%1000000/100000;//6位
  400.         dt7 = temp%10000000/1000000;//7位
  401.         dt8 = temp/10000000;//8位             最高位                                                                                                           
  402.         write_com(0xC0); //第1行
  403.         write_zfc("WD:");
  404.         //write_date(dt8+0x30);
  405.         //write_date(dt7+0x30);
  406.         //write_date(dt6+0x30);
  407.         write_date(dt5+0x30);
  408.         write_date(dt4+0x30);
  409.         write_zfc(".");
  410.         write_date(dt3+0x30);
  411.         write_date(dt2+0x30);
  412.         //write_date(dt1+0x30);
  413.         write_zfc("C");
  414.                
  415. }
  416. void display2(long temp)        //顯示函數
  417. {

  418. uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  419.         //temp=12345678;
  420.         dt1 = temp%10;//1位
  421.         dt2 = temp%100/10;//2位
  422.         dt3 = temp%1000/100;//3位
  423.         dt4 = temp%10000/1000;//4位

  424.         dt5 = temp%100000/10000;//5位
  425.         dt6 = temp%1000000/100000;//6位
  426.         dt7 = temp%10000000/1000000;//7位
  427.         dt8 = temp/10000000;//8位             最高位                                                                                                           
  428.         write_com(0xc0+10); //第1行
  429.         write_zfc("SET:");
  430.         //write_date(dt8+0x30);
  431.         //write_date(dt7+0x30);
  432.         //write_date(dt6+0x30);
  433.         write_date(dt5+0x30);
  434.         write_date(dt4+0x30);
  435.         //rite_zfc(".");
  436.         //write_date(dt3+0x30);
  437.         //write_date(dt2+0x30);
  438.         //write_date(dt1+0x30);
  439.         write_zfc("C");
  440.                
  441. }
  442. void main()
  443. {      

  444.     init_lcd();
  445.           OUT=1;//啟動時關一下
  446.       
  447.         while(1)
  448.         {
  449.                  
  450.                
  451.                  LM75A_TempConv();//讀取溫度LM75A  
  452.                  DelayMS(200);                              
  453.                  LM75WD = p_fLM75ATemp * 1000;// 將溫度全部轉換成整數,以便數碼管顯示                                       
  454.            init();         //通訊1602
  455.             display(LM75WD); // 顯示1602
  456.                  display2(SET); // 顯示1602
  457.                  if(IN==0)//設置溫度
  458.      {
  459.                          SET=SET+1000;
  460.                         if(SET>99999)//設置溫度
  461.                         SET=28000;      
  462.                  }
  463.                  
  464.                
  465.                 if(LM75WD>=SET)// 溫度30
  466.      {
  467.                         OUT=0;
  468.                   write_com(0x80); //第1行
  469.                         write_zfc("OUT:OFF");//220V電源關閉               
  470.                           
  471.                  }
  472.                  else{
  473.                         if(LM75WD<=SET-1000)// 溫度回落1.000度后再執行,防閃爍
  474.                         {
  475.                  OUT=1;
  476.                  write_com(0x80); //第1行
  477.                  write_zfc("OUT: ON");//220V電源輸出                              
  478.                  }
  479.                 else      
  480.                  {
  481.                         OUT=0;
  482.                   write_com(0x80); //第1行
  483.                         write_zfc("OUT:OFF");//220V電源關閉                 
  484.                  }         
  485.          }
  486.          
  487.          
  488.         }
  489. }
復制代碼

全部資料51hei下載地址:
1602顯串STC15F104E LM75A溫度OK3(0x4e).zip (67.22 KB, 下載次數: 53)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1088279 發表于 2023-7-16 09:39 | 只看該作者
如果需要將收集的數據傳輸到電腦上,該如何操作
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂网中文字幕在线观看 | 日韩在线欧美 | 日韩在线一区二区三区 | 日韩中文字幕一区二区 | 免费观看的黄色网址 | 91九色视频在线 | 九九九久久国产免费 | a免费视频| 久久久91 | 国产精品成人一区二区 | 欧美男人天堂 | xx性欧美肥妇精品久久久久久 | 精品综合 | 中文成人在线 | 欧洲亚洲一区二区三区 | 久久精品国产一区二区三区 | 性色av香蕉一区二区 | 久久久激情视频 | av免费看在线| 在线观看国产视频 | 国产成人精品综合 | 密室大逃脱第六季大神版在线观看 | 成人免费网站www网站高清 | 亚洲精品成人网 | 亚洲高清视频一区二区 | 免费观看毛片 | 一区二区三区亚洲视频 | 久久免费视频在线 | 日韩欧美一区二区三区免费观看 | 精品中文字幕一区二区三区 | 欧美不卡视频 | 人人干人人干人人 | 中文字幕在线视频免费视频 | 国产一区二区在线免费观看 | 涩在线| 欧美一区二区三区在线视频 | 99亚洲精品 | 91看片在线 | 一区二区三区视频在线观看 | 亚洲一区不卡在线 | 性生生活大片免费看视频 |