|
這個電腦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++);
}
|
|