我写了一个超声波测距的程序,定时器1每间隔200ms使P1.0发送10us的高电平(此超声波测距模块需要输入最少10US的高电平才有反馈),超声波模块检测到返回的波时,反馈给单片机P1.1口一个高电平,用反馈的高电平的时间来计算距离。用普通的12T的51单片机来运行程序,显示和测距都正常,用1T的增强型51单片机 STC12C5A60S2来运行相同的程序时,已经把12C5A60S2程序中的延时换成1T模式下的10US以上的时间,运行后,测距不更新,貌似是超声波模块没有反馈给单片机信号。我把程序发上来,麻烦大大们帮忙看下。
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag;
uint num;
uchar i=0;
uint time=0;
unsigned long S=0;
sbit TX=P1^0;
sbit RX=P1^1;
uchar disbuff[4]={10,10,10,10};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void delay(uint z)//12C5A60S2单片机1T模式下 @11.0952MHz //延时子函数
{
uint a,b,c;
for(a=z;a>0;a--)
for(b=10;b>0;b--)
for(c=85;c>0;c--);
}
void delay20us(void) //误差 -0.016637731481us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=52;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void conut()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
if((S>=700)||flag==1)
{
flag=0;
disbuff[0]=10;
disbuff[1]=10;
disbuff[2]=10;
}
else
{
disbuff[0]=S/100;
disbuff[1]=S%100/10;
disbuff[2]=S%10;
}
}
void display()
{
P2=i;
P0=table[disbuff[i]];
i++;
if(i==3) i=0;
}
void main()
{
TX=0;
RX=0;
TMOD=0x11;
TH0=0;
TL0=0;
TH1=0xf8;
TL1=0x30;
EA=1;
ET0=1;
ET1=1;
TR1=1;
while(1)
{
while(!RX);
TR0=1;
while(RX);
TR0=0;
conut();
}
}
void timer0() interrupt 1
{
flag=1;
}
void timer1() interrupt 3
{
TH1=0xf8;
TL1=0x30;
display();
num++;
if(num>=100)
{
num=0;
TX=1;
delay20us(); //与普通的51唯一的区别就是这个延时,把51的延时换成1T的单片机的延时。
TX=0;
}
}
请大大们帮忙看下,我实在是不理解哪里出错了,用这个单片机运行原来的定时器程序时,都可以正常的运行。
|