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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

三杯式風速傳感器液晶顯示單片機程序與實驗報告

[復制鏈接]
跳轉到指定樓層
樓主
ID:256258 發表于 2017-12-1 22:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
三杯式風速傳感器實驗報告
一、實驗目的

1.掌握三杯式風速傳感器的工作原理;

2.將三杯式風速傳感器測得的風速(風由風扇提供)實時顯示在液晶和上位機上;

3.進一步掌握1602液晶的使用以及串口通訊;

4.規范C的書寫格式。

二、實驗原理
三杯式風速傳感器有一個測速碼盤,當碼盤轉動并不斷地通過三杯式風速傳感器內部的光電傳感器后,就會產生脈沖信號,脈沖信號觸發單片機產生外部中斷0,外部中斷0對脈沖次數進行計數,定時器0中斷設定1s的時間,并獲取1s內的脈沖次數,然后通過公式:(脈沖次數*7)/80.0+0.1(注意:此處的80.0不能寫成80,否則將會丟失風速的小數位,因為除以80得到的是整數)就可以計算出風速,然后就可以通過單片機將風速顯示在液晶和上位機上了。
三、實驗步驟
1.查閱三杯式風速傳感器的相關資料,掌握其測速原理;
2.測三杯式風速傳感器的脈沖次數并顯示在數碼管上;
3.將風速測出并顯示在1602液晶上;
4.將風速測出并顯示在1602液晶和上位機上。
5.觀察實驗現象,總結。
四、實驗結果
1602液晶和上位機均能實時顯示三杯式風速傳感器測得的風速,且顯示一致,風速精確到了小數點后兩位。
五、實驗總結
這次實驗剛開始測脈沖次數的時候就遇到了挫折,原因是按照文檔上的接法,將紅色線和黑色線接反了,廢了一番波折將傳感器拆開后才把線接對,將脈沖次數測出來。這件事原因還是在我,不敢挑戰文檔的權威性,當時要是把紅黑線的接法對調一下就不會有后面的麻煩事了(不過這也與紅色線是重新接上去的有關系,我一直懷疑它接觸不良)。脈沖次數測出來后液晶顯示很快也順利地實現了,不過到液晶與上位機同時顯示的時候,出現了問題,究其原因是我把顯示寫在了串口中斷里,但是沒有加標志位,串口中斷接收不到脈沖次數,所以風速一直顯示是0,不過在加了標志位后,這個問題順利解決了。另外將顯示寫在主程序里通過查詢方式也實現了液晶和上位機的顯示。至于為什么沒有同時將脈沖次數顯示在數碼管上,這是因為數碼管的位選端P2口和液晶要用到的P2^0,P2^1和P2^2口發生了沖突(這里要吐槽一下,這個單片機沒有鎖存器)。

附錄1  數碼管顯示風速傳感器脈沖次數的程序
單片機源程序如下:
  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. };//數碼表(0-9)
  12. void delay(uint z)//1ms延時函數
  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;//獲取計數值的萬位
  22.     qian=num%10000/1000;//獲取計數值的千位
  23.     bai=num%10000%1000/100;//獲取計數值的百位
  24.     shi=num%10000%1000%100/10;//獲取計數值的十位
  25.     ge=num%10000%1000%100%10;//獲取計數值的個位
  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;//設置定時器0為工作方式1
  45.         TH0=(65536-50000)/256; //定時器0裝初值
  46.         TL0=(65536-50000)%256; //同上
  47.         IT0=1;//外部中斷0為跳變沿觸發方式
  48.         EA=1;//打開總中斷
  49.         EX0=1;//打開外部中斷0
  50.         ET0=1;//打開定時器0中斷
  51.         TR0=1;//打開定時器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++; //脈沖計數
  64. }
  65. void timer0() interrupt 1 //定時器0中斷子程序
  66. {
  67.         TH0=(65536-50000)/256; //定時器0重裝初值
  68.         TL0=(65536-50000)%256; //同上
  69.         i++;
  70.         if(i==20) //定時器0計時1s
  71.         {
  72.                 num=f;
  73.                 i=0;
  74.                 f=0;       
  75.         }       
  76. }
復制代碼

