本帖最后由 angmall 于 2023-5-2 08:40 编辑
《51单片机轻松入门-基于STC15W4K系列》一个单片机内两串口互相通信,串口1发送数据给串口2,串口2根据收到的数据控制led的亮灭,怎么实现呢?
这个例子书上没有,只能给现写一个了。程序功能:单片机串口1发送0-255范围内不断增大的数,串口2接收到数据后送PO口LED显示,已在实验板上验证通过。
串口1与串口2使用2条杜邦线连接即可,实验结果如下图所示。
我还有个问题,就是串口的工作方式换成1,2,3都可以实现这个两串口间的通信吗?
串口1 支持的工作方式 0、1,2,3,串口2、3、4只支持10位与11位串口通信方式。相当于没有串口1的方式0和方式2,实际上串口1的方式0和方式2可看着多余的,没什么用。
- #include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定义头文件
- void delay500ms(void)
- {
- unsigned char i,j,k;
- for(i=93;i>0;i--) // 注意后面没分号
- for(j=235;j>0;j--) // 注意后面没分号
- for(k=125;k>0;k--); // 注意后面有分号
- }
- void UART_init(void)
- {
- //下面代码设置定时器1
- TMOD = 0x20; // 0010 0000 定时器1工作于方式2(8位自动重装方式)
- TH1 = 0xFA; // 波特率:9600 /22.1184MHZ
- TL1 = 0xFA; // 波特率:9600 /22.1184MHZ
- TR1 = 1;
- //下面代码设置定串口
- AUXR = 0x00; // 很关键,使用定时器1作为波特率发生器,S1ST2=0
- SCON = 0x50; // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接收)
- }
- void UART_send_byte(unsigned char dat)
- {
- SBUF = dat;
- while(!TI);
- TI=0; //此句可以不要,不影响后面数据的发送,只供代码查询数据是否发送完成
- }
-
- void UART2_init(void)
- {
- // 下面代码设置定时器2
- T2H = 0xFD; // 波特率:9600 /22.1184MHZ,1T
- T2L = 0xC0; // 波特率:9600 /22.1184MHZ,1T
- AUXR = 0x14; // 0001 0100,T2R=1启动T2运行,T2x12=1,定时器2按1T计数
- // 下面代码设置定串口2
- S2CON = 0x15; // 0001 0000 S2M0=0(最普遍的8位通信),REN=1(允许接收)
- // 下面代码设置中断
- IE2 =0x01; // 开串口2中断
- EA = 1; // 开总中断
- }
- void main()
- {
- unsigned char num=0;
- UART_init();
- UART2_init();
- while(1)
- {
- UART_send_byte(num++);
- delay500ms();
- }
- }
-
- void UART2(void) interrupt 8 // 串行口2中断函数
- {
- P00=!P00;
- if(S2CON&0x02) // 0x02=0000 0010,发送中断标志 S2TI=1
- {
- S2CON&=0xFD; // 0xFD=1111 1101,清零发送中断标志 S2TI=0,
- }
- if(S2CON&0x01) // 0x01=0000 0001,接收中断标志 S2RI=1
- {
- S2CON&=0xFE; // 0xFE=1111 1110,清零接收中断标志 S2RI=0,
- P0 = S2BUF;
- }
- }
复制代码
|