找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

三杯式風(fēng)速傳感器液晶顯示單片機(jī)程序與實(shí)驗(yàn)報(bào)告

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:256258 發(fā)表于 2017-12-1 22:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
三杯式風(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ī)源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar i;
  5. uint f,num;
  6. uchar code table[]=
  7. {
  8.         0x28,0x7e,0xa2,0x62,
  9.         0x74,0x61,0x21,0x7a,
  10.         0x20,0x60
  11. };//數(shù)碼表(0-9)
  12. void delay(uint z)//1ms延時(shí)函數(shù)
  13. {
  14.         uint x,y;
  15.         for(x=z;x>0;x--)
  16.                 for(y=110;y>0;y--);
  17. }
  18. void display()
  19. {
  20.         uchar wan,qian,bai,shi,ge;
  21.            wan=num/10000;//獲取計(jì)數(shù)值的萬(wàn)位
  22.     qian=num%10000/1000;//獲取計(jì)數(shù)值的千位
  23.     bai=num%10000%1000/100;//獲取計(jì)數(shù)值的百位
  24.     shi=num%10000%1000%100/10;//獲取計(jì)數(shù)值的十位
  25.     ge=num%10000%1000%100%10;//獲取計(jì)數(shù)值的個(gè)位
  26.         P2=0xfe;
  27.         P0=table[wan];
  28.         delay(2);
  29.         P2=0xfd;
  30.         P0=table[qian];
  31.         delay(2);
  32.         P2=0xfb;
  33.         P0=table[bai];
  34.         delay(2);
  35.         P2=0xf7;
  36.         P0=table[shi];
  37.         delay(2);
  38.         P2=0xef;
  39.         P0=table[ge];
  40.         delay(2);
  41. }
  42. void init()//初始化子程序
  43. {
  44.         TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1
  45.         TH0=(65536-50000)/256; //定時(shí)器0裝初值
  46.         TL0=(65536-50000)%256; //同上
  47.         IT0=1;//外部中斷0為跳變沿觸發(fā)方式
  48.         EA=1;//打開總中斷
  49.         EX0=1;//打開外部中斷0
  50.         ET0=1;//打開定時(shí)器0中斷
  51.         TR0=1;//打開定時(shí)器0
  52. }
  53. void main()
  54. {
  55.         init();
  56.         while(1)
  57.         {
  58.                 display();
  59.         }       
  60. }
  61. void exter0() interrupt 0  //外部中斷0子程序
  62. {
  63.         f++; //脈沖計(jì)數(shù)
  64. }
  65. void timer0() interrupt 1 //定時(shí)器0中斷子程序
  66. {
  67.         TH0=(65536-50000)/256; //定時(shí)器0重裝初值
  68.         TL0=(65536-50000)%256; //同上
  69.         i++;
  70.         if(i==20) //定時(shí)器0計(jì)時(shí)1s
  71.         {
  72.                 num=f;
  73.                 i=0;
  74.                 f=0;       
  75.         }       
  76. }
復(fù)制代碼

