⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 control.c

📁 单片机实用技术与开发
💻 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 + -