else /*有闪烁的时候*/ {
do {
if(z==zy) /*当前显示位和闪烁位重叠*/
{
*z=1; /*当前显示为置高*/ switch(*z) /*查询当前是哪位同时显示*/
{
case 0x90: P0=d_p[a];break; case 0x91: P0=d_p[b];break; case 0x92: P0=d_p[c];break; case 0x93: P0=d_p[d];break;
}
d_ms(50000); /*亮0.5S*/ *z=0; /*当前显示位置低*/ d_ms(50000); /*灭0.5S*/ }
z[0]=1; /*如前所示*/
P0=d_p[a]; d_ms(20); z[0]=0; z[1]=1; P0=d_p[b]; d_ms(20); z[1]=0; z[2]=1; P0=d_p[c]; d_ms(20);
33 / 37
z[2]=0; z[3]=1; P0=d_p[d]; d_ms(20);
z[3]=0;
}
while(1); } }
void cs() /*{
zs=count/8*100; /* 8 } void pwm()
/*pwm{
ulong a; /* a=zs/zssd; /* zkbd=a/(a+1);
zkbg=1-zkbd;
P16=1; /* d_ms(1000*zkbg); /* P16=0; /* d_ms(1000*zkbd); /*}
void stop() /*{ P0=0;
测速函数*/ 转速=count*(1000000/10000)转子每转一圈,每个传感器都会个脉冲产生*/ 输出函数*/
定义临时变量*/ 求占空比*/ 输出高电平*/ 延长时间*/ 输出低电平*/ 延长时间*/ 停止函数*/ 34 / 37
P1=0; P2=0; TR0=0; TR1=0; }
void main(void)
{
TMOD=0x5D; /*T1软件启动,T0软件+脉冲启动,T1计
数器,T0定时器
T1工作在方式1,T0工作在方式1*/
TCON=0x20; TH1=0x00;
TL1=0x00; TH0=0xD8; TL0=0xF0;
IE=0x82; /*中断允许总控制,禁止T1中断*/ keyget();
if(tag!=0) /*启动标志为1时*/ {
TR0=1; /*启动T0、T1*/ TR1=1; keyget();
display(p1);
pwm();
} }
void interrupt1() interrupt 1 using 0 /*中断服务程序*/
else stop();
35 / 37
{
TR1=0; /*关闭定时器T1*/ count=T1; /*统计T1的值*/ TH1=0X00; /*计数器清零*/ TL1=0X00;
TH0=0xD8; /*装入初值*/ TL0=0XF0;
TR1=1; /*开启T1*/
TR0=1; /*开启T0*/ }
图 21 程序调试成功
36 / 37