资源描述:
《测速与显示程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、#include #defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlonguchara,b,c,d;#defineLED_DATP0sbitpin_SpeedSenser=P3^5;//速度传感器脉冲信号输出端接在T1上#defineTIME_CYLC100//12M晶振,定时器10ms中断一次我们1秒计算一次转速,1000ms/10ms=100#definePLUS_PER2//码盘的齿数,这里假定码盘上有2个齿,即传感器检测到2个脉冲,认为
2、1圈#defineK1.0 //校准系数sbitzhen1=P1^0;sbitfan1=P1^1;sbiten1=P1^2;ucharcodeloops[]={0x7f,0xbf,0xdf,0xef}; //定义显示位控制驱动码ucharcodetable[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05}; //0,1,2,3,4,5,6,7,8,97段码表,这个单片机开发板上的LED数码管的接法和一般的有点不一样,这个表是正确的,已经测试过了 uintTc
3、ounter=0; //时间计数器bitFlag_Fresh=0;//刷新标志bitFlag_clac=0;//计算转速标志bitFlag_Err=0;//超量程标志//在数码管上显示一个四位数voidDisplayFresh();//计算转速,并把结果放入数码管缓冲区voidClacSpeed();//初始化定时器voidinit_timer();//延时函数voidDelay(uintms);voidit_timer0()interrupt1//定时器0中断的响应函数{TF0=0; //定时器T0用于数码管的动态刷新 TH0=0xD8;
4、 //初始化TL0=0xF0;4Flag_Fresh=1;Tcounter++;if(Tcounter>TIME_CYLC){ Flag_clac=1;//周期到,该重新计算转速了}}voidit_timer1()interrupt3//中断地址是0x001b{TF1=0; //定时器T1用于单位时间内收到的脉冲数,要速度不是很快,T1永远不会益处Flag_Err=1; //如果速度很高,我们应考虑另外一种测速方法:脉冲宽度算转速}voidmain(void){init_timer();while(1){ zhen1=1;
5、 fan1=0; en1=1; Delay(30); en1=0; Delay(170); if(Flag_Fresh) { Flag_Fresh=0; DisplayFresh(); //定时刷新数码管显示 } if(Flag_clac) { Flag_clac=0; ClacSpeed();//计算转速,并把结果放入数码管缓冲区 Tcounter=0;//周期定时清零 TH1=TL1=0x00;//脉冲计数清零 } if(Flag_Err) //超量程处
6、理 { //数码管显示字母'EEEE',开机时初始化为00004 a=0x2c; b=0x2c; c=0x2c; d=0x2c; while(1) { DisplayFresh();//等待复位,不再测速 } }}}//在数码管上显示一个四位数voidDisplayFresh(){ P2=loops[0]; LED_DAT=table[a]; Delay(20); P2=loops[1]; LED_DAT=t
7、able; Delay(20); P2=loops[2]; LED_DAT=table[c]; Delay(20); P2=loops[3]; LED_DAT=table[d]; Delay(20);}//计算转速,并把结果放入数码管缓冲区voidClacSpeed(){ uintspeed; ulongPlusCounter; PlusCounter=TH1*256+TL1; speed=K*(PlusCounter/PLUS_PER);//K是校准系