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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+VB上位機溫濕度檢測制作 附源程序

  [復制鏈接]
跳轉到指定樓層
樓主
休息時間嘗試用VB作為上位機與單片機進行通信,自己動手做了板子,效果還行,分享下。

仿真圖附上

代碼因為是上位機和下位機的,直接壓縮放上來了。
單片機源程序如下:
  1. #include <reg52.h>                                   // 頭文件包含
  2. #include <intrins.h>                       

  3. #define uchar unsigned char        // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int        // 以后unsigned int 就可以用uint 代替

  5. sbit Buzzer_P  = P1^0;            // 蜂鳴器
  6. sbit DHT11_P   = P1^1;                         // 溫濕度傳感器DHT11數據接入
  7. sbit LcdRs_P   = P2^7;             // 1602液晶的RS管腳      
  8. sbit LcdRw_P   = P2^6;            // 1602液晶的RW管腳
  9. sbit LcdEn_P   = P2^5;            // 1602液晶的EN管腳

  10. uchar temp;                                                                // 保存溫度
  11. uchar humi;                                                                  // 保存濕度


  12. /*********************************************************/
  13. // 毫秒級的延時函數,time是要延時的毫秒數
  14. /*********************************************************/
  15. void DelayMs(uint time)
  16. {
  17.         uint i,j;
  18.         for(i=0;i<time;i++)
  19.                 for(j=0;j<112;j++);
  20. }


  21. /*********************************************************/
  22. // 1602液晶寫命令函數,cmd就是要寫入的命令
  23. /*********************************************************/
  24. void LcdWriteCmd(uchar cmd)
  25. {
  26.         LcdRs_P = 0;
  27.         LcdRw_P = 0;
  28.         LcdEn_P = 0;
  29.         P0=cmd;
  30.         DelayMs(2);
  31.         LcdEn_P = 1;   
  32.         DelayMs(2);
  33.         LcdEn_P = 0;       
  34. }


  35. /*********************************************************/
  36. // 1602液晶寫數據函數,dat就是要寫入的數據
  37. /*********************************************************/
  38. void LcdWriteData(uchar dat)
  39. {
  40.         LcdRs_P = 1;
  41.         LcdRw_P = 0;
  42.         LcdEn_P = 0;
  43.         P0=dat;
  44.         DelayMs(2);
  45.         LcdEn_P = 1;   
  46.         DelayMs(2);
  47.         LcdEn_P = 0;
  48. }


  49. /*********************************************************/
  50. // 1602液晶初始化函數
  51. /*********************************************************/
  52. void LcdInit()
  53. {
  54.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點陣,8位數據口
  55.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標
  56.         LcdWriteCmd(0x06);        // 地址加1,當寫入數據后光標右移
  57.         LcdWriteCmd(0x01);        // 清屏
  58. }


  59. /*********************************************************/
  60. // 液晶光標定位函數
  61. /*********************************************************/
  62. void LcdGotoXY(uchar line,uchar column)
  63. {
  64.         // 第一行
  65.         if(line==0)        
  66.                 LcdWriteCmd(0x80+column);
  67.         // 第二行
  68.         if(line==1)        
  69.                 LcdWriteCmd(0x80+0x40+column);
  70. }


  71. /*********************************************************/
  72. // 液晶輸出字符串函數
  73. /*********************************************************/
  74. void LcdPrintStr(uchar *str)
  75. {
  76.         while(*str!='\0')                                         // 判斷是否到字符串的盡頭了
  77.                 LcdWriteData(*str++);
  78. }


  79. /*********************************************************/
  80. // 液晶輸出數字
  81. /*********************************************************/
  82. void LcdPrintNum(uchar num)
  83. {
  84.         LcdWriteData(num/10+48);                // 十位
  85.         LcdWriteData(num%10+48);                 // 個位
  86. }


  87. /*********************************************************/
  88. // 液晶顯示內容的初始化
  89. /*********************************************************/
  90. void LcdShowInit()
  91. {
  92.         LcdGotoXY(0,0);                                                                                // 光標定位
  93.         LcdPrintStr("  DHT11 System  ");        // 第0行顯示的內容
  94.         LcdGotoXY(1,0);                                                                           // 光標定位       
  95.         LcdPrintStr("T:   C   H:  %RH");        // 第1行顯示的內容
  96.         LcdGotoXY(1,4);                                                                                // 溫度單位攝氏度上面的圓圈符號
  97.         LcdWriteData(0xdf);       
  98. }


  99. /*********************************************************/
  100. // 10us級延時程序
  101. /*********************************************************/
  102. void Delay10us()
  103. {
  104.         _nop_();        // 執行一條指令,延時1微秒
  105.         _nop_();
  106.         _nop_();
  107.         _nop_();
  108.         _nop_();
  109.         _nop_();
  110.         _nop_();
  111.         _nop_();
  112.         _nop_();
  113.         _nop_();
  114. }


  115. /*********************************************************/
  116. // 讀取DHT11單總線上的一個字節
  117. /*********************************************************/
  118. uchar DhtReadByte(void)
  119. {   
  120.         bit bit_i;
  121.         uchar j;
  122.         uchar dat=0;

  123.         for(j=0;j<8;j++)   
  124.         {
  125.                 while(!DHT11_P);        // 等待低電平結束       
  126.                 Delay10us();                        // 延時
  127.                 Delay10us();
  128.                 Delay10us();
  129.                 if(DHT11_P==1)                // 判斷數據線是高電平還是低電平
  130.                 {
  131.                         bit_i=1;
  132.                         while(DHT11_P);
  133.                 }
  134.                 else
  135.                 {
  136.                         bit_i=0;
  137.                 }
  138.                 dat<<=1;                                   // 將該位移位保存到dat變量中
  139.                 dat|=bit_i;   
  140.         }
  141.     return(dat);  
  142. }


  143. /*********************************************************/
  144. // 讀取DHT11的一幀數據,濕高、濕低(0)、溫高、溫低(0)、校驗碼
  145. /*********************************************************/
  146. void ReadDhtData()
  147. {             
  148.         uchar HumiHig;                // 濕度高檢測值
  149.         uchar HumiLow;          // 濕度低檢測值
  150.         uchar TemHig;                        // 溫度高檢測值
  151.         uchar TemLow;                        // 溫度低檢測值
  152.     uchar check;                // 校驗字節
  153.        
  154.         DHT11_P=0;                                // 主機拉低20ms
  155.         DelayMs(20);
  156.         DHT11_P=1;                                // DATA總線由上拉電阻拉高 主機延時40us               

  157.         Delay10us();                         // 延時等待30us
  158.         Delay10us();
  159.         Delay10us();

  160.         while(!DHT11_P);        // 等待DHT的低電平結束
  161.         while(DHT11_P);                // 等待DHT的高電平結束

  162.         //進入數據接收狀態
  163.         HumiHig = DhtReadByte();         // 濕度高8位
  164.         HumiLow = DhtReadByte();         // 濕度低8為,總為0
  165.         TemHig  = DhtReadByte();         // 溫度高8位
  166.         TemLow  = DhtReadByte();         // 溫度低8為,總為0
  167.         check   = DhtReadByte();        // 8位校驗碼,其值等于讀出的四個字節相加之和的低8位

  168.         while(!DHT11_P);
  169.         DHT11_P=1;                                                                // 拉高總線

  170.         if(check==HumiHig + HumiLow + TemHig + TemLow)                 // 如果收到的數據無誤
  171.         {
  172.                 temp=TemHig;                         // 將溫度的檢測結果賦值給全局變量temp
  173.                 humi=HumiHig;                        // 將濕度的檢測結果賦值給全局變量humi
  174.         }
  175. }


  176. /*********************************************************/
  177. // 串口初始化
  178. /*********************************************************/
  179. void UartInit()
  180. {
  181.         SCON = 0x50;        // 配置串口寄存器
  182.         TMOD = 0x20;        // 配置定時器寄存器
  183.         TH1  = 0xfd;        // 計算波特率的值為9600
  184.         TL1  = 0xfd;        // 計算波特率的值為9600
  185.         EA   = 1;                        // 打開總中斷
  186.         ES   = 1;                        // 打開串口中斷
  187.         TR1  = 1;                        // 啟動定時器
  188. }



  189. /*********************************************************/
  190. // 串口發送數據函數
  191. /*********************************************************/
  192. void UartSendNum(uchar num)
  193. {
  194.         ES=0;                                                        // 發送過程關閉串口中斷
  195.         SBUF=num/10+48;                // 十位
  196.         while(!TI);
  197.         TI=0;
  198.         SBUF=num%10+48;          // 個位
  199.         while(!TI);
  200.         TI=0;
  201.         ES=1;                                                        // 發送結束打開串口中斷
  202. }       


  203. /*********************************************************/
  204. // 主函數
  205. /*********************************************************/
  206. void main(void)
  207. {
  208.         UartInit();                                                // 串口初始化
  209.         LcdInit();                                                // 液晶功能的初始化                       
  210.         LcdShowInit();                                 // 液晶顯示的初始化

  211.         DelayMs(1200);                                // 上電后等一下再開始讀取
  212.        
  213.         while(1)
  214.         {
  215.                  EA=0;                                                                // 讀取溫濕度數值前,關閉總中斷
  216.                 ReadDhtData();                        // 讀取溫濕度數據
  217.                 EA=1;                                                                // 讀取溫濕度數值后,開啟總中斷
  218.        
  219.                 LcdGotoXY(1,2);                         // 定位到要顯示溫度的地方
  220.                 LcdPrintNum(temp);        // 顯示溫度值
  221.                 LcdGotoXY(1,11);                // 定位到要顯示濕度的地方
  222.                 LcdPrintNum(humi);        // 顯示濕度值

  223.                 UartSendNum(temp);        // 串口發送溫度
  224.                 UartSendNum(humi);        // 串口發送濕度

  225.                 DelayMs(2200);                  // 進行延時,可實現不同的采集頻率
  226.         }
  227. }


  228. /*********************************************************/
  229. // 串口中斷服務程序
  230. /*********************************************************/
  231. void UartInt(void) interrupt 4
  232. {
  233.         uchar dat;
  234.        
  235.         if(RI==1)                                                        // 是否收到串口數據
  236.         {
  237.                 RI=0;
  238.                 dat=SBUF;                                                // 把串口收到的數據保存在dat變量里
  239.                
  240.                 if(dat==0x01)                                // 如果串口收到的值是0x01
  241.                         Buzzer_P=0;                                // 那么打開蜂鳴器
  242.                 if(dat==0x02)                                // 如果串口收到的值是0x02
  243.                         Buzzer_P=1;                                // 那么關閉蜂鳴器
  244.         }
  245. }
