#include
#include
#define uchar unsigned char
#define uint unsigned int
***it trig=P2^1; //超声波触发控制
***it echo=P2^0; //超声波回响信号输出
***it we=P2^7; //位选
***it du=P2^6; //段选
uint juli = 0; //定义超声波距离
uchar dian0,dian1,dian2; //定义数码管显示数据
uint code tabledu[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x80,0x37}; //数码管显示
uint code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //控制第几个数码管显示
//void nop(uint a) //机器周期延时
//{
// uint x;
// for(x=a;x>0;x--)
// {
// _nop_();
// }
//}
void init() //初始化程序
{
we=0xff; //位选关闭
du=0x00; //段选关闭
TMOD=0x11; //开定时器0,1工作方式为方式1
TH1=(65535-55296)/256; //给定时器1赋初值,定时为60ms 晶振频率为11.0592MHZ
TL1=(65535-55296)%256;
TH0=0x00; //给定时器0赋初值
TL0=0x00;
EA=1; //开总中断
ET1=1; //开T1中断
TR1=1; //开定时器1
ET0=1; //开T0中断
TR0=0; //关定时器0
trig=0; //触发信号清零
echo=0; //回响信号清零
}
void delay (uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar dian0,uchar dian1,uchar dian2) //数码管显示函数
{
dian0=juli/100; //各个数码管赋值
dian1=juli/10%10;
dian2=juli%10;
P0=0xff; //消影
we=1; //开位选
P0=0xfe; //赋值
we=0; //关位选
P0=0x00; //消影
du=1; //开段选
P0=tabledu[dian0]; //赋值
du=0; //关段选
delay(7); //延时,让数码管亮一会
P0=0xff; //消影
we=1; //开位选
P0=0xfd; //赋值
we=0; //关位选
P0=0x00; //消影
du=1; //开段选
P0=tabledu[10]; //赋值
du=0; //关段选
delay(7); //延时,让数码管亮一会
P0=0xff; //消影
we=1; //开位选
P0=0xfb; //赋值
we=0; //关位选
P0=0x00; //消影
du=1; //开段选
P0=tabledu[dian1]; //赋值
du=0; //关段选
delay(7); //延时,让数码管亮一会
P0=0xff; //消影
we=1; //开位选
P0=0xf7; //赋值
we=0; //关位选
P0=0x00; //消影
du=1; //开段选
P0=tabledu[dian2]; //赋值
du=0; //关段选
delay(7); //延时,让数码管亮一会
P0=0xff; //消影
we=1; //开位选
P0=0xef; //赋值
we=0; //关位选
P0=0x00; //消影
du=1; //开段选
P0=tabledu[11]; //赋值
du=0; //关段选
delay(7); //延时,让数码管亮一会
P0=0xff; //消影
we=1; //开位选
P0=0xdf; //赋值
we=0; //关位选
P0=0x00; //消影
du=1; //开段选
P0=tabledu[11]; //赋值
du=0; //关段选
delay(7); //延时
}
void distance(float juli) //测试距离函数
{
float time;
trig=1; //触发超声波
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //延长十一个机器周期
trig=0;
while(echo==0);
TH0=0x00; //给定时器0赋初值
TL0=0x00;
TR0=1; //开定时器0
while(echo==1);
time=(TH0*256+TL0)*1.08; //读出定时器0的时间
TR0=0;
juli=time/58; //计算出距离
}
void main()
{
init(); //初始化函数
while(1)
{
dian0=juli/100; //各个数码管赋值
dian1=juli/10%10;
dian2=juli%10;
display(dian0,dian1,dian2);
}
}
void ultrasonic() interrupt 3
{
TH1=(65535-55296)/256; //定时器1重装初值
TL1=(65535-55296)%256;
distance(juli); //距离函数
}
void fuwe() interrupt 1
{
TH0=0x00; //给定时器0赋初值
TL0=0x00;
}
|