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

標題: 單片機溫濕度光照二氧化碳 智能檢測Proteus仿真+程序 [打印本頁]

作者: 18864960139    時間: 2019-7-22 11:13
標題: 單片機溫濕度光照二氧化碳 智能檢測Proteus仿真+程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg51.h>       
  2. #include "lcd.h"
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define ulong unsigned long
  7. #define NACK        0
  8. #define ACK                1
  9. #define MEASURE_TEMP        0x03        //000 0001  1
  10. #define MEASURE_HUMI        0x05        //000 0010  1
  11. #define STATUS_REG_W        0x06        //000 0011  0
  12. #define STATUS_REG_R        0x07        //000 0011  1
  13. #define RESET                        0x1E        //000 1111  0
  14. ulong volt;//測量的電壓值
  15. sbit Data=P2^3;   //定義數(shù)據(jù)線
  16. sbit CLK=P3^3;//定義時鐘信號口
  17. sbit DIN=P3^1;//定義2543數(shù)據(jù)寫入口
  18. sbit DOUT=P3^0;//定義2543數(shù)據(jù)讀取口
  19. sbit CS=P3^2;//定義2543片選信號口
  20. sbit Data_P    = P2^4;                        // SHT11傳感器的數(shù)據(jù)管腳
  21. sbit Sck_P     = P2^3;                        // SHT11傳感器的時鐘管腳
  22. sbit BEEP =P2^5;
  23. uchar tmpe,h;
  24. uchar rec_dat[9];   //用于顯示的接收數(shù)據(jù)數(shù)組
  25. uchar temp_max = 30;
  26. uchar humi_min = 60;
  27. ulong C2_max = 3500000;
  28. ulong LUX_max = 3500000;
  29. ulong C2_now = 0;
  30. ulong LUX_now = 0;
  31. unsigned char temp;                                                        // 保存溫度
  32. unsigned char humi;                                                  // 保存濕度

  33. enum { TEMP,HUMI };
  34. typedef union                              //定義共用同類型
  35. {
  36.         unsigned int i;
  37.         float f;
  38. }value;


  39. int display = 0;
  40. void delay(uchar ms)
  41. {  // 延時子程序
  42. uchar i;
  43. while(ms--)
  44. {
  45.   for(i = 0;i<250;i++);  
  46. }
  47. }

  48. char ShtWriteByte(unsigned char value)
  49. {
  50.         unsigned char i,error=0;
  51.         for(i=128;i>0;i>>=1)  // 高位為1,循環(huán)右移
  52.         {
  53.                 if (i&value)
  54.                         Data_P=1;               // 和要發(fā)送的數(shù)相與,結果為發(fā)送的位
  55.                 else
  56.                         Data_P=0;
  57.                 Sck_P=1;
  58.                 _nop_();                                                // 延時3us
  59.                 _nop_();
  60.                 _nop_();
  61.                 Sck_P=0;
  62.         }
  63.         Data_P=1;                                            // 釋放數(shù)據(jù)線
  64.         Sck_P=1;
  65.         error=Data_P;                                  // 檢查應答信號,確認通訊正常
  66.         _nop_();
  67.         _nop_();
  68.         _nop_();
  69.         Sck_P=0;
  70.         Data_P=1;
  71.         return error;                                 // error=1 通訊錯誤
  72. }

  73. char ShtReadByte(unsigned char ack)
  74. {
  75.         unsigned char i,val=0;
  76.         Data_P=1;                                                 // 釋放數(shù)據(jù)線
  77.         for(i=0x80;i>0;i>>=1)        // 高位為1,循環(huán)右移
  78.         {
  79.                 Sck_P=1;
  80.                 if(Data_P)
  81.                         val=(val|i);            // 讀一位數(shù)據(jù)線的值
  82.                 Sck_P=0;
  83.         }
  84.         Data_P=!ack;                            // 如果是校驗,讀取完后結束通訊
  85.         Sck_P=1;
  86.         _nop_();                                                        // 延時3us
  87.         _nop_();
  88.         _nop_();
  89.         Sck_P=0;
  90.         _nop_();
  91.         _nop_();
  92.         _nop_();
  93.         Data_P=1;                                                 // 釋放數(shù)據(jù)線
  94.         return val;
  95. }


  96. void ShtTransStart(void)
  97. {
  98.         Data_P=1;
  99.         Sck_P=0;
  100.         _nop_();
  101.         Sck_P=1;
  102.         _nop_();
  103.         Data_P=0;
  104.         _nop_();
  105.         Sck_P=0;
  106.         _nop_();
  107.         _nop_();
  108.         _nop_();
  109.         Sck_P=1;
  110.         _nop_();
  111.         Data_P=1;
  112.         _nop_();
  113.         Sck_P=0;
  114. }

  115. void ShtConnectReset(void)
  116. {
  117.         unsigned char i;
  118.         Data_P=1;                                    //準備
  119.         Sck_P=0;
  120.         for(i=0;i<9;i++)          //DATA保持高,SCK時鐘觸發(fā)9次,發(fā)送啟動傳輸,通迅即復位
  121.         {
  122.                 Sck_P=1;
  123.                 Sck_P=0;
  124.         }
  125.         ShtTransStart();           //啟動傳輸
  126. }

  127. char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  128. {
  129.         unsigned error=0;
  130.         unsigned int i;
  131.         ShtTransStart();                  // 啟動傳輸
  132.         switch(mode)                       // 選擇發(fā)送命令
  133.         {
  134.                 case 1 :                                           // 測量溫度
  135.                         error+=ShtWriteByte(0x03);
  136.                         break;
  137.                 case 2 :                                           // 測量濕度
  138.                         error+=ShtWriteByte(0x05);
  139.                         break;
  140.                 default:
  141.                         break;
  142.         }
  143.         for(i=0;i<65535;i++)
  144.                 if(Data_P==0)
  145.                         break;                                          // 等待測量結束
  146.                 if(Data_P)
  147.                         error+=1;                           // 如果長時間數(shù)據(jù)線沒有拉低,說明測量錯誤
  148.         *(p_value) =ShtReadByte(1);                  // 讀第一個字節(jié),高字節(jié) (MSB)
  149.         *(p_value+1)=ShtReadByte(1);                 // 讀第二個字節(jié),低字節(jié) (LSB)
  150.         *p_checksum =ShtReadByte(0);          // read CRC校驗碼
  151.         return error;                                                                          // error=1 通訊錯誤
  152. }

  153. void CalcSHT11(float *p_humidity ,float *p_temperature)
  154. {
  155.         const float C1=-4.0;                                 // 12位濕度精度 修正公式
  156.         const float C2=+0.0405;                        // 12位濕度精度 修正公式
  157.         const float C3=-0.0000028;        // 12位濕度精度 修正公式
  158.         const float T1=+0.01;                                 // 14位溫度精度 5V條件 修正公式
  159.         const float T2=+0.00008;                 // 14位溫度精度 5V條件 修正公式
  160.         float rh=*p_humidity;                                 // rh: 12位 濕度
  161.         float t=*p_temperature;                        // t:  14位 溫度
  162.         float rh_lin;                                                                // rh_lin: 濕度 linear值
  163.         float rh_true;                                                        // rh_true: 濕度 ture值
  164.         float t_C;                                                                         // t_C : 溫度 ℃
  165.         t_C=t*0.01 - 40;                                                 //補償溫度
  166.         rh_lin=C3*rh*rh + C2*rh + C1;                                        //相對濕度非線性補償
  167.         rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;                //相對濕度對于溫度依賴性補償
  168.         *p_temperature=t_C;                                         //返回溫度結果
  169.         *p_humidity=rh_true;                                 //返回濕度結果
  170. }

  171. unsigned char TempCorrect(int temp)
  172. {
  173.         if(temp<0)        temp=0;
  174.         if(temp>970)  temp=970;
  175.         if(temp>235)  temp=temp+10;
  176.         if(temp>555)  temp=temp+10;
  177.         if(temp>875)  temp=temp+10;
  178.         temp=(temp%1000)/10;
  179.         return temp;
  180. }

  181. unsigned char HumiCorrect(unsigned int humi)
  182. {
  183.         if(humi>999)  humi=999;
  184.         if((humi>490)&&(humi<951))  humi=humi-10;
  185.         humi=(humi%1000)/10;
  186.         return humi+4;
  187. }

  188. void ReadShtData()
  189. {
  190.         value humi_val,temp_val;          // 定義兩個共同體,一個用于濕度,一個用于溫度
  191.         unsigned char error;                                                          // 用于檢驗是否出現(xiàn)錯誤
  192.         unsigned char checksum;                                                  // CRC
  193.         unsigned int temp1,humi1;                                                // 臨時讀取到的溫濕度數(shù)據(jù)

  194.         error=0;                                                                                 //初始化error=0,即沒有錯誤
  195.         error+=ShtMeasure((unsigned char*)&temp_val.i,&checksum,1);         //溫度測量
  196.         error+=ShtMeasure((unsigned char*)&humi_val.i,&checksum,2);         //濕度測量

  197.         if(error!=0)                                                           //如果發(fā)生錯誤,系統(tǒng)復位
  198.                 ShtConnectReset();
  199.         else
  200.         {
  201.                 humi_val.f=(float)humi_val.i;                                 //轉換為浮點數(shù)
  202.                 temp_val.f=(float)temp_val.i;                                  //轉換為浮點數(shù)
  203.                 CalcSHT11(&humi_val.f,&temp_val.f);          //修正相對濕度及溫度
  204.                 temp1=temp_val.f*10;
  205.                 temp=TempCorrect(temp1);
  206.                 humi1=humi_val.f*10-50;
  207.                 humi=HumiCorrect(humi1);
  208.                 humi1=humi1-1;
  209.         }

  210. }


  211. void read2543(uchar addr)
  212. {
  213.         uint ad=0;
  214.         uchar i;
  215.         CLK=0;
  216.         CS=0;//片選段,啟動2543
  217.         addr<<=4;//對地址位預處理
  218.         for(i=0;i<12;i++) //12個時鐘走完,完成一次讀取測量
  219.         {
  220.                 if(DOUT==1)
  221.                         ad=ad|0x01;//單片機讀取ad數(shù)據(jù)
  222.                 DIN=addr&0x80;//2543讀取測量地址位
  223.                 CLK=1;
  224.                 ;;;//很短的延時
  225.                 CLK=0;//產(chǎn)生下降沿,產(chǎn)生時鐘信號
  226.                 ;;;
  227.                 addr<<=1;
  228.                 ad<<=1;//將數(shù)據(jù)移位準備下一位的讀寫
  229.         }
  230.         CS=1;//關2543
  231.         ad>>=1;
  232.         volt=ad;//取走轉換結果
  233.         volt=volt*1221;//例子的滿量程為5V,轉換分辯率為12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表實際1221mV        
  234. }

  235. void main(void)
  236. {

  237.         LcdInit();
  238.                 ShtConnectReset();
  239.         DisplayListChar(0,0,"tmpe:");
  240.         DisplayListChar(8,0,"HR:");
  241.         DisplayListChar(0,1,"LUX:");
  242.   DisplayOneChar(5,1,'.');
  243.         DisplayListChar(9,1,"C2:");
  244.         DisplayOneChar(13,1,'.');
  245.         while(1)
  246.         {
  247.           ReadShtData();

  248.                 DisplayOneChar(11,0,(char)(humi/10+'0'));
  249.                 DisplayOneChar(12,0,(char)(humi%10+'0'));
  250.                 DisplayOneChar(5,0,(char)(temp/10+'0'));
  251.                 DisplayOneChar(6,0,(char)(temp%10+'0'));
  252.                
  253.                 read2543(0);//調(diào)用2543驅(qū)動程序測量地址為
  254.                 LUX_now=volt;
  255.                 DisplayOneChar(4,1,(char)(volt/1000000+'0'));
  256.           DisplayOneChar(6,1,(char)((volt/100000)%10+'0'));
  257.           DisplayOneChar(7,1,(char)((volt/10000)%10+'0'));
  258.                 read2543(1);//調(diào)用2543驅(qū)動程序測量地址為
  259.                 C2_now=volt;
  260.                 DisplayOneChar(12,1,(char)(volt/1000000+'0'));
  261.           DisplayOneChar(14,1,(char)((volt/100000)%10+'0'));
  262.           DisplayOneChar(15,1,(char)((volt/10000)%10+'0'));
  263.                
  264.                 if(LUX_now>LUX_max || C2_now>C2_max || humi<humi_min || temp>temp_max)
  265.                 {
  266.                        
  267.                         BEEP=0;
  268.                 }else
  269.                 {
  270.                         BEEP=1;
  271.                 }

  272.         }                               
  273. }
