基于51单片机定时器0计时外部中断0计数的霍尔传感器精确测速数码管显示测速的项目工程
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit qiting=P3^0;//定义启停按键 uchar qitingnum,flag_1s;//定义启停次数变量、1s标志位变量清零 uint count,pulse,quan;//定时器0定时中断次数变量、脉冲个数变量、圈数变量 unsigned long speed;//转速变量 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共阴数码管段码数字0~9字码表,高电平点亮数码管段码数字0~9。 /**ms级延时子程序**/ void delay(uint x) { uint i,j; for(i=0;i<x;i++) for(j=0;j<110;j++); } /**转速显示函数**/ void display(unsigned long speed) { if(speed<=99999) { uchar wan,qian,bai,shi,ge;//定义拆字变量 wan=speed/10000;//转速/10000得到万位 qian=speed%10000/1000;//转速/10000的余数/1000得到千位 bai=speed%1000/100;//取得百位 shi=speed%100/10;//取得十位数字 ge=speed%10;//取得个位数字 P2=0xfd;//数码管万位显示位 P1=table[wan];//数码管万位数值显示 delay(2);//延时 P2=0xfb;//数码管千位显示位 P1=table[qian];//数码管千位数值显示 delay(2);//延时 P2=0xf7;//数码管百位显示位 P1=table[bai];//数码管百位数值显示 delay(2);//延时 P2=0xef;//数码管十位显示位 P1=table[shi];//数码管十位数值显示 delay(2);//延时 P2=0xdf;//数码管个位显示位 P1=table[ge];//数码管个位数值显示 delay(2);//延时 } } /**按键扫描程序**/ void keyscan()//按键扫描函数 { if(qiting==0)//判断启停键是否按下 { // delay(5); display(speed); if(qiting==0)//判断启停键是否再次按下 { qitingnum++;//启停次数变量加加 // while(!qiting);//等待启停键松开 while(!qiting)//等待启停键松开 display(speed); // lcd_init();//LCD1602液晶显示器初始化函数 } } if(qitingnum==1)//判断启停次数变量是否为1 { display(speed);//显示速度函数 TR0=1;//打开定时器0 } if(qitingnum==2)//判断启停次数变量是否为2 { // write_1602com(0x08);//关LCD1602液晶显示器显示 P2=0xff;//关数码管显示位 P1=0x00;//关数码管数值显示 qitingnum=0;//启停次数变量置0 TR0=0;//关闭定时器0 } } /**定时器0、外部中断0初始化子程序**/ void Time0_Int0_init() { TMOD=0X01;//模式选定时器0工作方式1 TH0=(65536-50000)/256;//定时器0高8位定时50毫秒 TL0=(65536-50000)%256;//定时器0低8位定时50毫秒 EA=1;//打开总中断 IT0=1;//外部中断0为下降沿中断 EX0=1;//打开外部中断0 ET0=1;//打开定时器0的中断 TR0=0;//关闭定时器0 } /**主函数**/ void main() { Time0_Int0_init();//定时器0、计数器1初始化子程序 while(1) { keyscan();//按键扫描函数 if(flag_1s==1)//判断1s标志位变量是否为1 { flag_1s=0;//1s标志位变量清零 display(speed);//转速显示函数 } } } /**外部中断0中断服务子程序**/ void Int0() interrupt 0 { pulse++;//脉冲个数变量 if(pulse==2) //两次外部中断脉冲,电机转一圈。 { quan++;//圈数变量加加 pulse=0;//脉冲个数变量置0 } } /**定时器0中断服务子程序**/ void Timer0() interrupt 1 { TH0=(65536-50000)/256;//重装定时器0高8位定时50毫秒 TL0=(65536-50000)%256;//重装定时器0低8位定时50毫秒 count++;//定时器0定时中断次数变量加加 if(count==20)//判断定时器0定时中断次数变量是否等于20,即1秒钟。 { EX0=0;//关闭外部中断0,开始统计1秒钟内,霍尔元件发送的脉冲个数。 count=0;//定时器0定时中断次数变量清0 speed=quan;//外部中断0计数霍尔元件发送的脉冲个数为2个算一圈,即转速:转/秒,如果quan乘以60表示转/分。 quan=0;//初始化圈数,为了下一次统计1秒钟内,霍尔元件发送的脉冲个数。 flag_1s=1;//1s标志位变量置1 TH0=(65536-50000)/256;//重装定时器0高8位定时50毫秒 TL0=(65536-50000)%256;//重装定时器0低8位定时50毫秒 EX0=1;//打开外部中断0,开始计算霍尔元件发送的脉冲个数。 } }
版权声明:本文为AChenWeiqiangA原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。