C51单片机——串口和中断系统

串口SCON,串口控制器
D7     D6    D5     D4      D3   D2     D1  D0
SM0  SM1  SM2  REN  TB8  RB8  TI    RI


SM0 SM1 工作方式   功能描述       波特率
0   0   方式0     8位移位寄存器   Fosc/12
0   1   方式1     10位UART       可变
1   0   方式2     11位UART       Fosc/64或fosc/32
1   1   方式3     11位UART       可变
其中fosc为晶振频率
 
SM2:多机通讯控制位。
     在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。
     在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。
REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。
TB8: 是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。
     例如,可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。
RB8:接收到的数据的第9位。在方式0中不使用RB8。
     在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于 C51 单片机的串口中断控制 LED 的代码: ```c #include <reg52.h> // 定义 LED 灯连接的 IO 口 sbit LED = P1^0; // 定义串口接收到的字符变量 unsigned char ch; void main() { // 定义串口参数 TMOD = 0x20; // 定时器1工作方式2(8位自动重装载) TH1 = 0xfd; // 波特率为9600,定时器1初值为0xfd SCON = 0x50; // 串口工作在模式1(8位数据,可变波特率) TR1 = 1; // 启动定时器1 // 开启总中断串口中断 EA = 1; ES = 1; while(1) { // 循环等待串口接收到数据 } } // 串口中断服务函数 void serial() interrupt 4 { if(RI) { // 接收到数据 ch = SBUF; RI = 0; // 根据接收到的字符控制 LED 灯 if(ch == '1') { LED = 1; } else if(ch == '0') { LED = 0; } // 发送接收到的数据 SBUF = ch; while(!TI); // 等待发送完成 TI = 0; } } ``` 在这个代码中,我们通过串口中断来接收数据,并根据接收到的字符控制 LED 灯。当接收到字符 `1` 时,LED 灯亮起;当接收到字符 `0` 时,LED 灯熄灭。同时,我们也会将接收到的数据再次通过串口发送出去。 需要注意的是,在使用串口之前,需要先设置好串口的参数,包括波特率、数据位数、停止位等等。在这个代码中,我们使用了9600波特率,8位数据,无校验位,1位停止位的参数设置。 另外,在使用串口时,需要开启串口中断和总中断。在这个代码中,我们在 `main` 函数中开启了总中断串口中断。当串口接收到数据时,会触发串口中断服务函数 `serial`。在 `serial` 函数中,我们通过判断 `RI` 的值来确定是否接收到了数据,并根据接收到的数据控制 LED 灯的状态。同时,我们也会将接收到的数据再次通过串口发送出去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值