復制代碼

所有資料51hei提供下載:
_溫濕度光強二氧化碳.zip (141.75 KB, 下載次數(shù): 493)


作者: lequsshow    時間: 2019-8-22 16:05
深受啟發(fā),學習了,用Proteus8.8打開的效果如下:

51hei.gif (67.16 KB, 下載次數(shù): 129)

51hei.gif

作者: 萬古琴    時間: 2019-8-24 07:06
很實用 很有參考價值 謝謝哈
作者: ZywOo1    時間: 2019-11-6 17:15
請問一下附件里面的protues仿真圖沒有找到。
作者: xiayuchen    時間: 2019-12-9 16:29
要加控制該怎么加
作者: xray1111    時間: 2020-2-20 10:07
深受啟發(fā),謝謝
作者: 小鄭z    時間: 2020-2-27 21:49
xray1111 發(fā)表于 2020-2-20 10:07
深受啟發(fā),謝謝

想問下用的proteus版本是多少,可以打開工程嗎
作者: wangweijie    時間: 2020-3-11 14:34
不錯 資料很全面
作者: 哈哈大豌豆    時間: 2020-3-17 12:23
我下載了附件為啥在電腦上打不開
作者: 周樹銘    時間: 2020-3-23 18:08
沒有找到proteus文件
作者: 周樹銘    時間: 2020-3-23 18:10
小鄭z 發(fā)表于 2020-2-27 21:49
想問下用的proteus版本是多少,可以打開工程嗎

