|
51單片機(jī)風(fēng)速檢測電路原理圖如下:
1.png (44.21 KB, 下載次數(shù): 44)
下載附件
2023-8-4 16:41 上傳
單片機(jī)源程序如下:
- #include"main.h"
- uchar dat1[3]; //接收緩存
- extern uchar dat[3];//風(fēng)速上限,下限,初始化標(biāo)記
- uchar fs=0; //風(fēng)速默認(rèn) km/h
- sbit set=P1^2; //設(shè)置
- sbit yw=P1^3; //移位
- sbit add=P1^4; //+
- sbit cut=P1^5; //-
- sbit change=P3^7; //切換
- sbit red=P1^0;sbit green=P1^1;//超限指示燈,上限,下限
- bit flag1=0; //默認(rèn) 0(km/h) 1(m/s)
- uchar dengji=0;
- uchar code word2[16]= {"***Anemometer***"};//開機(jī)界面
- uchar code word11[16]={"Wind= m/s L00"};//m/s
- uchar code word12[16]={"Wind= km/h L00"};//km/h
- uchar code word1[16]= {" Wind = km/h "};//km/h 設(shè)置界面
- uchar code hehe[16]= {"Wind upper limit"};//設(shè)置風(fēng)速上限界面
- uchar code haha[16]= {"Wind lower limit"};//設(shè)置風(fēng)速下限界面
- //======================================ms級延時(shí)函數(shù)=================================
- void delay1m(uint x)
- {
- uint k,j;
- for(k=0;k<x;k++) //連數(shù)x次,約 x ms
- for(j=0;j<120;j++); //數(shù)120 次,約1 ms
- }
- //================================定時(shí)器0/1初始化函數(shù)================================
- void uart_init()
- {
- TMOD=0x20; //定時(shí)器1工作于方式2,八位自動重裝
- TR1=1;
- TH1=0xfd;TL1=0xfd; //波特率9600
- SCON=0x50; //串口工作于方式1,10位uart
- ES=EA=1; //開串口中斷,總中斷,串口中斷優(yōu)先
- }
- /**************************開機(jī)初始化保存的數(shù)據(jù)*****************/
- void init_eeprom()
- {
- read(0x20);read(0x22);read(0x24);//先讀
- if(dat[2]!=22) //新的單片機(jī)初始單片機(jī)內(nèi)部eeprom
- {
- dat[0]= 20; //初始上限
- dat[1]= 3; //初始下限
- dat[2]=22;
- EA=0;
- eraze(0x20);delay1m(5);write(0x20);delay1m(5);//保存上限
- eraze(0x22);delay1m(5);write(0x22);delay1m(5);//保存下限
- eraze(0x24);delay1m(5);write(0x24);delay1m(5);//保存標(biāo)記數(shù)據(jù)
- EA=1;
- }
- }
- //================================主函數(shù)=============================================
- void main()
- {
- uint i;
- uart_init();
- init_1602();
- delay1m(100); //延時(shí)等待1602穩(wěn)定
- init_eeprom();
- while(1)
- {
- i++;if(i>4000)//動態(tài)延時(shí)讀取溫濕度值
- {
- i=0;EA=0;SBUF=0xaa;while(!TI);TI=0;EA=1; //間隔發(fā)送查詢指令
- }
- if(!change)//切換單位顯示
- {
- delay1m(10);
- if(!change)
- {
- flag1 = ~flag1;
- if(flag1==0)//顯示km/h 等級
- {
- w_string(0xc0,word12);
- }
- else if(flag1==1)//顯示m/s
- {
- w_string(0xc0,word11);
- }
- }
- while(!change); //等待按鍵彈起
- }
- key_wind_up_down(); //風(fēng)速上限調(diào)整
- }
- }
- //=======================================風(fēng)速上限,下限調(diào)整函數(shù)================================
- void key_wind_up_down()
- {
- uchar dz[3]={0xc8,0xc9,0xca};//風(fēng)速上下限數(shù)據(jù)在1602上顯示的地址
- uchar wei; //需要調(diào)整的位
- uchar buf[3];//風(fēng)速上限緩存
- uint counter;//用于產(chǎn)生閃爍效果
- if(!set)
- {
- delay1m(10);
- if(!set)//進(jìn)入風(fēng)速上限設(shè)置
- {
- while(!set);
- red=green=1;wei=0;
- buf[0]=dat[0]/100;
- buf[1]=dat[0]/10%10;
- buf[2]=dat[0]%10;//當(dāng)前風(fēng)速上限拆分后賦值給buf[]
- w_string(0x80,hehe); //"Wind upper limit"
- w_string(0xc0,word1); //" Wind = 000km/h "
- do
- {
- counter++;if(counter>4000){counter=0;}//清零
- if(counter>2000){write_cmd(dz[wei]);write_dat(0x20);}//顯示空格
- if(counter<=2000)//顯示數(shù)據(jù)
- {
- fs_display(0xc8,buf[0]+'0',buf[1]+'0',buf[2]+'0');//123km/h
- }
- if(!yw)//按下yw,調(diào)整右移
- {
- delay1m(10);
- if(!yw)
- {
- while(!yw);
- wei++;if(wei>2){wei=0;}
- }
- }
- if(!add)//加1
- {
- delay1m(10);
- if(!add)
- {
- while(!add);
- buf[wei]++;if(buf[wei]>9){buf[wei]=9;}
- }
- }
- if(!cut)//減1
- {
- delay1m(10);
- if(!cut)
- {
- while(!cut);
- buf[wei]--;if(buf[wei]==0xff){buf[wei]=0;}
- }
- }
- if((buf[0]*100+buf[1]*10+buf[2])<=dat[1]) //保證上限大于下限
- {
- dat[0]=dat[1]+1;
- buf[0]=dat[0]/100;
- buf[1]=dat[0]/10%10;
- buf[2]=dat[0]%10;
- }
- }while(set);//按下set設(shè)置確定
- delay1m(100);while(!set);//等待彈起
-
- dat[0]=buf[0]*100+buf[1]*10+buf[2];
- EA=0;
- eraze(0x20);delay1m(5);write(0x20);delay1m(5);//保存上限
- EA=1;
- //=====================================下限設(shè)置=============================================
- red=green=1;wei=0;
- buf[0]=dat[1]/100;
- buf[1]=dat[1]/10%10;
- buf[2]=dat[1]%10;//當(dāng)前風(fēng)速下限拆分后賦值給buf[]
- w_string(0x80,haha); //"Wind Lower limit"
- w_string(0xc0,word1); //" Wind = 000km/h "
- do
- {
- counter++;if(counter>4000){counter=0;}//清零
- if(counter>2000){write_cmd(dz[wei]);write_dat(0x20);}//顯示空格
- if(counter<=2000)//顯示數(shù)據(jù)
- {
- fs_display(0xc8,buf[0]+'0',buf[1]+'0',buf[2]+'0');//123km/h
- }
- if(!yw)//按下yw,調(diào)整右移
- {
- delay1m(10);
- if(!yw)
- {
- while(!yw);
- wei++;if(wei>2){wei=0;}
- }
- }
- if(!add)//加1
- {
- delay1m(10);
- if(!add)
- {
- while(!add);
- buf[wei]++;if(buf[wei]>9){buf[wei]=9;}
- }
- }
- if(!cut)//減1
- {
- delay1m(10);
- if(!cut)
- {
- while(!cut);
- buf[wei]--;if(buf[wei]==0xff){buf[wei]=0;}
- }
- }
- if((buf[0]*100+buf[1]*10+buf[2])>=dat[0])//保證下限小于上限
- {
- dat[1]=dat[0]-1;
- buf[0]=dat[1]/100;
- buf[1]=dat[1]/10%10;
- buf[2]=dat[1]%10;
- }
- }while(set);//按下set設(shè)置確定
- delay1m(100);while(!set);//等待彈起
-
- dat[1]=buf[0]*100+buf[1]*10+buf[2];
- EA=0;eraze(0x22);delay1m(5);write(0x22);delay1m(5);EA=1;//保存上限
-
- if(flag1==0)//顯示km/h
- {
- w_string(0xc0,word12);
- }
- else if(flag1==1)//顯示m/s
- {
- w_string(0xc0,word11);
- }
- w_string(0x80,word2);
- }
- }
- }
- //===================================================================================
- void uart_interrupt()interrupt 4
- {
- while(!RI);RI=0;dat1[0]=SBUF;//接收頭字節(jié)
- if(dat1[0]==0xbb)
- {
- while(!RI);RI=0;dat1[1]=SBUF; //1#風(fēng)速值
- while(!RI);RI=0;dat1[2]=SBUF; //2#風(fēng)速值
- }
- if(dat1[1]==0x00)fs=dat1[2]; //1#或者2#傳感器只要有一個(gè)在線就可以
- else fs=dat1[1];
- //==================================報(bào)警判斷===============================================
- if(fs>dat[0]){red=0;green=1;}
- else if(fs<dat[1]){green=0;red=1;}
- else if((fs<=dat[0])&&(fs>=dat[1])){red=1;green=1;}
- //==================================等級判斷==============================================
- if(fs<1)dengji=0;
- else if((fs>=1)&&(fs<=5))dengji=1;
- else if((fs>=6)&&(fs<=11))dengji=2;
- else if((fs>=12)&&(fs<=19))dengji=3;
- else if((fs>=20)&&(fs<=28))dengji=4;
- else if((fs>=29)&&(fs<=38))dengji=5;
- else if((fs>=39)&&(fs<=49))dengji=6;
- else if((fs>=50)&&(fs<=61))dengji=7;
- else if((fs>=62)&&(fs<=74))dengji=8;
- else if((fs>=75)&&(fs<=88))dengji=9;
- else if((fs>=89)&&(fs<=102))dengji=10;
- else if((fs>=103)&&(fs<=117))dengji=11;
- else if((fs>=118)&&(fs<=133))dengji=12;
- else if((fs>=134)&&(fs<=149))dengji=13;
- else if((fs>=150)&&(fs<=166))dengji=14;
- else if((fs>=167)&&(fs<=183))dengji=15;
- else if((fs>=184)&&(fs<=201))dengji=16;
- else if((fs>=202)&&(fs<=220))dengji=17;
- //=================================================================================
- if(flag1==0){} //km/h
- else if(flag1==1) //m/s
- {
- fs=((float)fs/3.6)+0.5;
- }
- //=================================================================================
- if(fs/100==0)
- {
- write_cmd(0xc0+5);write_dat(0x20);//最高位為0,顯示空
- }
- else
- {
- write_cmd(0xc0+5);write_dat(fs/100+0x30);
- }
- if((fs/100==0)&&(fs/10%10==0)) //最高位為0,次高位也為0,顯示空
- {
- write_cmd(0xc0+6);write_dat(0x20);
- }
- else
- {
- write_cmd(0xc0+6);write_dat(fs/10%10+0x30);
- }
- write_cmd(0xc0+7);write_dat(fs%10+0x30);//最低位顯示
- //=================================顯示等級================================
- write_cmd(0xc0+13);write_dat('L');
- if(dengji<10){write_cmd(0xc0+14);write_dat(0x20);} //等級十位,顯示空
- else {write_cmd(0xc0+14);write_dat(dengji/10+0x30);}
- write_dat(dengji%10+0x30); //顯示等級最低位
- }
復(fù)制代碼
所有資料51hei附件下載:
|
-
-
3 實(shí)物圖.zip
2023-8-4 08:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
122.68 KB, 下載次數(shù): 28, 下載積分: 黑幣 -5
-
-
2 程序.zip
2023-8-4 08:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
60.14 KB, 下載次數(shù): 34, 下載積分: 黑幣 -5
-
-
1 電路圖.zip
2023-8-4 08:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
278.26 KB, 下載次數(shù): 32, 下載積分: 黑幣 -5
-
-
4 元件清單.zip
2023-8-4 08:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
6.79 KB, 下載次數(shù): 28, 下載積分: 黑幣 -5
評分
-
查看全部評分
|