我自己编的超声波测距51单片机c语言编程错哪了,,感觉延时很久数码管才有反应,哪个地方导致的延时

/************************************************************************************... /***********************************************************************************************************/
//晶振:12M
//接线:
//数码管:共阳数码管P0接数据口,P2.1 P2.2 P2.3接选通数码管
/***********************************************************************************************************/
#include <AT89x51.H> //器件配置文件
#include <intrins.h>
#define EC P1_1
#define TR P1_0//发送大于10US信号的端口
#define uchar unsigned char
#define uint unsigned int
sbit LED=P1^7;
sbit buzzer=P1^6;

uint distance,tl,th, M,n,a1;
uint time=0;
uint timer=0;
uchar posit=0;
unsigned long S=0;
bit flag =0;
unsigned char code smg[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void zhishideng(uint N);
void Delayms(uint xms);
void delay_20us(void );
void Conut(void);
void jinbao(void);
void delay_20us(void )
{
uchar a ;
for(a=0;a<100;a++);
}
void Delayms(uint xms)
{
uint i, j;

for (i=xms;i>0;i--) //xms即延时约xms毫秒

for (j=110;j>0;j--);
}

void delay(uint a2 )
{
while(a2--);
}

void zhishideng(uint N)
{

LED=1;
Delayms(N); // 调用延时程序
LED=0;
}
void jinbao(void){
if(distance<30)//蜂鸣器警报
{
buzzer=0;
Delayms(50);
buzzer=1;
Delayms(50);
buzzer=0;
Delayms(50);
buzzer=1;
Delayms(10);

}
else buzzer=1;
zhishideng( distance); //LED灯警示
}

void display(void ){
if(distance>=10000)
{P0=0x40;
P2=0xf0;
Delayms(500);
}
else if(distance<10000){
for (n=3;n>0;n--){
P2=0xff;
P0=smg[distance/1000];
P2=0xfe; //位选
delay(20);

P2=0xff;
P0=smg[distance%1000/100];
P2=0xfd; //位选
delay(200);

P2=0xff;
P0=smg[distance%1000%100/10];
P2=0xfb;
delay(200);
P2=0xff;
P0=smg[distance%1000%100%10];
P2=0xf7;
delay(200);
}
}
}
void T1_time() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=(65536-800)/256; //800ms定时
TL1=(65536-800)%256;
display();
TR=1; //800MS 启动一次模块
delay_20us();
TR=0;

}
/*********************************************************/

void main( void )

{
TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=(65536-800)/256; //800ms定时
TL1=(65536-800)%256;
ET1=1; //允许T1中断
TR1=1; //开启定时器
EA=1; //开启总中断
distance=0;
while(1)
{
while(!EC); //当RX为零时等待中断发生时发出超声波使能信号
TR0=1; //开启计数
while(EC); //当RX为1计数并等待
TR0=0; //关闭计数
time=TH0*256+TL0;
TH0=0;
TL0=0;
distance=time*0.017; //厘米
jinbao();
}

}
是共阴极数码管,,打错了,超声波模块是US-100
展开
 我来答
找她的那个他
2015-06-05 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:64
采纳率:0%
帮助的人:45.5万
展开全部
TH1=(65536-800)/256; //800ms定时
TL1=(65536-800)%256;
这样的赋值是800ms?51定时器工作方式1在12M下最大定时是65.536ms吧
更多追问追答
追问
😱
为什么啊,不是两个八位数吗?高八位,低八位,共65536个数?
查晓筠0i5
2015-06-04 · TA获得超过2752个赞
知道大有可为答主
回答量:2.1万
采纳率:1%
帮助的人:4961万
展开全部
硬件呢 有原理图吗
更多追问追答
追问
没有仿真,我简易的画了下图,表示下意思,您看看

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式