附錄2  液晶上顯示風速的程序
  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;//定義風速的數據類型為雙精度型
  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延時函數
  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;//讀寫控制端設置為寫模式
  22.         P0=com;//將命令送給P0口
  23.         delay(10);
  24.     EN=1;//將命令送給液晶顯示屏
  25.         delay(10);
  26.     EN=0;
  27. }
  28. void write_data(uchar dat)//液晶寫數據子程序
  29. {
  30.         RS=1;//寫入數據
  31.     RW=0;
  32.     P0=dat;//將數據送給P0口
  33.     delay(10);
  34.     EN=1;//將數據送給液晶顯示屏
  35.     delay(10);
  36.     EN=0;
  37. }
  38. void display_ws() //風速顯示子程序
  39. {
  40.         uchar shi,ge,sf,bf;
  41.         uint ws_i=(int)(ws_d1);//將雙精度類型的風速強制轉化為整型
  42.         shi=ws_i/1000;//將風速的十位分離出來;
  43.         write_com(0x80+0x40+7);
  44.         write_data(0x30+shi);//液晶第二行第8個位置寫入風速的十位數
  45.         ge=ws_i%1000/100;//將風速的個位分離出來
  46.         write_com(0x80+0x40+8);
  47.         write_data(0x30+ge);//液晶第二行第9個位置寫入風速的個位數
  48.         sf=ws_i%1000%100/10;//將風速的十分位分離出來
  49.         write_com(0x80+0x40+10);
  50.         write_data(0x30+sf);//液晶第二行第11個位置寫入風速的十分位
  51.         bf=ws_i%1000%1000%10;//將風速的百分位分離出來
  52.         write_com(0x80+0x40+11);
  53.         write_data(0x30+bf);//液晶第二行第12個位置寫入風速的百分位
  54. }
  55. void init()//初始化子程序
  56. {
  57.         write_com(0x38);//設置16*2顯示,5*7點陣,8位數據接口
  58.         write_com(0x01);//清屏
  59.         write_com(0x06);//寫一個字符后,地址指針加1
  60.         write_com(0x0C);//設置開顯示,不顯示光標
  61.         write_com(0x80);//液晶顯示屏從第一行的第一個位置開始寫入字符
  62.         for(a=0;a<16;a++)//液晶顯示屏第一行寫入" speed:         "
  63.         {
  64.                 write_data(table1[a]);
  65.                 delay(1);
  66.         }
  67.         write_com(0x80+0x40);//液晶顯示屏從第二行的第一個位置開始寫入字符
  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;//設置定時器0為工作方式1
  75.         TH0=(65536-50000)/256; //定時器0裝初值
  76.         TL0=(65536-50000)%256; //同上
  77.         IT0=1;//外部中斷0為跳變沿觸發方式
  78.         EA=1;//打開總中斷
  79.         EX0=1;//打開外部中斷0
  80.         ET0=1;//打開定時器0中斷
  81.         TR0=1;//打開定時器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++;  //脈沖計數
  94. }
  95. void timer0() interrupt 1 //定時器0中斷子程序
  96. {
  97.         TH0=(65536-50000)/256; //定時器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)//風速大于0
  105. ws_d1=ws_d*100;//為了使風速顯示到小數點后兩位
  106. else
  107. ws_d1=0; //風速為0
  108.                 i=0;
  109.                 f=0;       
  110.         }       
  111. }
復制代碼

