標(biāo)題: 簡(jiǎn)易自行車?yán)锍逃?jì)仿真圖及單片機(jī)源程序 [打印本頁]

作者: 橘子沒有樹    時(shí)間: 2017-5-7 09:43
標(biāo)題: 簡(jiǎn)易自行車?yán)锍逃?jì)仿真圖及單片機(jī)源程序
簡(jiǎn)易自行車?yán)锍逃?jì)仿真圖


由于仿真中沒有霍爾傳感器,實(shí)際呢霍爾就是感應(yīng)磁信號(hào),輸出高低電平的脈沖信號(hào),這樣用脈沖就可以了,不同的頻率代表電機(jī)轉(zhuǎn)速的快慢

單片機(jī)源程序:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit COUNT_IN=P3^2;

  5. //定義1602相關(guān)管腳
  6. sbit rs=P2^7;
  7. sbit en=P2^6;

  8. uint count;
  9. unsigned long Velocity,Mileage;
  10. bit flag;
  11. uchar code tab1[]={"  Speed:      km/h"};        
  12. uchar code tab2[]={"Mileage:  .   km"};       

  13. void delay(uint x)
  14. {
  15.         uint i,j;
  16.         for(i=0;i<x;i++)
  17.         for(j=0;j<110;j++);
  18. }
  19. void init()
  20. {
  21.         IT0=1;        //INT0負(fù)跳變觸發(fā)       
  22.     TMOD=0x01;//定時(shí)器工作于方式1
  23.         TH0=0x3c;          //50ms
  24.         TL0=0xb0;
  25.         EA=1; //CPU開中斷總允許
  26.         ET0=1;//開定時(shí)中斷
  27.         EX0=1;//開外部INTO中斷
  28.     TR0=1;//啟動(dòng)定時(shí)
  29. }
  30. /********液晶寫入指令函數(shù)與寫入數(shù)據(jù)函數(shù),以后可調(diào)用**************/

  31. void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
  32. {
  33.         rs=0;//數(shù)據(jù)/指令選擇置為指令
  34.         P0=com;//送入數(shù)據(jù)
  35.         delay(1);
  36.         en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
  37.         delay(1);
  38.         en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令

  39. }


  40. void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
  41. {
  42.         rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
  43.         P0=dat;//送入數(shù)據(jù)
  44.         delay(1);
  45.         en=1; //en置高電平,為制造下降沿做準(zhǔn)備
  46.         delay(1);
  47.         en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  48. }


  49. void lcd_init()//***液晶初始化函數(shù)****
  50. {
  51.         uchar a;
  52.         write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
  53.         write_1602com(0x0c);//開顯示不顯示光標(biāo)
  54.         write_1602com(0x06);//整屏不移動(dòng),光標(biāo)自動(dòng)右移
  55.         write_1602com(0x01);//清顯示

  56.         write_1602com(0x80);//顯示固定符號(hào)從第一行第1個(gè)位置之后開始顯示
  57.         for(a=0;a<16;a++)
  58.         {
  59.                 write_1602dat(tab1[a]);//向液晶屏寫固定符號(hào)部分
  60.         }
  61.         write_1602com(0x80+0x40);//顯示固定符號(hào)寫入位置,從第2個(gè)位置后開始顯示
  62.         for(a=0;a<16;a++)
  63.         {
  64.                 write_1602dat(tab2[a]);//寫顯示固定符號(hào)
  65.         }
  66. }

  67. void display()
  68. {
  69.                 //                        1km/h=100m/0.1h                   360s
  70.                 //                        10km/h=100m/0.01h          36s
  71.                 //                        100km/h=100m/0.001h  3.6s

  72.                 write_1602com(0x80+9);
  73.                 if(Velocity/100==0)
  74.                 write_1602dat(' ');
  75.                 else
  76.                 write_1602dat(0x30+Velocity/100);
  77.                 if((Velocity/100+Velocity%100/10)==0)
  78.                 write_1602dat(' ');
  79.                 else
  80.                 write_1602dat(0x30+Velocity%100/10);
  81.                 write_1602dat(0x30+Velocity%10);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼

  82.                 write_1602com(0x80+0x40+8);
  83.                 write_1602dat(0x30+Mileage/1000000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  84.                 write_1602dat(0x30+Mileage%1000000/100000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  85.                 write_1602com(0x80+0x40+11);
  86.                 write_1602dat(0x30+Mileage%100000/10000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  87.                 write_1602dat(0x30+Mileage%10000/1000);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  88.                
  89.                 write_1602dat(0x30+Mileage%1000/100);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  90. }

  91. void main()
  92. {
  93.         init();
  94.         lcd_init();
  95.         while(1)
  96.         {
  97.                 display();
  98.         }
  99. }

  100. void EXINT0() interrupt 0
  101. {
  102.         count++;
  103. }

  104. void time0() interrupt 1
  105. {
  106.         uchar m;
  107.         TH0=0x3c;
  108.         TL0=0xb0;         //50ms
  109.         m++;
  110.         if(m>=10)
  111.         {
  112.                 m=0;
  113.                 Mileage=Mileage+Velocity*500/36;                 //里程m=速度km/h*1000*5/3.6
  114.                 Velocity=count/5;//將100ms內(nèi)的脈沖數(shù)
  115.                 count=0;               


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

下載:
仿真圖.zip (3.65 MB, 下載次數(shù): 118)




作者: ATKL    時(shí)間: 2018-5-9 17:02
請(qǐng)問測(cè)速程序怎么理解
作者: 838245178    時(shí)間: 2018-5-14 11:56
為什么我在proteus上運(yùn)行出錯(cuò),就是down下來直接運(yùn)行的
作者: 你大哥哥哥    時(shí)間: 2018-6-28 17:21
很好的程序!!
作者: 八一八一    時(shí)間: 2018-7-18 10:19
ATKL 發(fā)表于 2018-5-9 17:02
請(qǐng)問測(cè)速程序怎么理解

思路:定時(shí)器定時(shí)1S ,外部中斷檢測(cè)脈沖,定時(shí)器中斷,計(jì)算脈沖量。
作者: netyou    時(shí)間: 2019-7-26 16:12
有沒有原理圖、
作者: 2844304776    時(shí)間: 2020-4-18 22:43
學(xué)姐太棒了!




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