我也是這個問題
作者: 小鄭z    時間: 2020-3-27 22:45
周樹銘 發(fā)表于 2020-3-23 18:10
我也是這個問題

8.0版本以上可以打開
作者: 51hei電控20210222    時間: 2020-4-15 13:13
太厲害了,對我有很大幫助
作者: L0919    時間: 2020-4-27 15:11
附件中沒有Proteus仿真工程文件啊?
作者: menggaoju    時間: 2020-4-28 21:43
仿真有錯誤
作者: ai3093468    時間: 2020-4-29 09:48
這是真的很不錯了

作者: 隨葉秋分    時間: 2020-5-1 12:49
打不開啊,顯示錯誤
作者: 1656340745    時間: 2020-5-4 13:56
asdfghjk456 發(fā)表于 2020-4-17 21:31
你下載了嗎,可以給我看看嗎,我沒黑幣了

可以用嗎?
作者: 1656340745    時間: 2020-5-4 14:00
哈哈大豌豆 發(fā)表于 2020-3-17 12:23
我下載了附件為啥在電腦上打不開

現(xiàn)在打開了嗎?
作者: 1934606408    時間: 2021-4-23 16:32
我覺得顯示錯誤的,可能都是文檔路徑有漢語名稱,比如你的電腦id是中文名,你重新建一個id,叫admin啥的,我覺得差不多能用了
作者: 12138007    時間: 2021-6-15 13:53
@樓主,仿真圖可以發(fā)給我下嗎?
作者: 51hei團團    時間: 2021-6-16 00:22
12138007 發(fā)表于 2021-6-15 13:53
@樓主,仿真圖可以發(fā)給我下嗎?

