欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 基于51單片機定時器0計時計數器1計數的霍爾傳感器精確測速LCD1602顯示測速的項目工程 [打印本頁]

作者: 51黑電子會員    時間: 2020-4-7 21:17
標題: 基于51單片機定時器0計時計數器1計數的霍爾傳感器精確測速LCD1602顯示測速的項目工程
本帖最后由 51黑電子會員 于 2020-4-7 21:22 編輯
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int     
  5. sbit RW=P2^6;//定義LCD1602液晶顯示器讀寫端         
  6. sbit RS=P2^5;//定義LCD1602液晶顯示器數據命令端
  7. sbit EN=P2^7;//定義LCD1602液晶顯示器使能端
  8. sbit qiting=P3^0;//定義啟停按鍵
  9. uchar qitingnum;//定義啟停次數變量
  10. uint count;//定時器0定時中斷次數變量
  11. unsigned long speed=0;//定義速度變量
  12. uchar code tab1[]={"RPM:"};//顯示轉速的固定大寫字符
  13. uchar code tab2[]={"rpm/sec"};//顯示轉速的固定小寫字符
  14. /**ms級延時子程序**/
  15.   void delay(uint x)
  16. {
  17.    uint i,j;                       
  18.    for(i=0;i<x;i++)     
  19.     for(j=0;j<110;j++);
  20.   }
  21. /********液晶寫入指令函數與寫入數據函數**************/
  22.   void write_1602com(uchar com)//****液晶寫入指令函數****
  23. {
  24.    RS=0;//數據/指令選擇置為指令
  25.    P0=com;//送入數據
  26.    delay(1);
  27.    EN=1;//拉高使能端,為制造有效的下降沿做準備。
  28.    delay(1);
  29.    EN=0;//en由高變低,產生下降沿,液晶執行命令。
  30.   }
  31.   void write_1602dat(uchar dat)//液晶寫入數據函數
  32. {
  33.    RS=1;//數據/指令選擇置為數據
  34.    P0=dat;//送入數據
  35.    delay(1);
  36.    EN=1; //en置高電平,為制造下降沿做準備。
  37.    delay(1);
  38.    EN=0; //en由高變低,產生下降沿,液晶執行命。
  39.   }
  40.   void lcd1602_init()//液晶初始化函數
  41. {
  42.    uchar a;
  43.    RW=0;
  44.    write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據。
  45.    write_1602com(0x0c);//開顯示不顯示光標
  46.    write_1602com(0x06);//整屏不移動,光標自動右移。
  47.    write_1602com(0x01);//清顯示        
  48.    write_1602com(0x80);//顯示固定符號從第一行第0個(從第0個開始數)位置開始顯示
  49.    for(a=0;a<4;a++)
  50. {
  51.     write_1602dat(tab1[a]);//向液晶屏寫固定符號部分
  52.    }
  53.    write_1602com(0x80+9);//顯示固定符號寫入位置,從第一行第9個(從第0個開始數)位置開始顯示。
  54.    for(a=0;a<8;a++)
  55. {
  56.     write_1602dat(tab2[a]);//寫顯示固定符號
  57.    }
  58. }
  59. /*************轉速顯示函數**********/  
  60.   void display(unsigned long speed)//轉速顯示函數
  61. {
  62.    if(speed<=99999)
  63. {
  64.     uchar wan,qian,bai,shi,ge;//定義拆字變量
  65.     wan=speed/10000;//轉速/10000得到萬位
  66.     qian=speed%10000/1000;//轉速/10000的余數/1000得到千位
  67.     bai=speed%1000/100;//取得百位
  68.     shi=speed%100/10;//取得十位數字
  69.     ge=speed%10;//取得個位數字
  70.     write_1602com(0x80+4);//從第一行第4個(從第0個開始數)位置開始顯示
  71.     if(wan==0)//萬位為0時
  72.   {
  73.      write_1602dat(' ');//顯示空格
  74.     }
  75.     else//萬位不為0時
  76.   {
  77.      write_1602dat(0x30+wan);//顯示萬位的數據,+0x30是因為在液晶的字庫中,0的地址是0x30,1的地址是0x31,以此類推。
  78.     }
  79.     if((wan+qian)==0)//萬位和千位都為0時
  80.   {
  81.      write_1602dat(' ');//千位顯示空格
  82.     }
  83.     else//萬位和千位不都為0時
  84.   {
  85.      write_1602dat(0x30+qian);//顯示千位數據
  86.     }

  87.     if((wan+qian+bai)==0)//萬位、千位和百位都是0時
  88.   {
  89.      write_1602dat(' ');//顯示空格
  90.     }
  91.     else//萬位、千位和百位不都為0時
  92.   {
  93.      write_1602dat(0x30+bai);//顯示百位數據
  94.     }
  95.     if((wan+qian+bai+shi)==0)//萬位、千位、百位和十位都為0時
  96.   {
  97.      write_1602dat(' ');//顯示空格
  98.     }
  99.     else//萬位、千位、百位和十位不都為0時
  100.   {
  101.      write_1602dat(0x30+shi);//顯示十位數據
  102.     }               
  103.     write_1602dat(0x30+ge);//顯示個位數據,數字+0x30得到該數字的LCD1602顯示碼。
  104.   }
  105. }
  106. /**************按鍵掃描函數*****************/  
  107.   void keyscan()//按鍵掃描函數
  108. {
  109.    if(qiting==0)//判斷啟停鍵是否按下
  110. {
  111.     delay(5);
  112.     if(qiting==0)//判斷啟停鍵是否再次按下
  113.   {
  114.      qitingnum++;//啟停次數變量加加
  115.      lcd1602_init();//LCD1602液晶顯示器初始化函數
  116.      while(!qiting);//等待啟停鍵松開
  117.    }
  118.   }
  119.    if(qitingnum==1)//判斷啟停次數變量是否為1
  120. {
  121.     display(speed);//顯示速度函數
  122.   }
  123.    if(qitingnum==2)//判斷啟停次數變量是否為2
  124. {
  125.     write_1602com(0x08);//關LCD1602液晶顯示器顯示
  126.     qitingnum=0;//啟停次數變量置0
  127.    }
  128. }
  129. /**********定時器0、計數器1初始化子程序*********/
  130.   void Time0_Time1_init()
  131. {
  132.    TMOD=0X51;//模式選定時器0、計數器1,工作方式選定時器0定時模式1、計數器1計數模式1。
  133.    TH0=(65536-50000)/256;//定時器0高8位定時50毫秒
  134.    TL0=(65536-50000)%256;//定時器0低8位定時50毫秒
  135.    TH1=0;//計數器1高8位計數初值為0
  136.    TL1=0;//計數器1低8位計數初值為0
  137.    EA=1;//打開總中斷
  138.    ET0=1;//打開定時器0的中斷
  139.    TR0=1;//打開定時器0
  140.    ET1=1;//打開計數器1的中斷
  141.    TR1=1;//打開計數器1
  142. }
  143. /************主函數***************/  
  144.   void main()//主函數
  145. {
  146.    Time0_Time1_init();//定時器0與外部中斷0初始化子程序
  147.    while(1)//固定循環
  148. {  
  149.     keyscan();
  150.   }
  151. }
  152. /**定時器0中斷服務子程序**/                                      
  153.   void Timer0() interrupt 1
  154. {
  155.    TH0=(65536-50000)/256;//重裝定時器0高8位定時50毫秒
  156.    TL0=(65536-50000)%256;//重裝定時器0低8位定時50毫秒
  157.    count++;//定時器0定時中斷次數變量加加
  158.    if(count==20)//判斷定時器0定時中斷次數變量是否等于20,即1秒鐘。
  159. {
  160.     count=0;//定時器0定時中斷次數變量清0
  161.     TR1=0;//關計數器1,開始統計1秒鐘內,霍爾元件發送的脈沖個數。
  162.     speed=TH1*256+TL1;//表示計數器1計數霍爾元件發送的脈沖個數,即轉速:轉/秒。
  163.     TH1=0;//計數器1高8位計數清0,為了下一次計數。
  164.     TL1=0;//計數器1低8位計數0,為了下一次計數。
  165.     TR1=1;//開計數器1,為了下一次統計1秒鐘內,霍爾元件發送的脈沖個數。
  166.    }
  167. }
復制代碼


圖片11.png (79.45 KB, 下載次數: 53)

圖片11.png

作者: wangzhenongyao    時間: 2020-6-20 19:14
P0口我需要改為P1口使用,程序上怎么改呀?我只改了 P2=com;//送入數據, P0=dat;//送入數據;不行啊,不會顯示,初學,請指教,謝謝!!

作者: A星貓    時間: 2020-9-1 12:54
要是能把程序文件和仿真文件發出來就好了
作者: cadplus    時間: 2020-9-10 16:15
我是定義1000循環1000次,理論1秒實際半秒不到,難道我的硬件問題?




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1