附錄3  液晶和上位機同時顯示風速的程序
單片機源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar i;
  5. //uchar flag;//標志位
  6. uint a,b,c,f,num;
  7. uint ws_i;
  8. double ws_d,ws_d1;//定義風速的數據類型為雙精度型
  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延時函數
  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;//讀寫控制端設置為寫模式
  25.         P0=com;//將命令送給P0口
  26.         delay(10);
  27.     EN=1;//將命令送給液晶顯示屏
  28.         delay(10);
  29.     EN=0;
  30. }
  31. void write_data(uchar dat)//液晶寫數據子程序
  32. {
  33.         RS=1;//寫入數據
  34.     RW=0;
  35.     P0=dat;//將數據送給P0口
  36.     delay(10);
  37.     EN=1;//將數據送給液晶顯示屏
  38.     delay(10);
  39.     EN=0;
  40. }
  41. void init()//初始化子程序
  42. {
  43.         write_com(0x38);//設置16*2顯示,5*7點陣,8位數據接口
  44.         write_com(0x01);//清屏
  45.         write_com(0x06);//寫一個字符后,地址指針加1
  46.         write_com(0x0C);//設置開顯示,不顯示光標
  47.         write_com(0x80);//液晶顯示屏從第一行的第一個位置開始寫入字符
  48.         for(a=0;a<16;a++)//液晶顯示屏第一行寫入" speed:         "
  49.         {
  50.                 write_data(table1[a]);
  51.                 delay(1);
  52.         }
  53.         write_com(0x80+0x40);//液晶顯示屏從第二行的第一個位置開始寫入字符
  54.         for(b=0;b<16;b++)//液晶顯示屏第二行寫入"         .  m/s "
  55.         {
  56.                 write_data(table2[b]);
  57.                 delay(1);
  58.         }
  59.         TMOD=0x21;//設置定時器0為工作方式1,定時器1為工作方式2
  60.         TH0=(65536-50000)/256; //定時器0裝初值
  61.         TL0=(65536-50000)%256; //同上
  62.         TH1=0xf3;//設置波特率為2400
  63.         TL1=0xf3;//同上
  64.         TR1=1;//打開定時器1
  65.         TR0=1;//打開定時器0
  66.         IT0=1;//外部中斷0為跳變沿觸發方式
  67.         REN=1;//允許串口接收數據
  68.         SM0=0;//設置串口的工作方式為1
  69.         SM1=1;//同上
  70.         EX0=1;//打開外部中斷0
  71.         ET0=1;//打開定時器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);//將雙精度類型的風速強制轉化為整型
  83.                 shi_1=ws_i/1000;//將風速的十位分離出來;
  84.                 write_com(0x80+0x40+7);
  85.                 write_data(0x30+shi_1);//液晶第二行第8個位置寫入風速的十位數
  86.                 ge_1=ws_i%1000/100;//將風速的個位分離出來
  87.                 write_com(0x80+0x40+8);
  88.                 write_data(0x30+ge_1);//液晶第二行第9個位置寫入風速的個位數
  89.                 sf_1=ws_i%1000%100/10;//將風速的十分位分離出來
  90.                 write_com(0x80+0x40+10);
  91.                 write_data(0x30+sf_1);//液晶第二行第11個位置寫入風速的十分位
  92.                 bf_1=ws_i%1000%100%10;//將風速的百分位分離出來
  93.                 write_com(0x80+0x40+11);
  94.                 write_data(0x30+bf_1);//液晶第二行第12個位置寫入風速的十分位
  95.                 delay(500);
  96.                 TI=0;//允許發送
  97.                 for(c=0;c<6;c++)  //上位機接收字符串“speed:”
  98.                 {
  99.                         TI=0;//允許發送
  100.                         SBUF=table3[c];
  101.                         while(!TI);//等待發送
  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;//上位機顯示風速的十位
  110.                 delay(5);
  111.                 SBUF=0x30+ge;//上位機顯示風速的個位
  112.                 delay(10);
  113.                 SBUF='.';
  114.                 delay(10);
  115.                 SBUF=0x30+sf;//上位機顯示風速的十分位
  116.                 delay(10);
  117.                 SBUF=0x30+bf;//上位機顯示風速的百分位
  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);//等待數據傳送
  128.         }       
  129. }
  130. void exter0() interrupt 0  //外部中斷0子程序
  131. {
  132.         f++;  //脈沖計數
  133. }
  134. void timer0() interrupt 1 //定時器0中斷子程序
  135. {
  136.         TH0=(65536-50000)/256; //定時器0重裝初值
  137.         TL0=(65536-50000)%256; //同上
  138.         i++;
  139.         if(i==20) //定時器0計時1s
  140.         {
  141.                 num=f;
  142.                 ws_d=(num*7)/80.0+0.1;//80后面的.0不能少,少的話(num*7)/80只能得到整數
  143.                 if(ws_d>0.1) //風速大于0
  144.                 ws_d1=ws_d*100;//為了使風速顯示到小數點后兩位
  145.                 else
  146.                 ws_d1=0; //風速為0
  147.                 i=0;
  148.                 f=0;
  149.         //        flag=1;       
  150.         }       
  151. }
  152. /*void ser() interrupt 4  //串口中斷函數
  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);//將雙精度類型的風速強制轉化為整型
  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;//允許發送
  172.                 for(c=0;c<6;c++)  //上位機接收字符串“speed:”
  173.                 {
  174.                         TI=0;//允許發送
  175.                         SBUF=table3[c];
  176.                         while(!TI);//等待發送
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
三杯式風速傳感器實驗報告.docx (23.44 KB, 下載次數: 169)


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

使用道具 舉報

沙發
ID:350412 發表于 2018-6-12 16:52 | 只看該作者
有用,對初學者簡單易懂
回復

使用道具 舉報

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

使用道具 舉報

地板
ID:452173 發表于 2019-12-13 02:25 | 只看該作者
正想關于這方面的測試,謝謝提供并分享!
回復

使用道具 舉報

5#
ID:452173 發表于 2019-12-13 23:07 | 只看該作者
想問下碼盤的尺寸和孔距及孔數量,請告知,不勝感激!
回復

使用道具 舉報

6#
ID:663227 發表于 2019-12-19 14:04 | 只看該作者
感謝分享
回復

使用道具 舉報

7#
ID:540085 發表于 2020-1-5 15:37 | 只看該作者
有沒有原理圖?
回復

使用道具 舉報

8#
ID:832467 發表于 2020-10-20 23:21 | 只看該作者
謝謝你的分享,我是新用戶。我想學習你這個風速到單片機到屏幕的實驗。謝謝!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久久久 | 九九热精品免费 | 久久久91| 成人欧美一区二区三区在线观看 | 亚洲成人av在线播放 | 国产探花在线精品一区二区 | 久久精品无码一区二区三区 | 最新毛片网站 | 日韩成人免费中文字幕 | 成人av网站在线观看 | 亚洲精品久 | 中文av在线播放 | 一区网站 | 四虎影 | 日韩精品一区二区三区视频播放 | 成人在线视频免费观看 | 综合色在线 | 欧美一区 | 久久久久成人精品免费播放动漫 | 精品一区二区三区在线观看 | 国产一区免费 | 亚洲精品国产电影 | 久久久久久久电影 | 欧美一区2区三区4区公司 | 福利一区视频 | 国产成人精品a视频一区www | 美女久久久久久久久 | 一区二区三区视频在线 | 羞羞的视频免费观看 | 日韩电影在线 | 国产毛片毛片 | 国产一区二区在线免费播放 | 欧美一区二区视频 | 黄色一级视频 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 精品视频一区二区三区在线观看 | 精品一二| 99热在线免费 | 天天操天天射天天 | 成人国内精品久久久久一区 | 黄视频网址 |