我自己编的超声波测距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 展开
//晶振: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 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |