KST-51单片机超声波测距程序。数码管显示最大9000多!并且数字2会错误显示。求大神解答

//晶振11.0592MHz#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbittrig... //晶振11.0592MHz
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig = P0^2;
sbit echo = P3^3;
int dis;

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char LedBuff[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

unsigned char code LedChar[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
void delay_20us()
{
uchar bt ;
for(bt = 0;bt<100;bt++); //此处100太大改为10即可
}

void TIM1init(void)//定时器1初始化
{
TMOD=0x11;//定时器1工作方式2,TH1是重装值,TL1是初值
TH1=0x00; //重载值 溢出一次约50us
TL1=0x00; //初始化值
}

void test(void)
{
//因为超声波最大测量4m当计时器计满时
//实际距离已经超过4m了所以此处不要用中断
EA = 1;
TH1 = 0X00;
TL1 = 0X00;
trig = 1;
delay_20us();
trig = 0;
EX1 = 1;
while(!echo);
TR1 = 1;
//最好不要用下降沿中断检测高电平时间,
//因为在进中断函数之前会产生很多压栈
//动作会产生比较大的误差
while(echo);
TR1 = 0;

//下面计算的是米,单位自己换算一下就行了
dis =(TH1 * 256 + TL1) * 0.17f; //(TH1 * 256 + TL1) * 340 / 2 / 1000;

}

void main(void)
{
unsigned char i = 0;
unsigned int cnt = 0;
ENLED = 0;
ADDR3 = 1;
TIM1init();
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
while(1)
{

if(TF0 == 1)
{
TF0 = 0;
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
if(cnt>=600)
{
cnt = 0;
LedBuff[0] = LedChar[dis%10];
LedBuff[1] = LedChar[dis/10%10];
LedBuff[2] = LedChar[dis/100%10];
LedBuff[3] = LedChar[dis/1000%10];
}

P0 = 0xFF;
switch(i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1];break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2];break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i=0; P0=LedBuff[3];break;

default:break;
}
test();
}
}
}
展开
 我来答
匿名用户
2015-10-02
展开全部
/*******************************************************
* 程序名称:main.c
* 程序功能:主程序文件
* 程序作者:吴鉴鹰
* 创建时间:2014-3-10
* 修改时间:
* 程序版本:V0.1
******************************************************/
/*
* 包含的头文件
*/
#include "reg51.h"
#include "inc/hc595.h"
#include "inc/delay.h"
#include "intrins.h"

/* 存储待发送的数据 */
code unsigned char ucDataOneTab[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
code unsigned char ucDataTwoTab[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x02, 0x04, 0x08, 0x10, 0x20,0x40,0x80};
//code unsigned char ucDataOneTab[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
//code unsigned char ucDataTwoTab[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x40, 0x20, 0x10, 0x08, 0x04,0x02,0x01};
/******************************************************
* 函数名称:main
* 函数功能:主函数
* 入口参数:void
* 出口参数:
*******************************************************/
int main()
{
unsigned int i;

while (1)
{
for (i = 0; i < 16; i++ ) //改成16个依次亮i<8改成i<16
{
SendData(ucDataOneTab[i], ucDataTwoTab[i]);
Delay1ms(1000);
}
}
return 0;
}
追问
兄弟,你这个不对吧,差的有点多呀。
做而论道
高能答主

2015-10-02 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
程序中,有两处 TMOD = XXH,互相冲突。
------------------
if(TF0 == 1)----T0溢出一次
{
……
cnt++;----次数
if(cnt>=600)----T0溢出600次
{
cnt = 0;
LedBuff[0] = LedChar[dis%10];--这才更新一次显示
……
}
……
switch(i)------显示一位
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
……
}
test();----测量一次,得到了 dis
}

T0 每溢出一次,就测量一次 dis,
但是当 T0 溢出 600 次,才显示出来 dis ?
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式