📄 main.c
字号:
#include <REG52.H>
#define BYTE unsigned char
//输入信号部分
sbit _hw_left=P1^0; //红外探测黑线信号
sbit _hw_mid=P1^1;
sbit _hw_right=P1^2;
sbit _gm0=P1^3; //光敏探测信号
sbit _gm1=P1^4;
sbit _gm2=P1^5;
sbit _gm3=P1^6;
sbit _gm4=P1^7;
sbit _gm5=P3^6;
sbit _gm6=P3^7;
sbit _tie=P3^2; //金属探测信号
sbit _csbin=P2^0; //超声波探测信号
//输出信号部分
sbit _qzled=P0^0;
sbit _qyled=P0^1;
sbit _hzled=P0^2;
sbit _hyled=P0^3;
sbit _tieled=P0^4;
sbit _juliled=P0^5;
sbit _timeled=P0^6;
sbit _speak=P2^2;
sbit _qz=P2^3;
sbit _qy=P2^4;
sbit _hh=P2^5;
sbit _qq=P2^6;
sbit _k7seg=P2^7;
sbit _csbout=P2^1;
//全局变量
bit direct=1; //方向默认向前
unsigned char htime=0x00;
unsigned char hdata=0x0a; //初始占空比50%
unsigned char bit0=0x00; //四个数码管显示的位数据
unsigned char bit1=0x00;
unsigned char bit2=0x00;
unsigned char bit3=0x00;
unsigned int tie0=0x0000;
unsigned int tie1=0x0000;
unsigned int tie2=0x0000;
unsigned int tie3=0x0000;
unsigned int tie4=0x0000;
unsigned int tie5=0x0000;
unsigned int tie6=0x0000;
unsigned int tie7=0x0000;
unsigned int juli=0x0000;
unsigned int time=0x0000;
unsigned int const ss0=0xffff; //AB 段的距离
unsigned int const ss1=0xffff; //AC 段的距离
BYTE const discode0[11]={0x05,0x9f,0x23,0x0b,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};//显示码1
//函数声明
void delay10ms(unsigned char n)//十毫秒延时子程序
{
unsigned char data0=n;
#pragma ASM
DEL0: MOV R6,#40
DEL1: MOV R5,#250
DJNZ R5,$
DJNZ R6,DEL1
DJNZ data0?041,DEL0 //??????????
#pragma ENDASM
}
void initial(void)
{
P1=0xff;
P0=0x7f;
P2=0xff;
IE=0x8c; //T0不中断
IP=0xe9; //int0最高,T1次之
TMOD=0x15;//T0方式1对T1脚计数,T1方式1定时中断
SCON=0x00;//串行口方式0
EA=1;
TH0=0x00;
TL0=0x00;
TH1=0xfc; //0xffff-0x07d0;
TL1=0X17;
TR0=1;
TR1=1;
}
void int_t1(void) interrupt 3//2MS定时中断,程序约执行60us
{
time++; //总时间加1*2MS
htime++;
if(direct==1)
{
if(htime<hdata) //hdata不得大于20
{
_qq=0;
_hh=1;
}
else
{
_qq=1;
_hh=1;
}
if(htime>0x14) htime=0x00;
}
else
{
if(htime<hdata)
{
_qq=1;
_hh=0;
}
else
{
_qq=1;
_hh=1;
}
if(htime>0x14) htime=0x00;
}
TH1=0xfc; //0xffff-0x07d0;
TL1=0X17;
TR1=1;
}
void display(BYTE data0,BYTE data1,BYTE data2,BYTE data3) //发送显示码子函数
{
_k7seg=1;
SBUF=discode0[data0];
do
{}
while(TI==0);
TI=0;
SBUF=discode0[data1];
do
{}
while(TI==0);
TI=0;
SBUF=discode0[data2];
do
{}
while(TI==0);
TI=0;
SBUF=discode0[data3];
do
{}
while(TI==0);
TI=0;
_k7seg=0;
}
void tobcd(unsigned int xx) //不大于9999的整数去位值函数,大约用160US
{
unsigned int temp0=0x0000,temp1=0x0000;
if(xx<0x270f)
{
bit3=xx/1000;
temp0=xx-1000*bit3;
bit2=temp0/100;
temp1=temp0-bit2*100;
bit1=temp1/10;
bit0=temp1-bit1*10;
}
else return;
}
void main(void)
{
initial();
do
{
display(0x00,0x01,0x02,0x03);
hdata=0x0a;
P2=0x0f;
P0=0x00;
delay10ms(0x64);
display(0x04,0x05,0x06,0x07);
hdata=0x05;
P2=0x00;
delay10ms(0x64);
display(0x08,0x09,0x0a,0x00);
hdata=0x0f;
P2=0x0f;
P0=0xff;
delay10ms(0x64);
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -