三杯式風(fēng)速傳感器實(shí)驗(yàn)報(bào)告 一、實(shí)驗(yàn)?zāi)康?/font>
1.掌握三杯式風(fēng)速傳感器的工作原理; 2.將三杯式風(fēng)速傳感器測(cè)得的風(fēng)速(風(fēng)由風(fēng)扇提供)實(shí)時(shí)顯示在液晶和上位機(jī)上; 3.進(jìn)一步掌握1602液晶的使用以及串口通訊; 4.規(guī)范C的書寫格式。 二、實(shí)驗(yàn)原理
三杯式風(fēng)速傳感器有一個(gè)測(cè)速碼盤,當(dāng)碼盤轉(zhuǎn)動(dòng)并不斷地通過(guò)三杯式風(fēng)速傳感器內(nèi)部的光電傳感器后,就會(huì)產(chǎn)生脈沖信號(hào),脈沖信號(hào)觸發(fā)單片機(jī)產(chǎn)生外部中斷0,外部中斷0對(duì)脈沖次數(shù)進(jìn)行計(jì)數(shù),定時(shí)器0中斷設(shè)定1s的時(shí)間,并獲取1s內(nèi)的脈沖次數(shù),然后通過(guò)公式:(脈沖次數(shù)*7)/80.0+0.1(注意:此處的80.0不能寫成80,否則將會(huì)丟失風(fēng)速的小數(shù)位,因?yàn)槌?0得到的是整數(shù))就可以計(jì)算出風(fēng)速,然后就可以通過(guò)單片機(jī)將風(fēng)速顯示在液晶和上位機(jī)上了。
三、實(shí)驗(yàn)步驟
1.查閱三杯式風(fēng)速傳感器的相關(guān)資料,掌握其測(cè)速原理;
2.測(cè)三杯式風(fēng)速傳感器的脈沖次數(shù)并顯示在數(shù)碼管上;
3.將風(fēng)速測(cè)出并顯示在1602液晶上;
4.將風(fēng)速測(cè)出并顯示在1602液晶和上位機(jī)上。
5.觀察實(shí)驗(yàn)現(xiàn)象,總結(jié)。
四、實(shí)驗(yàn)結(jié)果
1602液晶和上位機(jī)均能實(shí)時(shí)顯示三杯式風(fēng)速傳感器測(cè)得的風(fēng)速,且顯示一致,風(fēng)速精確到了小數(shù)點(diǎn)后兩位。
五、實(shí)驗(yàn)總結(jié)
這次實(shí)驗(yàn)剛開始測(cè)脈沖次數(shù)的時(shí)候就遇到了挫折,原因是按照文檔上的接法,將紅色線和黑色線接反了,廢了一番波折將傳感器拆開后才把線接對(duì),將脈沖次數(shù)測(cè)出來(lái)。這件事原因還是在我,不敢挑戰(zhàn)文檔的權(quán)威性,當(dāng)時(shí)要是把紅黑線的接法對(duì)調(diào)一下就不會(huì)有后面的麻煩事了(不過(guò)這也與紅色線是重新接上去的有關(guān)系,我一直懷疑它接觸不良)。脈沖次數(shù)測(cè)出來(lái)后液晶顯示很快也順利地實(shí)現(xiàn)了,不過(guò)到液晶與上位機(jī)同時(shí)顯示的時(shí)候,出現(xiàn)了問(wèn)題,究其原因是我把顯示寫在了串口中斷里,但是沒(méi)有加標(biāo)志位,串口中斷接收不到脈沖次數(shù),所以風(fēng)速一直顯示是0,不過(guò)在加了標(biāo)志位后,這個(gè)問(wèn)題順利解決了。另外將顯示寫在主程序里通過(guò)查詢方式也實(shí)現(xiàn)了液晶和上位機(jī)的顯示。至于為什么沒(méi)有同時(shí)將脈沖次數(shù)顯示在數(shù)碼管上,這是因?yàn)閿?shù)碼管的位選端P2口和液晶要用到的P2^0,P2^1和P2^2口發(fā)生了沖突(這里要吐槽一下,這個(gè)單片機(jī)沒(méi)有鎖存器)。
附錄1 數(shù)碼管顯示風(fēng)速傳感器脈沖次數(shù)的程序 單片機(jī)源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar i;
- uint f,num;
- uchar code table[]=
- {
- 0x28,0x7e,0xa2,0x62,
- 0x74,0x61,0x21,0x7a,
- 0x20,0x60
- };//數(shù)碼表(0-9)
- void delay(uint z)//1ms延時(shí)函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display()
- {
- uchar wan,qian,bai,shi,ge;
- wan=num/10000;//獲取計(jì)數(shù)值的萬(wàn)位
- qian=num%10000/1000;//獲取計(jì)數(shù)值的千位
- bai=num%10000%1000/100;//獲取計(jì)數(shù)值的百位
- shi=num%10000%1000%100/10;//獲取計(jì)數(shù)值的十位
- ge=num%10000%1000%100%10;//獲取計(jì)數(shù)值的個(gè)位
- P2=0xfe;
- P0=table[wan];
- delay(2);
- P2=0xfd;
- P0=table[qian];
- delay(2);
- P2=0xfb;
- P0=table[bai];
- delay(2);
- P2=0xf7;
- P0=table[shi];
- delay(2);
- P2=0xef;
- P0=table[ge];
- delay(2);
- }
- void init()//初始化子程序
- {
- TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1
- TH0=(65536-50000)/256; //定時(shí)器0裝初值
- TL0=(65536-50000)%256; //同上
- IT0=1;//外部中斷0為跳變沿觸發(fā)方式
- EA=1;//打開總中斷
- EX0=1;//打開外部中斷0
- ET0=1;//打開定時(shí)器0中斷
- TR0=1;//打開定時(shí)器0
- }
- void main()
- {
- init();
- while(1)
- {
- display();
- }
- }
- void exter0() interrupt 0 //外部中斷0子程序
- {
- f++; //脈沖計(jì)數(shù)
- }
- void timer0() interrupt 1 //定時(shí)器0中斷子程序
- {
- TH0=(65536-50000)/256; //定時(shí)器0重裝初值
- TL0=(65536-50000)%256; //同上
- i++;
- if(i==20) //定時(shí)器0計(jì)時(shí)1s
- {
- num=f;
- i=0;
- f=0;
- }
- }
復(fù)制代碼
附錄2 液晶上顯示風(fēng)速的程序
附錄3 液晶和上位機(jī)同時(shí)顯示風(fēng)速的程序
單片機(jī)源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar i;
- //uchar flag;//標(biāo)志位
- uint a,b,c,f,num;
- uint ws_i;
- double ws_d,ws_d1;//定義風(fēng)速的數(shù)據(jù)類型為雙精度型
- uchar code table1[]=" speed: ";
- uchar code table2[]=" . m/s ";
- uchar code table3[]="speed:";
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit EN=P2^2;
- void delay(uint z)//1ms延時(shí)函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com) //液晶寫命令子程序
- {
- RS=0;//寫入命令
- RW=0;//讀寫控制端設(shè)置為寫模式
- P0=com;//將命令送給P0口
- delay(10);
- EN=1;//將命令送給液晶顯示屏
- delay(10);
- EN=0;
- }
- void write_data(uchar dat)//液晶寫數(shù)據(jù)子程序
- {
- RS=1;//寫入數(shù)據(jù)
- RW=0;
- P0=dat;//將數(shù)據(jù)送給P0口
- delay(10);
- EN=1;//將數(shù)據(jù)送給液晶顯示屏
- delay(10);
- EN=0;
- }
- void init()//初始化子程序
- {
- write_com(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
- write_com(0x01);//清屏
- write_com(0x06);//寫一個(gè)字符后,地址指針加1
- write_com(0x0C);//設(shè)置開顯示,不顯示光標(biāo)
- write_com(0x80);//液晶顯示屏從第一行的第一個(gè)位置開始寫入字符
- for(a=0;a<16;a++)//液晶顯示屏第一行寫入" speed: "
- {
- write_data(table1[a]);
- delay(1);
- }
- write_com(0x80+0x40);//液晶顯示屏從第二行的第一個(gè)位置開始寫入字符
- for(b=0;b<16;b++)//液晶顯示屏第二行寫入" . m/s "
- {
- write_data(table2[b]);
- delay(1);
- }
- TMOD=0x21;//設(shè)置定時(shí)器0為工作方式1,定時(shí)器1為工作方式2
- TH0=(65536-50000)/256; //定時(shí)器0裝初值
- TL0=(65536-50000)%256; //同上
- TH1=0xf3;//設(shè)置波特率為2400
- TL1=0xf3;//同上
- TR1=1;//打開定時(shí)器1
- TR0=1;//打開定時(shí)器0
- IT0=1;//外部中斷0為跳變沿觸發(fā)方式
- REN=1;//允許串口接收數(shù)據(jù)
- SM0=0;//設(shè)置串口的工作方式為1
- SM1=1;//同上
- EX0=1;//打開外部中斷0
- ET0=1;//打開定時(shí)器0中斷
- EA=1;//打開總中斷
- // ES=1;//打開串口中斷
- }
- void main()
- {
- uchar shi,ge,sf,bf,shi_1,ge_1,sf_1,bf_1;
- init();
- delay(1);
- while(1)
- {
- ws_i=(int)(ws_d1);//將雙精度類型的風(fēng)速?gòu)?qiáng)制轉(zhuǎn)化為整型
- shi_1=ws_i/1000;//將風(fēng)速的十位分離出來(lái);
- write_com(0x80+0x40+7);
- write_data(0x30+shi_1);//液晶第二行第8個(gè)位置寫入風(fēng)速的十位數(shù)
- ge_1=ws_i%1000/100;//將風(fēng)速的個(gè)位分離出來(lái)
- write_com(0x80+0x40+8);
- write_data(0x30+ge_1);//液晶第二行第9個(gè)位置寫入風(fēng)速的個(gè)位數(shù)
- sf_1=ws_i%1000%100/10;//將風(fēng)速的十分位分離出來(lái)
- write_com(0x80+0x40+10);
- write_data(0x30+sf_1);//液晶第二行第11個(gè)位置寫入風(fēng)速的十分位
- bf_1=ws_i%1000%100%10;//將風(fēng)速的百分位分離出來(lái)
- write_com(0x80+0x40+11);
- write_data(0x30+bf_1);//液晶第二行第12個(gè)位置寫入風(fēng)速的十分位
- delay(500);
- TI=0;//允許發(fā)送
- for(c=0;c<6;c++) //上位機(jī)接收字符串“speed:”
- {
- TI=0;//允許發(fā)送
- SBUF=table3[c];
- while(!TI);//等待發(fā)送
- delay(5);
- }
- delay(5);
- shi=ws_i/1000;
- ge=ws_i%1000/100;
- sf=ws_i%1000%100/10;
- bf=ws_i%1000%100%10;
- SBUF=0x30+shi;//上位機(jī)顯示風(fēng)速的十位
- delay(5);
- SBUF=0x30+ge;//上位機(jī)顯示風(fēng)速的個(gè)位
- delay(10);
- SBUF='.';
- delay(10);
- SBUF=0x30+sf;//上位機(jī)顯示風(fēng)速的十分位
- delay(10);
- SBUF=0x30+bf;//上位機(jī)顯示風(fēng)速的百分位
- delay(10);
- SBUF='m';
- delay(10);
- SBUF='/';
- delay(10);
- SBUF='s';
- delay(10);
- SBUF='\n';//換行
- delay(1000);
- while(!TI);//等待數(shù)據(jù)傳送
- }
- }
- void exter0() interrupt 0 //外部中斷0子程序
- {
- f++; //脈沖計(jì)數(shù)
- }
- void timer0() interrupt 1 //定時(shí)器0中斷子程序
- {
- TH0=(65536-50000)/256; //定時(shí)器0重裝初值
- TL0=(65536-50000)%256; //同上
- i++;
- if(i==20) //定時(shí)器0計(jì)時(shí)1s
- {
- num=f;
- ws_d=(num*7)/80.0+0.1;//80后面的.0不能少,少的話(num*7)/80只能得到整數(shù)
- if(ws_d>0.1) //風(fēng)速大于0
- ws_d1=ws_d*100;//為了使風(fēng)速顯示到小數(shù)點(diǎn)后兩位
- else
- ws_d1=0; //風(fēng)速為0
- i=0;
- f=0;
- // flag=1;
- }
- }
- /*void ser() interrupt 4 //串口中斷函數(shù)
- {
- uchar shi,ge,sf,bf,shi_1,ge_1,sf_1,bf_1;
- if(flag==1)
- {
- ws_i=(int)(ws_d1);//將雙精度類型的風(fēng)速?gòu)?qiáng)制轉(zhuǎn)化為整型
- shi_1=ws_i/1000;
- write_com(0x80+0x40+7);
- write_data(0x30+shi_1);
- ge_1=ws_i%1000/100;
- write_com(0x80+0x40+8);
- write_data(0x30+ge_1);
- sf_1=ws_i%1000%100/10;
- write_com(0x80+0x40+10);
- write_data(0x30+sf_1);
- bf_1=ws_i%1000%100%10;
- write_com(0x80+0x40+11);
- write_data(0x30+bf_1);
- delay(500);
- TI=0;//允許發(fā)送
- for(c=0;c<6;c++) //上位機(jī)接收字符串“speed:”
- {
- TI=0;//允許發(fā)送
- SBUF=table3[c];
- while(!TI);//等待發(fā)送
- delay(5);
- }
- delay(5);
- shi=ws_i/1000;
- ge=ws_i%1000/100;
- sf=ws_i%1000%100/10;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
三杯式風(fēng)速傳感器實(shí)驗(yàn)報(bào)告.docx
(23.44 KB, 下載次數(shù): 169)
2017-12-1 22:18 上傳
點(diǎn)擊文件名下載附件
關(guān)于三杯式風(fēng)速傳感器的液晶顯示程序 下載積分: 黑幣 -5
|