自己去下載吧, 壓縮包里面的New Project.pdsprj就是仿真工程文件,用Proteus8.8即可打開
作者: Ming305    時間: 2021-6-18 10:55
很有參考價值,謝謝樓主了
作者: 1-1..    時間: 2021-6-25 12:44
樓主,為什么用這個程序會有一個警告啊

1.png (23.22 KB, 下載次數(shù): 133)

1.png

作者: Lx0720    時間: 2022-4-7 11:20
lequsshow 發(fā)表于 2019-8-22 16:05
深受啟發(fā),學習了,用Proteus8.8打開的效果如下:

很有用,對本設計很有幫助
作者: chenqi369    時間: 2022-4-12 14:37
大佬,請問這個溫濕度傳感器和二氧化碳傳感器是什么啊?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产欧美二区 | 国产精品大片 | 国产日韩欧美91 | 国产一区二| 九色在线视频 | 亚洲久久在线 | 九色 在线| 精品自拍视频 | 久久不卡视频 | 91精品国产91久久久久久不卞 | 亚洲精品九九 | 久久久久无码国产精品一区 | 欧美日韩成人 | 精品久久久久一区二区国产 | 亚洲在线一区 | 国产在线中文字幕 | 亚洲视频中文字幕 | 亚洲综合第一页 | 国产成人精品一区二区三区四区 | 久久高清| 7777在线视频| 少妇精品久久久久久久久久 | 一级做a爰片性色毛片 | h视频亚洲 | 欧美日韩在线视频一区 | 国产精品久久久久久久久久久久久 | 欧美一级小视频 | 日本久久久一区二区三区 | 国产 欧美 日韩 一区 | 中文字幕亚洲一区二区va在线 | 91精品国模一区二区三区 | 在线成人免费视频 | 国产乱码久久久久久 | 中文字幕不卡一区 | 日韩欧美在线视频播放 | 一级在线毛片 | 久久久久网站 | a精品视频 | 中文字幕国产精品 | 亚洲欧美综合精品久久成人 | 午夜视频大全 |