打印

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

[复制链接]
2654|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuziang66|  楼主 | 2013-2-28 20:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一个超声波测距的程序,定时器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;
  }
}
请大大们帮忙看下,我实在是不理解哪里出错了,用这个单片机运行原来的定时器程序时,都可以正常的运行。

相关帖子

沙发
acgean| | 2013-2-28 20:28 | 只看该作者
运行后,测距不更新,会不会是显示硬件跟不上单片机速度导致的?

使用特权

评论回复
板凳
liuziang66|  楼主 | 2013-2-28 21:08 | 只看该作者
acgean 发表于 2013-2-28 20:28
运行后,测距不更新,会不会是显示硬件跟不上单片机速度导致的?

我用一根掉线连到VCC 另一端瞬间接触P1.1一下 数字立即更新。会是跟不上速度么。

使用特权

评论回复
地板
liuziang66|  楼主 | 2013-2-28 21:26 | 只看该作者
求帮助

使用特权

评论回复
5
four_zhg| | 2013-2-28 22:19 | 只看该作者
用示波器直接看TX的输出有没有10us

使用特权

评论回复
6
airwill| | 2013-3-1 08:35 | 只看该作者
判断 显示硬件跟不上单片机速度, 可以先降低速度测试嘛
换低频率的晶振或者显示软件中加延时.

使用特权

评论回复
7
coody| | 2013-3-1 14:40 | 只看该作者
先示波器看下发出的信号是否是你要求的参数

使用特权

评论回复
8
liuziang66|  楼主 | 2013-3-1 14:58 | 只看该作者
four_zhg 发表于 2013-2-28 22:19 用示波器直接看TX的输出有没有10us

有,16us应该可以啊,而且还有反馈,io口检测不到。但是用vcc去碰检测口就可以变化。

使用特权

评论回复
9
liuziang66|  楼主 | 2013-3-1 15:00 | 只看该作者
coody 发表于 2013-3-1 14:40 先示波器看下发出的信号是否是你要求的参数

是啊,,而且还有反馈,io口检测不到。但是用vcc去碰检测口就可以变化。

使用特权

评论回复
10
four_zhg| | 2013-3-1 16:34 | 只看该作者
liuziang66 发表于 2013-3-1 14:58
有,16us应该可以啊,而且还有反馈,io口检测不到。但是用vcc去碰检测口就可以变化。 ...

你用VCC碰有变化说明程序转到检测脚了,超声波模块有可能反馈时间太短,程序转到TR0进行检测时信号就没有了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

34

帖子

0

粉丝