復制代碼


上位機VB代碼: 上位機程序.rar (69.67 KB, 下載次數: 179)
下位機單片機代碼: 下位機程序.rar (33.02 KB, 下載次數: 137)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:824799 發表于 2020-11-5 12:31 | 只看該作者
有仿真圖嗎proteus的
回復

使用道具 舉報

板凳
ID:468240 發表于 2020-11-10 21:49 | 只看該作者
樓主,有原理圖嗎?PDF也可以
回復

使用道具 舉報

地板
ID:900757 發表于 2021-4-5 12:17 來自手機 | 只看該作者
樓主你好,我再調試的時候遇到找不到串口,這個是什么原因呢?能幫忙解答一下嗎
回復

使用道具 舉報

5#
ID:900757 發表于 2021-4-5 17:45 來自手機 | 只看該作者
我按照你的思路和方法做好的仿真,但是VB上數據接收不了單片機傳過來的數據,不知道那一步錯了,我用串口發送是可以到VB是沒問題的
回復

使用道具 舉報

6#
ID:915955 發表于 2021-5-17 22:48 | 只看該作者
兄弟你現在這個弄好了嗎,VB上可以接收到單片機的數據了嗎
回復

使用道具 舉報

7#
ID:915955 發表于 2021-5-17 22:55 | 只看該作者
老李家呀 發表于 2021-4-5 17:45
我按照你的思路和方法做好的仿真,但是VB上數據接收不了單片機傳過來的數據,不知道那一步錯了,我用串口發 ...

