#include<reg52.h>
#include<intrins.h> //包含_nop_()的头文件
/***********************************************/ //定义数码管显示
unsigned char code d8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管段选
unsigned char code g8[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //数码管个位+小数点
unsigned char code w8[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管位选
/***********************************************/ //定义数码管显示变量
unsigned char bai,shi,ge,xiao; //定义数码管显示的百位、十位、个位、小数位
float distance; //定义储存距离的变量
unsigned int outcomel,outcomeh; //定义储存计时器高八位和低八位的变量
/*************************超声波模块引脚定义******************************/
***it TX=P3^2; //触发引脚
***it RX=P3^3; //应答引脚
/********************一毫秒基准延时函数****************************/
void delay1ms(unsigned int i) //1ms基准延时函数
{
unsigned char j;
while(i--)
{
for(j=1;j<=115;j++)
{
;
}
}
}
/**************20us延时函数**********************************************/
void delay_20us()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/**********************距离数据处理函数*********************************/
void chulidate()
{
distance=distance*10;
bai=distance/1000; //取出距离的百位
shi=(distance-(bai*1000))/100; //取出距离的十位
ge=(distance-(bai*1000+shi*100))/10; //取出距离的个位
xiao=distance-bai*1000-shi*100-ge*10; //取出距离的小数位
}
/***************数码管显示函数****************************************/
void shumaguandisplay()
{
P2=0xef; //点亮百位数码管
P0=d8[bai]; //显示百位数
delay1ms(1);
P2=0xdf; //点亮十位数码管
P0=d8[shi]; //显示十位数
delay1ms(1);
P2=0xbf; //点亮个位数码管
P0=g8[ge]; //显示个位数
delay1ms(1);
P2=0x7f; //点亮小数位数码管
P0=d8[xiao]; //显示小数位数
delay1ms(1);
}
/*******************************主函数**************************/
void main()
{
unsigned char i;
TX=0; //首先对控制引脚拉低脉冲
TMOD=0x01; //定时器0,采用16位定时器
IT1=1; //外部中断1采用负跳变触发
EA=1; //打开总中断
TH0=0;
TL0=0; //给定时器赋初值
while(1)
{
TX=1;
delay_20us();
TX=0; //在触发引脚产生一个20us的脉冲
while(RX==0); //等待RX引脚变成高电平
EX1=1; //打开中断1
ET0=1; //打开定时器0
TR0=1; //启动定时器
delay1ms(70); //等待超声波模块响应
distance=((outcomel+outcomeh*256)/2)*0.034; //计算出距离值
chulidate(); //调用数值处理函数
for(i=0;i<200;i++)
{
shumaguandisplay();
}
}
}
/*******************外中断1函数***********************/
INT1_() interrupt 2 // 外部中断是2号
{
outcomel=TH0; //取出高8位值
outcomeh=TL0; //取出低8位值
TR0=0; //关闭定时器
EX1=0; //关闭外部中断1
EA=0; //关闭总中断
TH0=0;
TL0=0; //给定时器重新赋初值
}
希望大神指导一下我的错误,这条程序显示的数据不对