资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
#include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long#define LED_DAT P0#define LED_ON() P30 = 0;#define LED_OFF() P30 = 1;/sbit out=P14;sbit beep=P23;sbit LED_SEG0 = P27;sbit LED_SEG1 = P26;sbit LED_SEG2 = P25;sbit LED_SEG3 = P24;/sbit pin_SpeedSenser = P35; /光电传感器信号接在T1上#define TIME_CYLC 100 /12M晶振,定时器10ms 中断一次 我们1秒计算一次转速 / 1000ms/10ms = 100 4444#define PLUS_PER 6 /码盘的齿数 ,这里假定码盘上有6个齿,即传感器检测到6个脉冲,认为1圈 4444444444#define K 74.0 /校准系数uchar low=40;uchar high=55;uchar lowset2;uchar highset2;uint speed=0;uchar once=0;unsigned char code table=0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xE0; uchar data Disbuf4;/ 显示缓冲区 uint Tcounter = 0; /时间计数器bit Flag_Fresh = 0; / 刷新标志 bit Flag_clac = 0; /计算转速标志 bit Flag_Err = 0; /超量程标志 unsigned char key;unsigned char KeyScan(void);void Delay_ms(unsigned int n);void Beep(void);/在数码管上显示一个四位数 void DisplayFresh();/计算转速,并把结果放入数码管缓冲区 void ClacSpeed();/初始化定时器T0void init_timer0();/初始化定时器T1void init_timer1();/延时函数 void Delay(uint ms);void it_timer0() interrupt 1 /* interrupt address is 0x000b */TF0 = 0; /d定时器 T0用于数码管的动态刷新 /TH0 = 0xe0; /* init values */cTL0 = 0x00; Flag_Fresh = 1; Tcounter+; if(TcounterTIME_CYLC) Flag_clac = 1;/周期到,该重新计算转速了 void it_timer1() interrupt 3 /* interrupt address is 0x001b */TF1 = 0; /定时器T1用于单位时间内收到的脉冲数 /要速度不是很快,T1永远不会益处Flag_Err = 1; /如果速度很高,我们应考虑另外一种测速方法,:脉冲宽度算转速 void main(void)uchar i=0;Disbuf0 = 0; /开机时,初始化为0000Disbuf1 = 0; Disbuf2 = 0;Disbuf3 = 0;init_timer0();init_timer1();while(1)key=KeyScan();if(key!=0xff)/有键按下 if(key=10) while(KeyScan()!=0xff);/手离开 for(i=0;i2;i+) while(KeyScan()=0xff);lowseti=KeyScan();while(KeyScan()!=0xff); low=lowset0*10+lowset1;while(KeyScan()!=12)Disbuf2=lowset0; Disbuf3=lowset1;DisplayFresh(); if(key=11) while(KeyScan()!=0xff);/手离开 for(i=0;i2;i+) while(KeyScan()=0xff);highseti=KeyScan();while(KeyScan()!=0xff); high=highset0*10+highset1;while(KeyScan()!=12)Disbuf2=highset0; Disbuf3=highset1;DisplayFresh(); if(Flag_Fresh) Flag_Fresh = 0; DisplayFresh(); / 定时刷新数码管显示 if(Flag_clac) Flag_clac = 0; ClacSpeed(); /计算转速,并把结果放入数码管缓冲区if(once) if(speedhigh) beep=0;LED_ON();/out=0;else beep=1;LED_OFF();/out=1; else beep=1;/out=1; Tcounter = 0;/周期定时 清零 TH1=TL1 = 0x00;/脉冲计数清零 if(Flag_Err) /超量程处理 /数码管显示字母EEEE Disbuf0 = 0x9e; /开机时,初始化为0000 Disbuf1 = 0x9e; Disbuf2 = 0x9e; Disbuf3 = 0x9e; while(1) DisplayFresh();/不再测速 等待复位i /在数码管上显示一个四位数void DisplayFresh()P2 |= 0xF0;LED_SEG0 = 0;LED_DAT = tableDisbuf0;Delay(1);P2 |= 0xF0;LED_SEG1 = 0;LED_DAT = tableDisbuf1;Delay(1);P2 |= 0xF0;LED_SEG2 = 0;LED_DAT = tableDisbuf2;Delay(1);P2 |= 0xF0;LED_SEG3 = 0;LED_DAT = tableDisbuf3;Delay(1);P2 |= 0xF0;/计算转速,并把结果放入数码管缓冲区void ClacSpeed()uint PlusCounter;PlusCounter = TH1*256 + TL1;speed = (K/100)*(PlusCounter/PLUS_PER);/K是校准系数,如速度不准,调节K的大小Disbuf0 = (speed/1000)%10; Disbuf1 = (speed/100)%10; Disbuf2 = (speed/10)%10;Disbuf3 = speed%10; if(speed!=0) once=1; else once=0;/初始化定时器T0void init_timer0()TMOD &= 0xf0; /定时10毫秒 /* Timer 0 mode 1 with software gate */TMOD |= 0x01; /* GATE0=0; C/T0#=0; M10=0; M00=1; */TH0 = 0xC0; /* init values */TL0 = 0x00; ET0=1; /* enable timer0 interrupt */EA=1; /* enable interrupts */TR0=1; /* timer0 run */延时函数 void Delay(uint ms)uchar i;while(ms-) for(i=0;i100;i+);/初始化定时器T1void init_timer1()TMOD &= 0x0F; /* Counter 1 mode 1 with software gate */TMOD |= 0x50; /* GATE0=0; C/T0#=1; M10=0; M00=1; */TH1 = 0x00; /* init values */TL1 = 0x00; ET1=1; /* enable timer1 interrupt */EA=1; /* enable interrupts */TR1=1; /* timer1 run */unsigned char KeyScan(void) unsigned char KeyValue=0;unsigned char Scan_Row;unsigned char Scan_Column;P1=0x0F; Scan_Row=P1; if(Scan_Row&0x0F)!=0x0F)Delay_ms(20);Scan_Row=P1;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号