附錄2  液晶上顯示風(fēng)速的程序
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar i;
  5. uint a,b,f,num;
  6. double ws_d,ws_d1;//定義風(fēng)速的數(shù)據(jù)類型為雙精度型
  7. uchar code table1[]=" speed:         ";
  8. uchar code table2[]="         .  m/s ";
  9. sbit RS=P2^0;
  10. sbit RW=P2^1;
  11. sbit EN=P2^2;
  12. void delay(uint z)//1ms延時(shí)函數(shù)
  13. {
  14.         uint x,y;
  15.         for(x=z;x>0;x--)
  16.                 for(y=110;y>0;y--);
  17. }
  18. void write_com(uchar com) //液晶寫命令子程序
  19. {
  20.         RS=0;//寫入命令
  21.         RW=0;//讀寫控制端設(shè)置為寫模式
  22.         P0=com;//將命令送給P0口
  23.         delay(10);
  24.     EN=1;//將命令送給液晶顯示屏
  25.         delay(10);
  26.     EN=0;
  27. }
  28. void write_data(uchar dat)//液晶寫數(shù)據(jù)子程序
  29. {
  30.         RS=1;//寫入數(shù)據(jù)
  31.     RW=0;
  32.     P0=dat;//將數(shù)據(jù)送給P0口
  33.     delay(10);
  34.     EN=1;//將數(shù)據(jù)送給液晶顯示屏
  35.     delay(10);
  36.     EN=0;
  37. }
  38. void display_ws() //風(fēng)速顯示子程序
  39. {
  40.         uchar shi,ge,sf,bf;
  41.         uint ws_i=(int)(ws_d1);//將雙精度類型的風(fēng)速?gòu)?qiáng)制轉(zhuǎn)化為整型
  42.         shi=ws_i/1000;//將風(fēng)速的十位分離出來(lái);
  43.         write_com(0x80+0x40+7);
  44.         write_data(0x30+shi);//液晶第二行第8個(gè)位置寫入風(fēng)速的十位數(shù)
  45.         ge=ws_i%1000/100;//將風(fēng)速的個(gè)位分離出來(lái)
  46.         write_com(0x80+0x40+8);
  47.         write_data(0x30+ge);//液晶第二行第9個(gè)位置寫入風(fēng)速的個(gè)位數(shù)
  48.         sf=ws_i%1000%100/10;//將風(fēng)速的十分位分離出來(lái)
  49.         write_com(0x80+0x40+10);
  50.         write_data(0x30+sf);//液晶第二行第11個(gè)位置寫入風(fēng)速的十分位
  51.         bf=ws_i%1000%1000%10;//將風(fēng)速的百分位分離出來(lái)
  52.         write_com(0x80+0x40+11);
  53.         write_data(0x30+bf);//液晶第二行第12個(gè)位置寫入風(fēng)速的百分位
  54. }
  55. void init()//初始化子程序
  56. {
  57.         write_com(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  58.         write_com(0x01);//清屏
  59.         write_com(0x06);//寫一個(gè)字符后,地址指針加1
  60.         write_com(0x0C);//設(shè)置開顯示,不顯示光標(biāo)
  61.         write_com(0x80);//液晶顯示屏從第一行的第一個(gè)位置開始寫入字符
  62.         for(a=0;a<16;a++)//液晶顯示屏第一行寫入" speed:         "
  63.         {
  64.                 write_data(table1[a]);
  65.                 delay(1);
  66.         }
  67.         write_com(0x80+0x40);//液晶顯示屏從第二行的第一個(gè)位置開始寫入字符
  68.         for(b=0;b<16;b++)//液晶顯示屏第二行寫入"         .  m/s "
  69.         {
  70.                 write_data(table2[b]);
  71.                 delay(1);
  72.         }
  73.         delay(10);
  74.         TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1
  75.         TH0=(65536-50000)/256; //定時(shí)器0裝初值
  76.         TL0=(65536-50000)%256; //同上
  77.         IT0=1;//外部中斷0為跳變沿觸發(fā)方式
  78.         EA=1;//打開總中斷
  79.         EX0=1;//打開外部中斷0
  80.         ET0=1;//打開定時(shí)器0中斷
  81.         TR0=1;//打開定時(shí)器0
  82. }
  83. void main()
  84. {
  85.         init();
  86.         while(1)
  87.         {
  88.                 display_ws();
  89.         }       
  90. }
  91. void exter0() interrupt 0  //外部中斷0子程序
  92. {
  93.         f++;  //脈沖計(jì)數(shù)
  94. }
  95. void timer0() interrupt 1 //定時(shí)器0中斷子程序
  96. {
  97.         TH0=(65536-50000)/256; //定時(shí)器0重裝初值
  98.         TL0=(65536-50000)%256; //同上
  99.         i++;
  100.         if(i==20)
  101.         {
  102.                 num=f;
  103.                 ws_d=(num*7)/80.0+0.1;
  104.                 if(ws_d>0.1)//風(fēng)速大于0
  105. ws_d1=ws_d*100;//為了使風(fēng)速顯示到小數(shù)點(diǎn)后兩位
  106. else
  107. ws_d1=0; //風(fēng)速為0
  108.                 i=0;
  109.                 f=0;       
  110.         }       
  111. }
復(fù)制代碼

附錄3  液晶和上位機(jī)同時(shí)顯示風(fēng)速的程序
單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar i;
  5. //uchar flag;//標(biāo)志位
  6. uint a,b,c,f,num;
  7. uint ws_i;
  8. double ws_d,ws_d1;//定義風(fēng)速的數(shù)據(jù)類型為雙精度型
  9. uchar code table1[]=" speed:         ";
  10. uchar code table2[]="         .  m/s ";
  11. uchar code table3[]="speed:";
  12. sbit RS=P2^0;
  13. sbit RW=P2^1;
  14. sbit EN=P2^2;
  15. void delay(uint z)//1ms延時(shí)函數(shù)
  16. {
  17.         uint x,y;
  18.         for(x=z;x>0;x--)
  19.                 for(y=110;y>0;y--);
  20. }
  21. void write_com(uchar com) //液晶寫命令子程序
  22. {
  23.         RS=0;//寫入命令
  24.         RW=0;//讀寫控制端設(shè)置為寫模式
  25.         P0=com;//將命令送給P0口
  26.         delay(10);
  27.     EN=1;//將命令送給液晶顯示屏
  28.         delay(10);
  29.     EN=0;
  30. }
  31. void write_data(uchar dat)//液晶寫數(shù)據(jù)子程序
  32. {
  33.         RS=1;//寫入數(shù)據(jù)
  34.     RW=0;
  35.     P0=dat;//將數(shù)據(jù)送給P0口
  36.     delay(10);
  37.     EN=1;//將數(shù)據(jù)送給液晶顯示屏
  38.     delay(10);
  39.     EN=0;
  40. }
  41. void init()//初始化子程序
  42. {
  43.         write_com(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  44.         write_com(0x01);//清屏
  45.         write_com(0x06);//寫一個(gè)字符后,地址指針加1
  46.         write_com(0x0C);//設(shè)置開顯示,不顯示光標(biāo)
  47.         write_com(0x80);//液晶顯示屏從第一行的第一個(gè)位置開始寫入字符
  48.         for(a=0;a<16;a++)//液晶顯示屏第一行寫入" speed:         "
  49.         {
  50.                 write_data(table1[a]);
  51.                 delay(1);
  52.         }
  53.         write_com(0x80+0x40);//液晶顯示屏從第二行的第一個(gè)位置開始寫入字符
  54.         for(b=0;b<16;b++)//液晶顯示屏第二行寫入"         .  m/s "
  55.         {
  56.                 write_data(table2[b]);
  57.                 delay(1);
  58.         }
  59.         TMOD=0x21;//設(shè)置定時(shí)器0為工作方式1,定時(shí)器1為工作方式2
  60.         TH0=(65536-50000)/256; //定時(shí)器0裝初值
  61.         TL0=(65536-50000)%256; //同上
  62.         TH1=0xf3;//設(shè)置波特率為2400
  63.         TL1=0xf3;//同上
  64.         TR1=1;//打開定時(shí)器1
  65.         TR0=1;//打開定時(shí)器0
  66.         IT0=1;//外部中斷0為跳變沿觸發(fā)方式
  67.         REN=1;//允許串口接收數(shù)據(jù)
  68.         SM0=0;//設(shè)置串口的工作方式為1
  69.         SM1=1;//同上
  70.         EX0=1;//打開外部中斷0
  71.         ET0=1;//打開定時(shí)器0中斷
  72.         EA=1;//打開總中斷
  73. //        ES=1;//打開串口中斷       
  74. }
  75. void main()
  76. {
  77.         uchar shi,ge,sf,bf,shi_1,ge_1,sf_1,bf_1;
  78.         init();
  79.         delay(1);
  80.         while(1)
  81.         {
  82.                 ws_i=(int)(ws_d1);//將雙精度類型的風(fēng)速?gòu)?qiáng)制轉(zhuǎn)化為整型
  83.                 shi_1=ws_i/1000;//將風(fēng)速的十位分離出來(lái);
  84.                 write_com(0x80+0x40+7);
  85.                 write_data(0x30+shi_1);//液晶第二行第8個(gè)位置寫入風(fēng)速的十位數(shù)
  86.                 ge_1=ws_i%1000/100;//將風(fēng)速的個(gè)位分離出來(lái)
  87.                 write_com(0x80+0x40+8);
  88.                 write_data(0x30+ge_1);//液晶第二行第9個(gè)位置寫入風(fēng)速的個(gè)位數(shù)
  89.                 sf_1=ws_i%1000%100/10;//將風(fēng)速的十分位分離出來(lái)
  90.                 write_com(0x80+0x40+10);
  91.                 write_data(0x30+sf_1);//液晶第二行第11個(gè)位置寫入風(fēng)速的十分位
  92.                 bf_1=ws_i%1000%100%10;//將風(fēng)速的百分位分離出來(lái)
  93.                 write_com(0x80+0x40+11);
  94.                 write_data(0x30+bf_1);//液晶第二行第12個(gè)位置寫入風(fēng)速的十分位
  95.                 delay(500);
  96.                 TI=0;//允許發(fā)送
  97.                 for(c=0;c<6;c++)  //上位機(jī)接收字符串“speed:”
  98.                 {
  99.                         TI=0;//允許發(fā)送
  100.                         SBUF=table3[c];
  101.                         while(!TI);//等待發(fā)送
  102.                         delay(5);
  103.                 }
  104.                 delay(5);
  105.                 shi=ws_i/1000;
  106.                 ge=ws_i%1000/100;
  107.                 sf=ws_i%1000%100/10;
  108.                 bf=ws_i%1000%100%10;
  109.                 SBUF=0x30+shi;//上位機(jī)顯示風(fēng)速的十位
  110.                 delay(5);
  111.                 SBUF=0x30+ge;//上位機(jī)顯示風(fēng)速的個(gè)位
  112.                 delay(10);
  113.                 SBUF='.';
  114.                 delay(10);
  115.                 SBUF=0x30+sf;//上位機(jī)顯示風(fēng)速的十分位
  116.                 delay(10);
  117.                 SBUF=0x30+bf;//上位機(jī)顯示風(fēng)速的百分位
  118.                 delay(10);
  119.                 SBUF='m';
  120.                 delay(10);
  121.                 SBUF='/';
  122.                 delay(10);
  123.                 SBUF='s';
  124.                 delay(10);
  125.                 SBUF='\n';//換行
  126.                 delay(1000);
  127.                 while(!TI);//等待數(shù)據(jù)傳送
  128.         }       
  129. }
  130. void exter0() interrupt 0  //外部中斷0子程序
  131. {
  132.         f++;  //脈沖計(jì)數(shù)
  133. }
  134. void timer0() interrupt 1 //定時(shí)器0中斷子程序
  135. {
  136.         TH0=(65536-50000)/256; //定時(shí)器0重裝初值
  137.         TL0=(65536-50000)%256; //同上
  138.         i++;
  139.         if(i==20) //定時(shí)器0計(jì)時(shí)1s
  140.         {
  141.                 num=f;
  142.                 ws_d=(num*7)/80.0+0.1;//80后面的.0不能少,少的話(num*7)/80只能得到整數(shù)
  143.                 if(ws_d>0.1) //風(fēng)速大于0
  144.                 ws_d1=ws_d*100;//為了使風(fēng)速顯示到小數(shù)點(diǎn)后兩位
  145.                 else
  146.                 ws_d1=0; //風(fēng)速為0
  147.                 i=0;
  148.                 f=0;
  149.         //        flag=1;       
  150.         }       
  151. }
  152. /*void ser() interrupt 4  //串口中斷函數(shù)
  153. {
  154.         uchar shi,ge,sf,bf,shi_1,ge_1,sf_1,bf_1;
  155.         if(flag==1)
  156.         {
  157.                 ws_i=(int)(ws_d1);//將雙精度類型的風(fēng)速?gòu)?qiáng)制轉(zhuǎn)化為整型
  158.                 shi_1=ws_i/1000;
  159.                 write_com(0x80+0x40+7);
  160.                 write_data(0x30+shi_1);
  161.                 ge_1=ws_i%1000/100;
  162.                 write_com(0x80+0x40+8);
  163.                 write_data(0x30+ge_1);
  164.                 sf_1=ws_i%1000%100/10;
  165.                 write_com(0x80+0x40+10);
  166.                 write_data(0x30+sf_1);
  167.                 bf_1=ws_i%1000%100%10;
  168.                 write_com(0x80+0x40+11);
  169.                 write_data(0x30+bf_1);
  170.                 delay(500);
  171.                 TI=0;//允許發(fā)送
  172.                 for(c=0;c<6;c++)  //上位機(jī)接收字符串“speed:”
  173.                 {
  174.                         TI=0;//允許發(fā)送
  175.                         SBUF=table3[c];
  176.                         while(!TI);//等待發(fā)送
  177.                         delay(5);
  178.                 }
  179.                 delay(5);
  180.                 shi=ws_i/1000;
  181.                 ge=ws_i%1000/100;
  182.                 sf=ws_i%1000%100/10;
  183. ……………………

  184. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
三杯式風(fēng)速傳感器實(shí)驗(yàn)報(bào)告.docx (23.44 KB, 下載次數(shù): 169)


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

使用道具 舉報(bào)

7#
ID:832467 發(fā)表于 2020-10-20 23:21 | 只看該作者
謝謝你的分享,我是新用戶。我想學(xué)習(xí)你這個(gè)風(fēng)速到單片機(jī)到屏幕的實(shí)驗(yàn)。謝謝!!
回復(fù)

使用道具 舉報(bào)

6#
ID:540085 發(fā)表于 2020-1-5 15:37 | 只看該作者
有沒(méi)有原理圖?
回復(fù)

使用道具 舉報(bào)

5#
ID:663227 發(fā)表于 2019-12-19 14:04 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:452173 發(fā)表于 2019-12-13 23:07 | 只看該作者
想問(wèn)下碼盤的尺寸和孔距及孔數(shù)量,請(qǐng)告知,不勝感激!
回復(fù)

使用道具 舉報(bào)

板凳
ID:452173 發(fā)表于 2019-12-13 02:25 | 只看該作者
正想關(guān)于這方面的測(cè)試,謝謝提供并分享!
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:273447 發(fā)表于 2019-1-28 22:46 | 只看該作者
感謝分享(❁′ω`❁)
回復(fù)

使用道具 舉報(bào)

樓主
ID:350412 發(fā)表于 2018-6-12 16:52 | 只看該作者
有用,對(duì)初學(xué)者簡(jiǎn)單易懂
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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