标题:
大佬们帮忙看一下这单片机程序呗,不知道为什么不循环
[打印本页]
作者:
shuzhi990
时间:
2019-1-29 21:31
标题:
大佬们帮忙看一下这单片机程序呗,不知道为什么不循环
超声波只能启动一次,数值都不变了
请问各位这是什么原因呢
#include<reg52.h>
#include<intrins.h>
sbit TRIG=P2^6;
sbit ECHO=P2^7;
sbit zuo0=P2^0;
sbit zuo1=P2^1;
sbit zuo2=P2^2;
sbit zuo3=P2^3;
sbit clk=P1^2;
sbit cs=P1^1;
sbit din=P1^0;
unsigned char i=0;
unsigned int dis;
unsigned int t;
unsigned char flag=0;
unsigned int timer=0;
unsigned char code LedChar[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
unsigned char LedBuff[]=
{
0xff,0xff,0xff,0xff
};
unsigned char code disp1[]=
{
0x04,0x22,0x44,0x40,0x40,0x44,0x22,0x04,
};
unsigned char code disp2[]=
{
0x00,0x22,0x12,0x10,0x10,0x12,0x22,0x00
};
void delay(unsigned int x)
{
unsigned char i;
unsigned char j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
void write_byte(unsigned char Data)
{
unsigned char i;
cs=0;
for(i=8;i>=1;i--)
{
clk=0;
din=Data&0x80;
Data=Data<<1;
clk=1;
}
}
void write(unsigned add,unsigned char dat)
{
cs=0;
write_byte(add);
write_byte(dat);
cs=1;
}
void chushi()
{
write(0x09,0x00);
write(0x0a,0x03);
write(0x0b,0x07);
write(0x0c,0x01);
write(0x0f,0x00);
}
void open()
{
TRIG=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG=0;
}
void jisuan()
{
TH1=0;
TL1=0;
while(!ECHO);
TR1=1;
while(ECHO);
TR1=0;
t=TH1*256+TL1;
dis=(t*1.7)/100;
if(dis>420)
{
dis=0;
flag=0;
LedBuff[0]=LedChar[15];
LedBuff[1]=LedChar[15];
LedBuff[2]=LedChar[15];
LedBuff[3]=LedChar[15];
}
else
{
LedBuff[0]=LedChar[dis%10];
LedBuff[1]=LedChar[dis/10%10];
LedBuff[2]=LedChar[dis/100%10];
LedBuff[3]=LedChar[dis/1000%10];
}
}
void xianshixiao()
{
unsigned char i;
delay(50);
chushi();
for(i=1;i<9;i++)
write(i,disp1[i-1]);
delay(1000);
}
void xianshiku()
{
unsigned char i;
delay(50);
chushi();
for(i=1;i<9;i++)
write(i,disp2[i-1]);
delay(1000);
}
void main ()
{
TMOD=0x11;
TR0=1;
EA=1;
ET0=1;
ET1=1;
while(1)
{
TH0=0XFC;
TL0=0X67;
open();
jisuan();
if(dis<=10)
{
xianshixiao();
}
else
{
xianshiku();
}
}
}
void timer1() interrupt 1
{
TH0=0XFC;
TL0=0X67;
P0=0XFF;
switch(i)
{
case 0: zuo0=1;zuo1=1;zuo2=1;zuo3=0;i++;P0=LedBuff[0];break;
case 1: zuo0=1;zuo1=1;zuo2=0;zuo3=1;i++;P0=LedBuff[1];break;
case 2: zuo0=1;zuo1=0;zuo2=1;zuo3=1;i++;P0=LedBuff[2];break;
case 3: zuo0=0;zuo1=1;zuo2=1;zuo3=1;i=0;P0=LedBuff[3];break;
}
timer++;
}
void timer0() interrupt 3
{
flag=1;
}
复制代码
作者:
yfpc2006
时间:
2019-1-30 08:30
楼主厉害,一个注释都没有,别人看起来会很累!~
作者:
HC6800-ES-V2.0
时间:
2019-1-30 09:18
不知道你用的哪款超声波传感器,我用的HC-SR04款,这个说明书上说:
为了不影响发波与回波的干扰,需要间隔60ms以上再发波。
从你的程序中,没有看到这样的设置,一直不停地发波,间隔时间可能小了。
我的程序是这样的:
void zd3() interrupt 3//T1中断用来扫描数码管显示和计200MS启动模块,发射超声波
{
TH1=0xf8;//重装初值
TL1=0x30;
DigDisplay();//调用显示
timer++;
if(timer>=50)
{
timer=0;
TX=1;//100MS启动一次模块。启动模块,就是控制端发出一个10us以上的高电平脉冲
//此处发了15us的高电平脉冲
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
把程序改一下看看。
作者:
tw081531
时间:
2019-1-30 09:29
你的中断看哈是不是有点问题
作者:
佛云
时间:
2019-1-30 10:12
行139的
TH0=0XFC;
TL0=0X67;
嵌在while循环里面,不停的给定时器赋初值
作者:
IdeaMing
时间:
2019-1-30 10:47
可能是一直卡在定时器0刷新显示了。
作者:
541611503
时间:
2019-1-30 12:24
可能卡在定时器0里了
作者:
shuzhi990
时间:
2019-1-30 14:55
HC6800-ES-V2.0 发表于 2019-1-30 09:18
不知道你用的哪款超声波传感器,我用的HC-SR04款,这个说明书上说:
为了不影响发波与回波的干扰,需要间 ...
好的 十分感谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1