1、芯片型号及说明
在工作过程中产品需要和一块开发板通信,开发板用的芯片是STC15W408S,具体可以查询STC官网,附上STC15W408S规格书。
注:该芯片烧录要用到STC专用烧录器,专用的烧录软件stc-isp,可以在STC官网下载,附上STC官网。编译器需要用到keil C51版本,写好的代码生成hex文件用stc-isp打开烧录。烧录接口是RXD、TXD、-、+。注意串口烧录时芯片RXD接烧录器的TXD,TXD接烧录器的RXD。
1.1、芯片原理图
2、串口通信硬件连接
2.1、硬件连接
硬件连接部分很简单,该芯片和所需连接的产品需要共地,芯片发送端TXD接所连接产品的接收端RXD,芯片接收端RXD接所连接产品的发送端TXD即可。将芯片的RXD(P3.0)、TXD(P3.1)、GND引出,方便外接。
2.2、串口通信选用及注意事项
在实际应用中,我用的其实是p3.6和p3.7接口,也就是手册中对应的RxD_2和 TxD_2,这是因为 RXD和TXD被 下载接口占用,若执意用该接口的话,需要用“冷启动”。相关说明附上 STC15W408S注意事项
该芯片只有一组UART,但是可以映射到别的管脚上复用成别的串口(实际还是用的UART,并不是UART2、UART3)。(该部分我理解有些片面,不过我实验验证了,可能表达有问题)
注:“冷启动”方法是,接上RXD和TXD点下载,再接上正负电源。
3、代码示例
3.1串口初始化和管脚初始化
void SystemInit(void)
{
P0=0xff; //初始化将所有IO口全部置高
P1=0xff;
P2=0xff;
P3=0xff;
EA = 0; //使能
//设置串口
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
P_SW1 = ACC;
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可变波特率,校验位初始为0
#endif
AUXR = 0x40; //定时器1为1T模式
TMOD = 0x20; //定时器1为模式2(8位自动重载)
TL1 = (256 - (FOSC/32/BAUD)); //设置波特率重装值
TH1 = (256 - (FOSC/32/BAUD));
TR1 = 1; //定时器1开始工作
ES = 1; //使能串口中断
}
首先使能p0、p1、p2、p3。
可通过配置管脚之间切换的寄存器AUXR1(P_SW1)来选择不同的管脚作为 串口输出脚,根据数据手册,S1_S1 =0;S1_S0=1时,串口1在p3.6和p3.7上输出了。
然后设置波特率,在初始化函数前定义了:
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
打开定时器,使能串口中断。
3.2 串口收发
unsigned char aaa;
void Uart() interrupt 4 using 1
{
if (RI)
{
aaa = SBUF; //将接收到的数据存到aaa中
SBUF = aaa+1; //把aaa+1放到发送数据寄存器中并发送
while(TI==0);
TI=0; //手动置0
RI = 0; //清除RI位
}
}
TI:发送中断请求标志位,在方式0,当串口发送数据第8位结束时,由内部硬件自动置位,即T1=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位。
RI:接收中断请求标志位。在方式0,当串口发送数据第8位结束时,由内部硬件自动置位,即RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,则在停止位的中间时刻由内部硬件置位,必须用软件复位。
SBUF为串口数据缓存寄存器,物理上是两个独立的寄存器,但是占用相同的地址.写操作时,写入的是发送寄存器.读操作时,读取的是接收寄存器。
单片机会自动将TI/RI置1,只需将数据放入或读取即可,操作完手动置0。
注:串口收发到此已经完成了,注意到该型号单片机还支持485下载,就动手配置了一下。
4、管脚的配置
4.1 配置介绍
以p0.0口为例,由P0M0和P0M1寄存器控制模式,p0.0~p0.7由8位数据进行位操作,即p0.0对应最低位。
4.2、代码示例
P0M0 = 0x01;
P0M1 = 0x00; //推挽输出
P0 |= 0X01; //p0.0 = 1
P0 &= 0XFE; //p0.0 = 0
//不改变其他位,只对P0的p0.0进行操作
5、RS485通信
5.1、原理图
注:该芯片是5V供电,485芯片类型选的也是5V供电。
p0.0是使能脚,高发低收。
5.2、代码示例
//主函数中先配置 P0 &= 0XFE; 即485使能接收
void Uart() interrupt 4 using 1
{
unsigned char aaa;
if (RI)
{
aaa = SBUF;
P0 |= 0X01; //485使能发送
SBUF = aaa+1;
while(TI==0);
TI=0; //清除TI位
P0 &= 0XFE; //发送完立即使能接收
RI = 0; //清除RI位
}
}
注:相当于有俩个开关,必须俩个开关同时打开时为发送,同时关闭时是接收,一开一关不起作用。即485使能接收后,接收到数据RI=1(硬件自动置1,只需将数据放入SBUF),才能收到数据;即485使能发送后,接收到数据TI=1(硬件自动置1,只需将数据放入SBUF),才能发送数据。发送完接收到都需要置0中断标志位。