//电机转速表设计
#include<reg51.h> //包含单片机寄存器的头文件
unsigned char code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义字符数组显示数字
unsigned char data yy[2]={0,0} ;
unsigned int v; //储存电机转速
unsigned char count; //储存定时器T0中断次数
bit flag; //计满1秒钟标志位
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
/******************************************************************************
函数功能:延时
******************************************************************************/
void delay1ms(unsigned char m)
{
unsigned char i,j;
for(i=0;i<m;i--)
for(j=0;j<=110;j++)
;
}
/******************************************************************************
函数功能:显示数值
******************************************************************************/
void display_val(unsigned int x)
{
yy[9]=x/1000; //取千位
yy[8]=(x%1000)/100; //取百位
yy[7]=(x%100)/10; //取十位
yy[6]=x%10; //取个位
P3=0;
P30=1;
P2=tab1[yy[9]];
delay1ms(5);
P3=0;
P31=1;
P2=tab1[yy[8]];
delay1ms(5);
P3=0;
P32=1;
P2=tab1[yy[7]];
delay1ms(5);
P3=0;
P33=1;
P2=tab1[yy[6]];
delay1ms(5);
P3=0;
}
/*******************************************************
函数功能:主函数
********************************************************/
void main()
{
TMOD=0x51; //定时器T1工作于计数模式1,定时器T0工作于计时模式1;
TH0=(65536-46083)/256; //定时器T0的高8位设置初值,每50ms产生一次中断
TL0=(65536-46083)%256; //定时器T0的低8位设置初值,每50ms产生一次中断
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0
IT0=1;
count=0; //将T0中断次数初始化为0
while(1) //无限循环
{
TR1=1; //定时器T1启动
TH1=0; //定时器T1高8位赋初值0
TL1=0; //定时器T1低8位赋初值0
flag=0; //时间还未满1秒钟
while(flag==0) //时间未满等待
;
v=(TH1*256+TL1)*60/2; //计算速度,每周产生2个脉冲
display_val(v); //显示速度
}
}
/*******************************************************
函数功能:定时器T0的中断服务函数
********************************************************/
void Time0(void) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器
{
count++; //T0每中断1次,count加1
if(count==20) //若累计满20次,即计满1秒钟
{
flag=1; //计满1秒钟标志位置1
count=0; //清0,重新统计中断次数
}
TH0=(65536-46083)/256; //定时器T0高8位重新赋初值
TL0=(65536-46083)%256; //定时器T0低8位重新赋初值
} |