兄弟現在搞定了嗎
回復

使用道具 舉報

8#
ID:320250 發表于 2022-5-15 21:53 | 只看該作者
老李家呀 發表于 2021-4-5 12:17
樓主你好,我再調試的時候遇到找不到串口,這個是什么原因呢?能幫忙解答一下嗎

要安裝好控件
回復

使用道具 舉報

9#
ID:1029268 發表于 2022-5-24 15:58 | 只看該作者
你好,請問可以幫我看看程序嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区免费看 | 日本一道本视频 | 丁香久久 | 中文字幕av在线播放 | 中日av| 亚洲精品一区二区三区 | 亚洲欧美综合 | 中文字幕精品一区二区三区在线 | 欧美一区二区 | 91精品国产一区二区三区动漫 | 国产精品国产精品国产专区不片 | 精品久久香蕉国产线看观看亚洲 | 国产日韩精品在线 | 蜜月va乱码一区二区三区 | 国产不卡一区 | 毛片av免费在线观看 | 黄片毛片免费观看 | 国产美女精品视频 | 蜜月aⅴ国产精品 | 网络毛片| 成人免费观看视频 | 天堂中文资源在线 | 国产精品久久久久一区二区三区 | 精品毛片在线观看 | 精品九九九 | 少妇精品久久久久久久久久 | 国产亚洲精品久久久久动 | 国产亚洲一区二区三区 | 亚洲国产成人精品女人久久久 | 成人精品毛片国产亚洲av十九禁 | 99免费视频| 韩日中文字幕 | 九九热在线免费视频 | 色约约视频| 日韩二区 | 六月色婷| 91激情电影 | 久久久国产精品一区 | 国产亚洲成av人在线观看导航 | 亚洲免费在线观看视频 | 国产视频一区二区在线观看 |