相关单片机外设介绍
1、STC15W408AS内部晶振频率最高可以设置为35MHz ,本demo设置为24MHz(方便设置串口波特率为100KHz);
2、STC15W408AS只有一个串口,可以切换到3组IO而已(P3.0/P3.1、P3.6/P3.7、P1.6/P1.7);
3、STC15W408AS只有定时器0和定时器2,没有定时器1;
4、STC15W408AS有512字节的data RAM,分为256字节的idata和256字节的xdata,故工程项目定义的变量时勿超过或者接近该大小,否者单片机运行代码时易崩溃;
5、STC15W408AS只有8K bytes flash ROM,故项目的生成的程序勿超过该大小;
SBUS协议介绍
1、SBUS全称serial-bus,是一种串口通信协议,广泛应用于航模遥控器(接收机)中。只用一根信号线就能传输多达16通道的数据,比多路PWM捕获高效且省资源。
2、串口配置:
100k波特率,8位数据位,2位停止位,偶校验(EVEN),无控流,25个字节。
协议格式:(8字节)
[startbyte] [data1][data2]…[data22][flags][endbyte]
startbyte=0x0f;
endbyte=0x00;
data1…data22: LSB(低位在前),对应16个通道(ch1-ch16),每个通道11bit(22 × 8=16 × 11);
flag位标志遥控器的通讯状态,目前我使用的OPENTX系统的遥控器在有信号时是0x00,接收机设置失控保护且当信号断开的时就不是0x00,所以可以通过查询flag位来判断是否失控。
3、数据范围:
OPENTX系统航模遥控器输出的PWM值约为200~1800,中值为1000,不同遥控器的sbus输出的值会不一样,跟厂家有关。
4、sbus的负逻辑
这个地方一定要万分注意,必须加硬件反相器,因为SBUS的信号是采用的负逻辑,也就是电平相反,不要试图在软件里面取反,因为软件里面只能操作数据位(记得串口配置里面的数据位8么),是操作不了停止位、校验位啥的!!下图为反相器电路。
代码部分
1、初始化串口,串口的配置可以用STC-ISP软件生成,新手注意这里生成后还需要自己添加打开中断的代码。
//时钟频率24Mhz 波特率100k 8个数据位+偶校验位故为9位数据
void UartInit()
{
SCON = 0xD0; //9位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xC4; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
ES = 1; //使能串口1中断
EA = 1; //打开总中断
}
2、串口中断函数:读取SBUS协议+转换SBUS位PWM信号值
读取思路:首先判断串口接收的数据是不是sbus协议的帧头0x0f,如果是则继续将串口接收缓存区SBUF寄存器的值依次存放到sbus_receive_buffer[25]这个数组,共25个,否则丢弃;接着判断帧尾是不是sbus协议的帧尾0x00,如果是,则通过deal_data()函数对sbus_receive_buffer[25]这个数组进行信号解析。
void Usart() interrupt 4
{
if(RI)//有对帧头帧尾进行判断,提高抗干扰能力
{
sbus_receive_buffer[receive_number] = SBUF;
RI = 0;
if(sbus_receive_buffer[0] == 0x0f) //帧头0x0f
receive_number++;
else
receive_number = 0;
if(receive_number == 25 && sbus_receive_buffer[24] == 0x00) //帧尾0x00
{
receive_number = 0;
deal_data();
}
}
}
/*----------------------------
读取SBUS信号并转换为16路PWM信号数值
----------------------------*/
void deal_data()
{
if(sbus_receive_buffer[23] == 0x00) // 失控判断标志符
SBUS_CH.ConnectState = 1; // 正常
else
SBUS_CH.ConnectState = 0;// 失控
SBUS_CH.CH1 = ((u16)sbus_receive_buffer[ 1] >> 0 | ((u16)sbus_receive_buffer[ 2] << 8 )) & 0x07FF;
SBUS_CH.CH2 = ((u16)sbus_receive_buffer[ 2] >> 3 | ((u16)sbus_receive_buffer[ 3] << 5 )) & 0x07FF;
SBUS_CH.CH3 = ((u16)sbus_receive_buffer[ 3] >> 6 | ((u16)sbus_receive_buffer[ 4] << 2 ) | (u16)sbus_receive_buffer[ 6] << 10 ) & 0x07FF;
SBUS_CH.CH4 = ((u16)sbus_receive_buffer[ 5] >> 1 | ((u16)sbus_receive_buffer[ 6] << 7 )) & 0x07FF;
SBUS_CH.CH5 = ((u16)sbus_receive_buffer[ 6] >> 4 | ((u16)sbus_receive_buffer[ 7] << 4 )) & 0x07FF;
SBUS_CH.CH6 = ((u16)sbus_receive_buffer[ 7] >> 7 | ((u16)sbus_receive_buffer[ 8] << 1 ) | (u16)sbus_receive_buffer[10] << 9 ) & 0x07FF;
SBUS_CH.CH7 = ((u16)sbus_receive_buffer[ 9] >> 2 | ((u16)sbus_receive_buffer[10] << 6 )) & 0x07FF;
SBUS_CH.CH8 = ((u16)sbus_receive_buffer[10] >> 5 | ((u16)sbus_receive_buffer[11] << 3 )) & 0x07FF;
SBUS_CH.CH9 = ((u16)sbus_receive_buffer[12] << 0 | ((u16)sbus_receive_buffer[13] << 8 )) & 0x07FF;
SBUS_CH.CH10 = ((u16)sbus_receive_buffer[13] >> 3 | ((u16)sbus_receive_buffer[14] << 5 )) & 0x07FF;
SBUS_CH.CH11 = ((u16)sbus_receive_buffer[14] >> 6 | ((u16)sbus_receive_buffer[15] << 2 ) | (u16)sbus_receive_buffer[17] << 10 ) & 0x07FF;
SBUS_CH.CH12 = ((u16)sbus_receive_buffer[16] >> 1 | ((u16)sbus_receive_buffer[17] << 7 )) & 0x07FF;
SBUS_CH.CH13 = ((u16)sbus_receive_buffer[17] >> 4 | ((u16)sbus_receive_buffer[18] << 4 )) & 0x07FF;
SBUS_CH.CH14 = ((u16)sbus_receive_buffer[18] >> 7 | ((u16)sbus_receive_buffer[19] << 1 ) | (u16)sbus_receive_buffer[21] << 9 ) & 0x07FF;
SBUS_CH.CH15 = ((u16)sbus_receive_buffer[20] >> 2 | ((u16)sbus_receive_buffer[21] << 6 )) & 0x07FF;
SBUS_CH.CH16 = ((u16)sbus_receive_buffer[21] >> 5 | ((u16)sbus_receive_buffer[22] << 3 )) & 0x07FF;
}
程序文件
1、sbus.c文件
#include "sbus.h"
/*
注意,STC15W408AS只有一个串口,可以切换到3组IO而已(P3.0/P3.1、P3.6/P3.7、P1.6/P1.7)。
STC15W408AS只有两个定时器Timer0和Timer2,没有Timer1.
SBUS协议格式:(8字节)
[startbyte] [data1][data2]…[data22][flags][endbyte]
startbyte=0x0f;
endbyte=0x00;
data1…data22: LSB(低位在前),对应16个通道(ch1-ch16),每个通道11bit(22 × 8=16 × 11);
flag位标志遥控器的通讯状态,目前我使用的OPENTX系统的遥控器在有信号时是0x00,接收机设置失
控保护且当信号断开的时就不是0x00,所以可以通过查询flag位来判断是否失控。
*/
SBUS_CH_Struct SBUS_CH;
u8 sbus_receive_buffer[25];
u8 receive_number = 0;
u8 sbus_start_flag = 0;
//时钟频率24Mhz 波特率100k 8个数据位 偶校验位 2个停止位
void UartInit()
{
SCON = 0xD0; //9位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xC4; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
ES = 1; //使能串口1中断
EA = 1;
}
void Usart() interrupt 4
{
if(RI)//有对帧头帧尾进行判断,提高抗干扰能力
{
sbus_receive_buffer[receive_number] = SBUF;
RI = 0;
if(sbus_receive_buffer[0] == 0x0f) //帧头0x0f
receive_number++;
else
receive_number = 0;
if(receive_number == 25 && sbus_receive_buffer[24] == 0x00) //帧尾0x00
{
receive_number = 0;
deal_data();
}
}
}
/*----------------------------
读取SBUS信号并转换为16路PWM信号数值
----------------------------*/
void deal_data()
{
if(sbus_receive_buffer[23] == 0x00) // 失控判断标志符
SBUS_CH.ConnectState = 1; // 正常
else
SBUS_CH.ConnectState = 0;// 失控
SBUS_CH.CH1 = ((u16)sbus_receive_buffer[ 1] >> 0 | ((u16)sbus_receive_buffer[ 2] << 8 )) & 0x07FF;
SBUS_CH.CH2 = ((u16)sbus_receive_buffer[ 2] >> 3 | ((u16)sbus_receive_buffer[ 3] << 5 )) & 0x07FF;
SBUS_CH.CH3 = ((u16)sbus_receive_buffer[ 3] >> 6 | ((u16)sbus_receive_buffer[ 4] << 2 ) | (u16)sbus_receive_buffer[ 6] << 10 ) & 0x07FF;
SBUS_CH.CH4 = ((u16)sbus_receive_buffer[ 5] >> 1 | ((u16)sbus_receive_buffer[ 6] << 7 )) & 0x07FF;
SBUS_CH.CH5 = ((u16)sbus_receive_buffer[ 6] >> 4 | ((u16)sbus_receive_buffer[ 7] << 4 )) & 0x07FF;
SBUS_CH.CH6 = ((u16)sbus_receive_buffer[ 7] >> 7 | ((u16)sbus_receive_buffer[ 8] << 1 ) | (u16)sbus_receive_buffer[10] << 9 ) & 0x07FF;
SBUS_CH.CH7 = ((u16)sbus_receive_buffer[ 9] >> 2 | ((u16)sbus_receive_buffer[10] << 6 )) & 0x07FF;
SBUS_CH.CH8 = ((u16)sbus_receive_buffer[10] >> 5 | ((u16)sbus_receive_buffer[11] << 3 )) & 0x07FF;
SBUS_CH.CH9 = ((u16)sbus_receive_buffer[12] << 0 | ((u16)sbus_receive_buffer[13] << 8 )) & 0x07FF;
SBUS_CH.CH10 = ((u16)sbus_receive_buffer[13] >> 3 | ((u16)sbus_receive_buffer[14] << 5 )) & 0x07FF;
SBUS_CH.CH11 = ((u16)sbus_receive_buffer[14] >> 6 | ((u16)sbus_receive_buffer[15] << 2 ) | (u16)sbus_receive_buffer[17] << 10 ) & 0x07FF;
SBUS_CH.CH12 = ((u16)sbus_receive_buffer[16] >> 1 | ((u16)sbus_receive_buffer[17] << 7 )) & 0x07FF;
SBUS_CH.CH13 = ((u16)sbus_receive_buffer[17] >> 4 | ((u16)sbus_receive_buffer[18] << 4 )) & 0x07FF;
SBUS_CH.CH14 = ((u16)sbus_receive_buffer[18] >> 7 | ((u16)sbus_receive_buffer[19] << 1 ) | (u16)sbus_receive_buffer[21] << 9 ) & 0x07FF;
SBUS_CH.CH15 = ((u16)sbus_receive_buffer[20] >> 2 | ((u16)sbus_receive_buffer[21] << 6 )) & 0x07FF;
SBUS_CH.CH16 = ((u16)sbus_receive_buffer[21] >> 5 | ((u16)sbus_receive_buffer[22] << 3 )) & 0x07FF;
}
2、sbus.h文件
#ifndef _H_SBUS_
#define _H_SBUS_
#include "STC15.h"
/*
TX18S遥控器通道百分比对应PWM值
1800 +99
1700 +87
1500 +63
1200 +25
1000 0
800 -23
500 -59
300 -84
200 -96
约等于8.3占空比/通道数值
*/
#define Channel_Mid 1000
#define Channel_Top 1700
#define Channel_Bot 300
#define Online 1
#define Offline 0
typedef struct
{
u16 CH1;//通道1数值
u16 CH2;//通道2数值
u16 CH3;//通道3数值
u16 CH4;//通道4数值
u16 CH5;//通道5数值
u16 CH6;//通道6数值
u16 CH7;//通道7数值
u16 CH8;//通道8数值
u16 CH9;//通道9数值
u16 CH10;//通道10数值
u16 CH11;//通道11数值
u16 CH12;//通道12数值
u16 CH13;//通道13数值
u16 CH14;//通道14数值
u16 CH15;//通道15数值
u16 CH16;//通道16数值
u8 ConnectState;//遥控器与接收器连接状态 0=未连接,1=正常连接
}SBUS_CH_Struct;
extern SBUS_CH_Struct SBUS_CH;
void UartInit();
void deal_data();
#endif
3、stc15.h文件
#ifndef __STC15F2K60S2_H_
#define __STC15F2K60S2_H_
/
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/
/
//包含本头文件后,不用另外再包含"REG51.H"
//内核特殊功能寄存器 // 复位值 描述
sfr ACC = 0xE0; //0000,0000 累加器Accumulator
sfr B = 0xF0; //0000,0000 B寄存器
sfr PSW = 0xD0; //0000,0000 程序状态字
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit F1 = PSW^1;
sbit P = PSW^0;
sfr SP = 0x81; //0000,0111 堆栈指针
sfr DPL = 0x82; //0000,0000 数据指针低字节
sfr DPH = 0x83; //0000,0000 数据指针高字节
//I/O 口特殊功能寄存器
sfr P0 = 0x80; //1111,1111 端口0
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1 = 0x90; //1111,1111 端口1
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2 = 0xA0; //1111,1111 端口2
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3 = 0xB0; //1111,1111 端口3
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P4 = 0xC0; //1111,1111 端口4
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr P5 = 0xC8; //xxxx,1111 端口5
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sfr P6 = 0xE8; //0000,0000 端口6
sbit P60 = P6^0;
sbit P61 = P6^1;
sbit P62 = P6^2;
sbit P63 = P6^3;
sbit P64 = P6^4;
sbit P65 = P6^5;
sbit P66 = P6^6;
sbit P67 = P6^7;
sfr P7 = 0xF8; //0000,0000 端口7
sbit P70 = P7^0;
sbit P71 = P7^1;
sbit P72 = P7^2;
sbit P73 = P7^3;
sbit P74 = P7^4;
sbit P75 = P7^5;
sbit P76 = P7^6;
sbit P77 = P7^7;
sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0
sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0
sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1
sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0
sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1
sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0
sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1
sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0
sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1
sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0
sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1
//系统管理特殊功能寄存器
sfr PCON = 0x87; //0001,0000 电源控制寄存器
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1
sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1
sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器
sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器
sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器
sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器
//中断特殊功能寄存器
sfr IE = 0xA8; //0000,0000 中断控制寄存器
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr IP = 0xB8; //0000,0000 中断优先级寄存器
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2
sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2
sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器
//定时器特殊功能寄存器
sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器
sfr TL0 = 0x8A; //0000,0000 T0低字节
sfr TL1 = 0x8B; //0000,0000 T1低字节
sfr TH0 = 0x8C; //0000,0000 T0高字节
sfr TH1 = 0x8D; //0000,0000 T1高字节
sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T4H = 0xD2; //0000,0000 T4高字节
sfr T4L = 0xD3; //0000,0000 T4低字节
sfr T3H = 0xD4; //0000,0000 T3高字节
sfr T3L = 0xD5; //0000,0000 T3低字节
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节
sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节
sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器
//串行口特殊功能寄存器
sfr SCON = 0x98; //0000,0000 串口1控制寄存器
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器
sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器
sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器
sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器
sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器
sfr S4CON = 0x84; //0000,0000 串口4控制寄存器
sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器
sfr SADDR = 0xA9; //0000,0000 从机地址寄存器
sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器
//ADC 特殊功能寄存器
sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器
sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位
sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位
//SPI 特殊功能寄存器
sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器
sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器
sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器
//IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器
sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节
sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节
sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器
sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器
sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器
//PCA/PWM 特殊功能寄存器
sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器
sfr CL = 0xE9; //0000,0000 PCA计数器低字节
sfr CH = 0xF9; //0000,0000 PCA计数器高字节
sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器
sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器
sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器
sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节
sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节
sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节
sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器
sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节
sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节
sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节
//比较器特殊功能寄存器
sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1
sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2
//增强型PWM波形发生器特殊功能寄存器
sfr PWMCFG = 0xf1; //x000,0000 PWM配置寄存器
sfr PWMCR = 0xf5; //0000,0000 PWM控制寄存器
sfr PWMIF = 0xf6; //x000,0000 PWM中断标志寄存器
sfr PWMFDCR = 0xf7; //xx00,0000 PWM外部异常检测控制寄存器
//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
#define PWMCH (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1 (*(unsigned int volatile xdata *)0xff00)
#define PWM2T1H (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2 (*(unsigned int volatile xdata *)0xff02)
#define PWM2T2H (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1 (*(unsigned int volatile xdata *)0xff10)
#define PWM3T1H (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2 (*(unsigned int volatile xdata *)0xff12)
#define PWM3T2H (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1 (*(unsigned int volatile xdata *)0xff20)
#define PWM4T1H (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2 (*(unsigned int volatile xdata *)0xff22)
#define PWM4T2H (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1 (*(unsigned int volatile xdata *)0xff30)
#define PWM5T1H (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2 (*(unsigned int volatile xdata *)0xff32)
#define PWM5T2H (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1 (*(unsigned int volatile xdata *)0xff40)
#define PWM6T1H (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2 (*(unsigned int volatile xdata *)0xff42)
#define PWM6T2H (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1 (*(unsigned int volatile xdata *)0xff50)
#define PWM7T1H (*(unsigned char volatile xdata *)0xff50)
#define PWM7T1L (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2 (*(unsigned int volatile xdata *)0xff52)
#define PWM7T2H (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR (*(unsigned char volatile xdata *)0xff54)
/
#define u8 unsigned char
#define u16 unsigned int
typedef unsigned char BYTE;
typedef unsigned int WORD;
#endif
4、main.c文件
#include "stc15.h"
#include "sbus.h"
extern SBUS_CH_Struct SBUS_CH;
void main()
{
UartInit(); //初始化SBUS串口
while(1)
{
//sbus通信测试,点灯
// if(SBUS_CH.CH15 > Channel_Mid)
// {
// P2^1= 1;
// }
// else
// {
// P2^1 = 0;
// }
// if(SBUS_CH.ConnectState == Online)
// {
// P2^1= 0;
// }
// else
// {
// P2^1= 1;
// }
}
}