|
这个电脑USB接口害人不浅,供电能力也太弱了,终于找到问题所在了,USB接口供电不足,导致驱动超声波模块的时候电压不稳,芯片程序就容易跑飞,害的我折腾了这么久。这次的程序在上一次的基础上增加了一些东西,例如看门狗。探测的最远距离我设置的是三米,因为在没有考虑温度的情况下,三米内还是比较准确的,当探测距离超过三米时,数码管会显示999.9,好了,程序来了!!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位码
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点 段码
unsigned char code duan1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点段码
unsigned char display[8];
sbit MOSIO=P2^2;
sbit R_CL=P2^3;
sbit S_CL=P2^4;
sbit TRIG=P1^0;
sbit ECHO=P1^1;
sfr WDT_CONTR=0xe1;
bit flag;
float s;
int n;
int m;
int y;
int k=0;
void send595();//数据输入
void out595(void);//数据输出
void fashechaoshengbo();
void jisuan();
void delay();
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位码
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点 段码
unsigned char code duan1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点段码
unsigned char display[8];
sbit MOSIO=P2^2;
sbit R_CL=P2^3;
sbit S_CL=P2^4;
sbit TRIG=P1^0;
sbit ECHO=P1^1;
sfr WDT_CONTR=0xe1;
bit flag;
float s;
int n;
int m;
int y;
int k=0;
void send595();//数据输入
void out595(void);//数据输出
void fashechaoshengbo();
void jisuan();
void delay();
void main()
{ WDT_CONTR=0x33; //看门狗
ECHO=0;
TRIG=0;
TMOD=0x11; //设置计时器
TH0=0; //装定时器0初值
TL0=0;
EA=1; //开总中断
TH1=(65535-5000)/256;
TL1=(65535-5000)%256;
ET0=1;//开定T0中断
TR1=1; //启动定时器0
ET1=1; //开T1中断
while(1)
{
while(!ECHO);
TR0=1;
while(ECHO);
TR0=0;
jisuan();
WDT_CONTR=0x33; //喂狗
}
}
void send595() //数据输入
{
unsigned char a,b,c;
if(a==0)
{a++;
c=wei[m];
for(b=0;b<8;b++)
{
MOSIO=c&0x80;
c<<=1;
S_CL=0;
S_CL=1;}
}
if(a==1)
{
a--;
if(m==1)
{c=duan1[display[m]];}
else {c=duan[display[m]];}
for(b=0;b<8;b++)
{
MOSIO=c&0x80;
c<<=1;
S_CL=0;
S_CL=1;}
}
m++;
if(m==y)
m=0;
}
void out595(void) //数据输出
{
R_CL=0;
delay();
R_CL=1;
}
void fashechaoshengbo()
{
TRIG=1;//发射
delay();
TRIG=0;
}
void jisuan()
{long r;
r=TH0*256+TL0;
TH0=0;
TL0=0;
r=r*1.09;
s=0.017*r;
if(s>400||flag==1)
{
s=999.9;
flag=0;
}
n=s*10;
display[3]=n/1000;
display[2]=(n%1000)/100;
display[1]=((n%1000)%100)/10;
display[0]=((n%1000)%100)%10;
if(s<10)y=2;
if(s>10&&s<100)y=3;
if(s>100&&s<1000)y=4;
}
void T1_time()interrupt 3
{
TH1=(65535-5000)/256;
TL0=(65535-5000)%256;
send595();
out595();
k++;
if(k==30) //150ms发射一次
{
k=0;
fashechaoshengbo();
}
}
void T0_time()interrupt 1
{
flag=1; //T0中断溢出标志位
}
void delay()
{int i;
for(i=0;i<10;i++);
}
|
|