📄 control.c
字号:
#include <reg52.h>
#include <stdio.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define COMI XBYTE[0x3100] /*定义外部计数器的地址*/
#define C0I XBYTE[0x0100]
#define C1I XBYTE[0x1100]
#define C2I XBYTE[0x2100]
#define COMII XBYTE[0x3300]
#define C0II XBYTE[0x0300]
#define C1II XBYTE[0x1300]
#define C2II XBYTE[0x2300]
/*定义MAX197的地址*/
#define adch0 XBYTE[0x0200]
sbit P1_6=P1^6; /*定义对MAX197控制控制信号的单片机端口*/
sbit P1_7=P1^7;
sbit P1_2=P1^2;
/*定义89C52的第三个定时器*/
sbit EXF2=T2CON^6;
uint i;
uint BUF810,BUF811,BUF812;
uchar h,l;
uchar sf1,sf2,sf3,sf4,send;
uint yawh,yawl,pitchh,pitchl,rollh,rolll; /*定义双端口RAM中的变量名;*/
int yaw,pitch,roll,yawold,pitchold,rollold,delta; /*定义姿态数据的变量名;*/
uint ch0datal,ch0datah,ch0data; /*定义AD转换的变量名;*/
/*主程序,初始化中断源和变量,并初始化8253等外部芯片的寄存器。*/
void main(void)
{
EA=1; PT0=1;
ET0=1; /*计数器1溢出中断允许*/
IT0=1;IT1=1; /*外部沿触发*/
EX0=1;EX1=1;ET2=1; /*开3个外中断*/
T2CON=0x08;
/*定时器1为串口发生器,8位重装;计数器1位8位重装的一个下降沿触发*/
TMOD=0x26;
TH0=0xff; /*T0's init data*/
TL0=0xff;
TL1=0xfd;
TH1=0xfd;
PCON=0x00; /*9600 bauds*/
SCON=0x50; /*10 bit asyn */
ch0datah=0;
ch0datal=0;
P1_7=0; /*AD197's HBEN*/
P1_6=1; /*AD197'S _INT*/
/*向8253中写入控制字*/
COMI=0x30;
C0I=0;C0I=0;
COMI=0x70;
C1I=0;C1I=0;
COMI=0xB0;
C2I=0;C2I=0;
TR1=1;
TR0=1;
TI=1;
/*在进行完数据的采集和PWM信号处理后,用串口向计算机发送数据;*/
while(1)
{
send=sf1*sf2*sf3*sf4;
if (send!=0)
{
sf1=0;
sf2=0;
sf3=0;
sf4=0;
printf("$%d,%d,%d*",BUF812,yaw,ch0data);
}
}
}
/*外中断0服务程序,读取航向的姿态控制指令*/
void intsvrex0(void) interrupt 0
{
COMI=0x00;
l=C0I;
h=C0I;
BUF810=-(h*256+l);
COMI=0x30;
C0I=0;C0I=0;
yawh=XBYTE[0x6000];
yawl=XBYTE[0x1000];
yaw=yawh*256+yawl;
sf1=1;
}
/*外中断1服务程序,读取俯仰姿态的控制指令*/
void intsvrex1(void) interrupt 2
{
COMI=0x40;
l=C1I;
h=C1I;
BUF811=-(h*256+l);
COMI=0x70;
C1I=0;C1I=0;
pitchh=XBYTE[0x2000];
pitchl=XBYTE[0x3000];
pitch=pitchh*256+pitchl;
sf2=1;
}
/*定时中断2服务程序,读取横滚姿态的控制指令*/
void intsvr2(void) interrupt 5
{
EXF2=0;
COMI=0x80;
l=C2I;
h=C2I;
BUF812=-(h*256+l);
COMI=0xB0;
C2I=0;C2I=0;
rollh=XBYTE[0x4000];
rolll=XBYTE[0x5000];
roll=rollh*256+rolll;
sf3=1;
}
/*定时中断1服务程序,产生18ms的PWM周期,读取A/D数据,并打开串口发送标志*/
void intsvr1(void) interrupt 1
{
COMII=0x30; /*通过8253计数器发送PWM信号*/
C0II=(BUF812)%256;
C0II=(BUF812)/256;
adch0=0x40; /*读取AD数据*/
while(P1_6!=0);
P1_7=0;
ch0datal=adch0;
P1_7=1;
ch0datah=adch0;
ch0data=ch0datah*256+ch0datal;
sf4=1; /*打开串口发送标志*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -