liuziang66 发表于 2013-2-28 21:25:16

请教1T和12T单片机的程序问题

我写了一个超声波测距的程序,定时器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={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=10;
    disbuff=10;
    disbuff=10;
}
else
{
    disbuff=S/100;
    disbuff=S%100/10;
    disbuff=S%10;
}
}
void display()
{
P2=i;
    P0=table];
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;
   }
}
请大大们帮忙看下,我实在是不理解哪里出错了,用这个单片机运行原来的定时器程序时,都可以正常的运行。

hamipeter 发表于 2013-3-1 00:08:50

楼主的延时函数很难保证精确,建议改为定时器计时!
页: [1]
查看完整版本: 请教1T和12T单片机的程序问题