找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2209|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)風(fēng)速檢測程序和電路原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
51單片機(jī)風(fēng)速檢測電路原理圖如下:


單片機(jī)源程序如下:
  1. #include"main.h"
  2. uchar dat1[3];      //接收緩存
  3. extern uchar dat[3];//風(fēng)速上限,下限,初始化標(biāo)記
  4. uchar fs=0;         //風(fēng)速默認(rèn)   km/h
  5. sbit set=P1^2;      //設(shè)置
  6. sbit yw=P1^3;       //移位
  7. sbit add=P1^4;      //+
  8. sbit cut=P1^5;      //-
  9. sbit change=P3^7;   //切換
  10. sbit red=P1^0;sbit green=P1^1;//超限指示燈,上限,下限
  11. bit flag1=0;        //默認(rèn) 0(km/h)  1(m/s)
  12. uchar dengji=0;

  13. uchar code word2[16]= {"***Anemometer***"};//開機(jī)界面
  14. uchar code word11[16]={"Wind=   m/s  L00"};//m/s
  15. uchar code word12[16]={"Wind=   km/h L00"};//km/h
  16. uchar code word1[16]= {" Wind =    km/h "};//km/h  設(shè)置界面
  17. uchar code hehe[16]=  {"Wind upper limit"};//設(shè)置風(fēng)速上限界面
  18. uchar code haha[16]=  {"Wind lower limit"};//設(shè)置風(fēng)速下限界面

  19. //======================================ms級延時(shí)函數(shù)=================================
  20. void delay1m(uint x)
  21. {
  22.   uint k,j;
  23.   for(k=0;k<x;k++)      //連數(shù)x次,約 x ms
  24.       for(j=0;j<120;j++);   //數(shù)120 次,約1 ms
  25. }
  26. //================================定時(shí)器0/1初始化函數(shù)================================
  27. void uart_init()
  28. {
  29.   TMOD=0x20;          //定時(shí)器1工作于方式2,八位自動重裝
  30.   TR1=1;
  31.         TH1=0xfd;TL1=0xfd;  //波特率9600
  32.         SCON=0x50;          //串口工作于方式1,10位uart       
  33.         ES=EA=1;            //開串口中斷,總中斷,串口中斷優(yōu)先
  34. }
  35. /**************************開機(jī)初始化保存的數(shù)據(jù)*****************/
  36. void init_eeprom()
  37. {
  38.         read(0x20);read(0x22);read(0x24);//先讀
  39.         if(dat[2]!=22)                //新的單片機(jī)初始單片機(jī)內(nèi)部eeprom
  40.         {
  41.                 dat[0]= 20;     //初始上限
  42.                 dat[1]= 3;      //初始下限
  43.                 dat[2]=22;
  44.                 EA=0;
  45.                 eraze(0x20);delay1m(5);write(0x20);delay1m(5);//保存上限
  46.                 eraze(0x22);delay1m(5);write(0x22);delay1m(5);//保存下限
  47.                 eraze(0x24);delay1m(5);write(0x24);delay1m(5);//保存標(biāo)記數(shù)據(jù)
  48.                 EA=1;
  49.         }       
  50. }
  51. //================================主函數(shù)=============================================
  52. void main()
  53. {
  54.         uint i;
  55.         uart_init();
  56.         init_1602();  
  57.         delay1m(100); //延時(shí)等待1602穩(wěn)定
  58.         init_eeprom();
  59.         while(1)
  60.         {
  61.                 i++;if(i>4000)//動態(tài)延時(shí)讀取溫濕度值
  62.     {
  63.       i=0;EA=0;SBUF=0xaa;while(!TI);TI=0;EA=1;   //間隔發(fā)送查詢指令       
  64.     }       
  65.                 if(!change)//切換單位顯示
  66.                 {
  67.                         delay1m(10);
  68.                         if(!change)
  69.                         {
  70.                                 flag1 = ~flag1;
  71.                                 if(flag1==0)//顯示km/h  等級
  72.                                 {
  73.                                         w_string(0xc0,word12);
  74.                                 }
  75.                                 else if(flag1==1)//顯示m/s
  76.                                 {
  77.                                         w_string(0xc0,word11);
  78.                                 }
  79.                         }
  80.                         while(!change);   //等待按鍵彈起
  81.                 }               
  82.                 key_wind_up_down();   //風(fēng)速上限調(diào)整
  83.         }
  84. }
  85. //=======================================風(fēng)速上限,下限調(diào)整函數(shù)================================
  86. void key_wind_up_down()
  87. {
  88.         uchar dz[3]={0xc8,0xc9,0xca};//風(fēng)速上下限數(shù)據(jù)在1602上顯示的地址
  89.         uchar wei;   //需要調(diào)整的位
  90.         uchar buf[3];//風(fēng)速上限緩存
  91.         uint counter;//用于產(chǎn)生閃爍效果
  92.         if(!set)
  93.         {
  94.                 delay1m(10);
  95.                 if(!set)//進(jìn)入風(fēng)速上限設(shè)置
  96.                 {
  97.                         while(!set);
  98.                         red=green=1;wei=0;
  99.                         buf[0]=dat[0]/100;
  100.                         buf[1]=dat[0]/10%10;
  101.                         buf[2]=dat[0]%10;//當(dāng)前風(fēng)速上限拆分后賦值給buf[]
  102.                         w_string(0x80,hehe);  //"Wind upper limit"
  103.                         w_string(0xc0,word1); //" Wind = 000km/h "
  104.                         do
  105.                         {   
  106.                                 counter++;if(counter>4000){counter=0;}//清零
  107.                                 if(counter>2000){write_cmd(dz[wei]);write_dat(0x20);}//顯示空格
  108.                                 if(counter<=2000)//顯示數(shù)據(jù)
  109.                                 {  
  110.                                         fs_display(0xc8,buf[0]+'0',buf[1]+'0',buf[2]+'0');//123km/h
  111.         }
  112.                                 if(!yw)//按下yw,調(diào)整右移
  113.                                 {
  114.                                         delay1m(10);
  115.                                         if(!yw)
  116.                                         {
  117.                                                 while(!yw);
  118.                                                 wei++;if(wei>2){wei=0;}
  119.                                         }
  120.                                 }
  121.                                 if(!add)//加1
  122.                                 {
  123.                                         delay1m(10);
  124.                                         if(!add)
  125.                                         {
  126.                                                 while(!add);
  127.                                                 buf[wei]++;if(buf[wei]>9){buf[wei]=9;}
  128.                                         }
  129.                                 }
  130.                                 if(!cut)//減1
  131.                                 {
  132.                                         delay1m(10);
  133.                                         if(!cut)
  134.                                         {
  135.                                                 while(!cut);
  136.                                                 buf[wei]--;if(buf[wei]==0xff){buf[wei]=0;}
  137.                                         }
  138.                                 }
  139.                                 if((buf[0]*100+buf[1]*10+buf[2])<=dat[1])  //保證上限大于下限
  140.                                 {
  141.                                         dat[0]=dat[1]+1;
  142.                                         buf[0]=dat[0]/100;
  143.                             buf[1]=dat[0]/10%10;
  144.                             buf[2]=dat[0]%10;
  145.                                 }
  146.                         }while(set);//按下set設(shè)置確定
  147.                         delay1m(100);while(!set);//等待彈起
  148.                        
  149.                         dat[0]=buf[0]*100+buf[1]*10+buf[2];
  150.                         EA=0;
  151.                         eraze(0x20);delay1m(5);write(0x20);delay1m(5);//保存上限
  152.                         EA=1;
  153.                         //=====================================下限設(shè)置=============================================
  154.                         red=green=1;wei=0;
  155.                         buf[0]=dat[1]/100;
  156.                         buf[1]=dat[1]/10%10;
  157.                         buf[2]=dat[1]%10;//當(dāng)前風(fēng)速下限拆分后賦值給buf[]
  158.                         w_string(0x80,haha);  //"Wind Lower limit"
  159.                         w_string(0xc0,word1); //" Wind = 000km/h "
  160.                         do
  161.                         {   
  162.                                 counter++;if(counter>4000){counter=0;}//清零
  163.                                 if(counter>2000){write_cmd(dz[wei]);write_dat(0x20);}//顯示空格
  164.                                 if(counter<=2000)//顯示數(shù)據(jù)
  165.                                 {  
  166.                                         fs_display(0xc8,buf[0]+'0',buf[1]+'0',buf[2]+'0');//123km/h
  167.         }
  168.                                 if(!yw)//按下yw,調(diào)整右移
  169.                                 {
  170.                                         delay1m(10);
  171.                                         if(!yw)
  172.                                         {
  173.                                                 while(!yw);
  174.                                                 wei++;if(wei>2){wei=0;}
  175.                                         }
  176.                                 }
  177.                                 if(!add)//加1
  178.                                 {
  179.                                         delay1m(10);
  180.                                         if(!add)
  181.                                         {
  182.                                                 while(!add);
  183.                                                 buf[wei]++;if(buf[wei]>9){buf[wei]=9;}
  184.                                         }
  185.                                 }
  186.                                 if(!cut)//減1
  187.                                 {
  188.                                         delay1m(10);
  189.                                         if(!cut)
  190.                                         {
  191.                                                 while(!cut);
  192.                                                 buf[wei]--;if(buf[wei]==0xff){buf[wei]=0;}
  193.                                         }
  194.                                 }
  195.                                 if((buf[0]*100+buf[1]*10+buf[2])>=dat[0])//保證下限小于上限
  196.                                 {
  197.                                         dat[1]=dat[0]-1;
  198.                                         buf[0]=dat[1]/100;
  199.                             buf[1]=dat[1]/10%10;
  200.                             buf[2]=dat[1]%10;
  201.                                 }
  202.                         }while(set);//按下set設(shè)置確定
  203.                         delay1m(100);while(!set);//等待彈起
  204.                        
  205.                         dat[1]=buf[0]*100+buf[1]*10+buf[2];
  206.                         EA=0;eraze(0x22);delay1m(5);write(0x22);delay1m(5);EA=1;//保存上限
  207.                        
  208.                         if(flag1==0)//顯示km/h
  209.                         {
  210.                                 w_string(0xc0,word12);
  211.                         }
  212.                         else if(flag1==1)//顯示m/s
  213.                         {
  214.                                 w_string(0xc0,word11);
  215.                         }
  216.             w_string(0x80,word2);
  217.                 }
  218.         }
  219. }  
  220. //===================================================================================
  221. void uart_interrupt()interrupt 4
  222. {
  223.         while(!RI);RI=0;dat1[0]=SBUF;//接收頭字節(jié)
  224.         if(dat1[0]==0xbb)
  225.         {
  226.                 while(!RI);RI=0;dat1[1]=SBUF;          //1#風(fēng)速值
  227.                 while(!RI);RI=0;dat1[2]=SBUF;   //2#風(fēng)速值
  228.         }
  229.         if(dat1[1]==0x00)fs=dat1[2];      //1#或者2#傳感器只要有一個(gè)在線就可以
  230.         else fs=dat1[1];
  231.         //==================================報(bào)警判斷===============================================
  232.         if(fs>dat[0]){red=0;green=1;}
  233.         else if(fs<dat[1]){green=0;red=1;}
  234.         else if((fs<=dat[0])&&(fs>=dat[1])){red=1;green=1;}
  235.         //==================================等級判斷==============================================
  236.         if(fs<1)dengji=0;
  237.         else if((fs>=1)&&(fs<=5))dengji=1;
  238.         else if((fs>=6)&&(fs<=11))dengji=2;
  239.         else if((fs>=12)&&(fs<=19))dengji=3;
  240.         else if((fs>=20)&&(fs<=28))dengji=4;
  241.         else if((fs>=29)&&(fs<=38))dengji=5;
  242.         else if((fs>=39)&&(fs<=49))dengji=6;
  243.         else if((fs>=50)&&(fs<=61))dengji=7;
  244.         else if((fs>=62)&&(fs<=74))dengji=8;
  245.         else if((fs>=75)&&(fs<=88))dengji=9;
  246.         else if((fs>=89)&&(fs<=102))dengji=10;
  247.         else if((fs>=103)&&(fs<=117))dengji=11;
  248.         else if((fs>=118)&&(fs<=133))dengji=12;
  249.         else if((fs>=134)&&(fs<=149))dengji=13;
  250.         else if((fs>=150)&&(fs<=166))dengji=14;
  251.         else if((fs>=167)&&(fs<=183))dengji=15;
  252.         else if((fs>=184)&&(fs<=201))dengji=16;
  253.         else if((fs>=202)&&(fs<=220))dengji=17;
  254.         //=================================================================================
  255.         if(flag1==0){}    //km/h
  256.         else if(flag1==1) //m/s
  257.         {
  258.                 fs=((float)fs/3.6)+0.5;
  259.         }               
  260.         //=================================================================================
  261.         if(fs/100==0)
  262.         {
  263.                 write_cmd(0xc0+5);write_dat(0x20);//最高位為0,顯示空
  264.         }       
  265.         else
  266.         {
  267.                 write_cmd(0xc0+5);write_dat(fs/100+0x30);
  268.         }       
  269.         if((fs/100==0)&&(fs/10%10==0))     //最高位為0,次高位也為0,顯示空
  270.         {
  271.                 write_cmd(0xc0+6);write_dat(0x20);
  272.         }       
  273.         else
  274.         {
  275.                 write_cmd(0xc0+6);write_dat(fs/10%10+0x30);
  276.         }
  277.         write_cmd(0xc0+7);write_dat(fs%10+0x30);//最低位顯示
  278.         //=================================顯示等級================================
  279.         write_cmd(0xc0+13);write_dat('L');
  280.         if(dengji<10){write_cmd(0xc0+14);write_dat(0x20);}  //等級十位,顯示空
  281.         else {write_cmd(0xc0+14);write_dat(dengji/10+0x30);}
  282.         write_dat(dengji%10+0x30);  //顯示等級最低位
  283. }
復(fù)制代碼

所有資料51hei附件下載:


3 實(shí)物圖.zip

122.68 KB, 下載次數(shù): 28, 下載積分: 黑幣 -5

2 程序.zip

60.14 KB, 下載次數(shù): 34, 下載積分: 黑幣 -5

1 電路圖.zip

278.26 KB, 下載次數(shù): 32, 下載積分: 黑幣 -5

4 元件清單.zip

6.79 KB, 下載次數(shù): 28, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:689425 發(fā)表于 2023-8-13 11:22 | 只看該作者
相當(dāng)實(shí)用,下載了,謝謝
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表