|
本帖最后由 51黑电子会员 于 2020-4-8 21:32 编辑
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit qiting=P3^0;//定义启停按键
- uchar qitingnum;//定义启停次数变量
- uint count;//定时器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);//显示速度函数
- }
- if(qitingnum==2)//判断启停次数变量是否为2
- {
- // write_1602com(0x08);//关LCD1602液晶显示器显示
- P2=0xff;//关数码管显示位
- P1=0x00;//关数码管数值显示
- qitingnum=0;//启停次数变量置0
- }
- }
- /**定时器0、计数器1初始化子程序**/
- void Time0_Time1_init()
- {
- TMOD=0X51;//模式选定时器0、计数器1,工作方式选定时器0定时模式1、计数器1计数模式1。
- TH0=(65536-50000)/256;//定时器0高8位定时50毫秒
- TL0=(65536-50000)%256;//定时器0低8位定时50毫秒
- TH1=0;//计数器1高8位计数初值为0
- TL1=0;//计数器1低8位计数初值为0
- EA=1;//打开总中断
- ET0=1;//打开定时器0的中断
- TR0=1;//打开定时器0
- ET1=1;//打开计数器1的中断
- TR1=1;//打开计数器1
- }
- /**主函数**/
- void main()
- {
- Time0_Time1_init();//定时器0、计数器1初始化子程序
- while(1)
- {
- keyscan();//按键扫描函数
- }
- }
- /**定时器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秒钟。
- {
- count=0;//定时器0定时中断次数变量清0
- TR1=0;//关计数器1,开始统计1秒钟内,霍尔元件发送的脉冲个数。
- speed=TH1*256+TL1;//表示计数器1计数霍尔元件发送的脉冲个数,即转速:转/秒。
- TH1=0;//计数器1高8位计数清0,为了下一次计数。
- TL1=0;//计数器1低8位计数0,为了下一次计数。
- TR1=1;//开计数器1,为了下一次统计1秒钟内,霍尔元件发送的脉冲个数。
- }
- }
复制代码
|
评分
-
查看全部评分
|