题目:
示例程序:(reg52.h)
main.c
#include <REG52.H>
#include "intrins.h"
#include "stdio.h"
sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sbit TX=P1^0;
sbit RX=P1^1;
sfr P4=0xc0;
sbit L1=P3^0;
sbit L2=P3^1;
sbit L3=P3^2;
sbit L4=P3^3;
sbit R1=P4^4;
sbit R2=P4^2;
sbit R3=P3^5;
sbit R4=P3^4;
sbit LED3=P0^2;
void HC573(unsigned char channel,unsigned char value);
void Nixie(unsigned char column,unsigned char value);
void Delay(unsigned int x);
void System_init();
void Delay12us();
unsigned char code Array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
unsigned int Distance=0;//距离
unsigned int Distance_para=100;//距离参数
unsigned char Mode=0;//模式
unsigned char LEDstat=0xff;//灯光控制
unsigned int Count=0;//定时器0.2s计数
unsigned char Flag=0;//距离超过标志位
unsigned char LED3_Flag=1;//标志位
//超声波
void Send_wave()
{
unsigned char i;
for(i=0;i<8;i++)
{
TX=1;
Delay12us();
TX=0;
Delay12us();
}
}
void Time()
{
unsigned int temp;
TMOD=0x01;
TH1=0x00;
TL1=0x00;
TF1=0;
Send_wave();
TR1=1;
while((RX==1)&&(TF1==0));
TR1=0;
if(TF1==0)
{
temp=(TH1<<8)|TL1;
Distance=(temp/10)*17/100;
}
else
{
TF1=0;
Distance=999;
}
TH1=0;
TL1=0;
}
//参数页面
void Distance_para_D()
{
Nixie(1,0xc1);
Nixie(2,Array[2]);
Nixie(3,0xff);
Nixie(4,0xff);
Nixie(5,0xff);
Nixie(6,Array[Distance_para/100%10]);
Nixie(7,Array[Distance_para/10%10]);
Nixie(8,Array[Distance_para%10]);
}
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50;
AUXR |= 0x01;
AUXR &= 0xFB;
T2L = 0xE6;
T2H = 0xFF;
AUXR |= 0x10;
EA=1;
ES=1;
}
//超声波显示
void Display_Dis()
{
Nixie(1,0xc1);
Nixie(2,Array[1]);
Nixie(3,0xff);
Nixie(4,0xff);
Nixie(5,0xff);
Nixie(6,Array[Distance/100%10]);
Nixie(7,Array[Distance/10%10]);
Nixie(8,Array[Distance%10]);
}
//延时显示
void Delay_Display(unsigned int x)
{
while(x--)
{
Display_Dis();
}
}
//串口
void Send_Byte(unsigned char Dat)
{
SBUF=Dat;
while(TI==0);
TI=0;
}
//按键扫描
void Key_Scan()
{
L4=0;
L1=L2=L3=1;
R1=R2=R3=R4=1;
if(R1==0)
{
if(Mode==0)Mode=1;
else if(Mode==1)Mode=0;
while(R1==0);
}
else if(R2==0)
{
if(Mode==0)
{
Distance_para=Distance;
}
while(R2==0);
}
else if(R3==0)
{
if(Mode==1)
{
Distance_para+=10;
}
while(R3==0){Distance_para_D();}
}
else if(R4==0)
{
if(Mode==1)
{
if(Distance_para<=10)Distance_para=10;
Distance_para-=10;
}
while(R4==0){Distance_para_D();}
}
L3=0;
L1=L2=L4=1;
R1=R2=R3=R4=1;
if(R2==0)
{
printf("Distance(距离):%dcm\r\n",Distance);
while(R2==0);
}
}
void LED_RUn()
{
if(Mode==0)
{
LEDstat=P0&0xfe;
HC573(4,LEDstat);
}
else if(Mode==1)
{
LEDstat=P0&0xfd;
HC573(4,LEDstat);
}
if(Distance>=Distance_para)
{
Flag=1;
}
else
{
Flag=0;
}
if(Flag==1)
{
LED3=LED3_Flag;
P2=(0x1f&P2)|0x80;
P2=(0x1f&P2)|0x00;
}
else if(Flag==0)
{
LED3=1;
P2=(0x1f&P2)|0x80;
P2=(0x1f&P2)|0x00;
}
}
void Time_init()
{
TMOD=0x01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
TF0=0;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
System_init();
while(1)
{
Time();
if(Mode==0)
{
Delay_Display(15);
}
else if(Mode==1)
{
Distance_para_D();
}
LED_RUn();
Key_Scan();
}
}
void Time0() interrupt 1
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
if(Flag==1)
{
Count++;
if(Count>=20)
{
LED3_Flag++;
LED3_Flag%=2;
Count=0;
}
}
}
void System_init()
{
HC573(5,0x00);
HC573(4,0xff);
UartInit();
Time_init();
}
void HC573(unsigned char channel,unsigned char value)
{
P2=(0x1f&P2)|0x00;
P0=value;
switch(channel)
{
case 4:P2=(0x1f&P2)|0x80;break;
case 5:P2=(0x1f&P2)|0xa0;break;
case 6:P2=(0x1f&P2)|0xc0;break;
case 7:P2=(0x1f&P2)|0xe0;break;
case 0:P2=(0x1f&P2)|0x00;break;
}
P2=(0x1f&P2)|0x00;
}
void Delay(unsigned int x)
{
unsigned char i,j;
while(x--)
{
i=11;
j=190;
do
{
while(--j);
}while(--i);
}
}
void Nixie(unsigned char column,unsigned char value)
{
HC573(6,0x01<<(column-1));
HC573(7,value);
Delay(1);
HC573(6,0x01<<(column-1));
HC573(7,0xff);
}
void Delay12us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
char putchar(char ch)
{
Send_Byte(ch);
return ch;
}