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();
}
}
} 展开
#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;
}
* 程序名称: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;
}
追问
兄弟,你这个不对吧,差的有点多呀。
展开全部
程序中,有两处 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 ?
------------------
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 ?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询