📄 main.c
字号:
#include <reg51.h>
#define XTAL 22118400
#define baudrate 9600
#define INLEN 6
#define LAMPSPEED 20 //控制CPU灯闪速度,每秒5次
sbit cpulamp=P3^7; //CPU灯控制
bit newnum; //有新的数据标识
char is_aa;
bit key; //调试用***
char lamp_speed;
char inbuf[INLEN];
char getbuf[INLEN];
char buf_sit;
char Timer_num;
int angel_gd;
int angel_fw;
int angel_gd_get;
int angel_fw_get;
/*串口接收程序*/
static void comm_get (void) interrupt 4 using 1
{
char i;
char get_buf;
get_buf=SBUF;
RI=0;
TI=0;
if(inbuf[0]==is_aa)
{
inbuf[buf_sit]=get_buf;
buf_sit++;
if(buf_sit>=6)
{
for(i=0;i<INLEN;i++)getbuf[i]=inbuf[i];
buf_sit=0;
inbuf[0]=0;
newnum=1;
}
}
else
{
if(get_buf==is_aa)
{
inbuf[0]=is_aa;
buf_sit++;
}
}
}
/*初始化串行口*/
void ini_comm (void)
{
buf_sit=0;
newnum=0;
is_aa=0xAA;
PCON|=0x80;
TMOD|=0x20;
TH1=(unsigned char)(256-(XTAL/(16L*12L*baudrate)));
TR1=1;
SCON=0x50;
ES=1;
}
/* 初始化定时器0*/
void ini_time(void)
{
cpulamp=1;
TMOD&=0xF0;
TMOD|=0x01;
TH0=0xB7;
TL0=0xFd;
ET0=1;
TR0=1;
Timer_num=0;
lamp_speed=LAMPSPEED;
}
/*10ms定时器中断程序*/
time0() interrupt 1 using 2
{
if(Timer_num>=lamp_speed) //lamp_speed控制指示灯闪速
{
cpulamp=!cpulamp;
Timer_num=0;
}
Timer_num++;
TH0=0xB7;
TL0=0xFD;
}
/****调试用外部中断****/
void ex0_int() interrupt 0 using 3
{
if(key==0)
{
angel_gd=30;
angel_fw=30;
}
else
{
angel_gd=-30;
angel_fw=-30;
}
key=!key;
}
/*主程序*/
main()
{
char temp;
char i;
unsigned char p1_img;
EA=1;
/*调试用程序*/
EX0=1;
angel_gd=0;
angel_fw=0;
angel_gd_get=0;
angel_fw_get=0;
ini_time();
ini_comm();
p1_img=0x20;
P1=p1_img; //给电机解锁,初始化
do
{
if(newnum) //如果有新的接收数据
{
newnum=0;
temp=0;
for(i=0;i<INLEN-1;i++) //求校验和
{
temp+=getbuf[i];
}
if(temp==getbuf[INLEN-1]) //如果校验正确,取出高低方位角
{
lamp_speed=2; //加快灯闪速度
angel_gd_get=getbuf[1];
angel_gd_get=angel_gd_get<<8;
angel_gd_get=angel_gd_get+getbuf[2];
angel_fw_get=getbuf[3];
angel_fw_get=angel_fw_get<<8;
angel_fw_get=angel_fw_get+getbuf[4];
if(angel_gd_get<0);
{
angel_gd_get&=0x7f;
angel_gd_get=~angel_gd_get;
angel_gd_get++;
}
if(angel_fw_get<0)
{
angel_fw_get&=0x7f;
angel_fw_get=~angel_fw_get;
angel_fw_get++;
}
angel_gd_get*=6;
angel_fw_get*=6;
angel_gd+=angel_gd_get;
angel_fw+=angel_fw_get;
}
}
if(angel_gd!=0||angel_fw!=0) //驱动电机
{
p1_img&=0xde; //打开电机开关;两电机同时打开
P1=p1_img;
if(angel_gd>0)
{
p1_img|=0x06;
angel_gd--;
}
if(angel_gd<0)
{
p1_img&=0xfd;
p1_img|=0x04;
angel_gd++;
}
if(angel_fw>0)
{
p1_img|=0x18;
angel_fw--;
}
if(angel_fw<0)
{
p1_img&=0xef;
p1_img|=0x08;
angel_gd++;
}
P1=p1_img;
for(i=0;i<77;i++) //延时,大约0.25ms;每一循环用时1.6275μs2个机器周期
{;}
for(i=0;i<77;i++)
{;}
p1_img&=0xf3;
P1=p1_img;
for(i=0;i<93;i++) //延时,大约0.15ms
{;}
p1_img&=0x21;
P1=p1_img; //关电机
}
else
{
lamp_speed=LAMPSPEED;
}
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -