C51单片机串口通信以及管脚配置

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中断标志位。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值