串行口通信:利用串行口中断配合74LS164移位寄存器,来完成流水灯

本文介绍了使用STM32的C语言编程实现串行口通信,涉及工作方式选择、中断设置(包括总中断和串行中断)、中断标志TI和RI的使用,以及如何在中断服务程序中发送和接收数据。

代码:

#include "reg51.h"
#include "stdio.h" // for <<

sbit P1_0 = 0x90; // 利用地址的形式进行位操作  或者 = P1^0
unsigned char nSendByte;

void init(){
	SM0 = SM1 = 0; // 设置串行口通信为工作方式0   默认
	EA = 1; // 开启总中断
	ES = 1; // 开启串行口中断	
	P1_0 = 1; // 允许移位寄存器发送数据
}

void serial_port() interrupt 4{
	if(TI){
		SBUF = nSendByte; // 第一个SBUF是为了实现流水灯的效果
		delay();
		
		nSendByte <<= 1; // 实现流水灯效果
		if (nSendByte == 0) nSendByte = 1;
		SBUF = nSendByte; // 第二个SBUF是为了让下面TI和RI置零,然后TI发送数据置1,再次进入中断
	}
	TI = 0;
	RI = 0;
}

void main(){
	init();
	nSendByte = 1;
	SBUF = nSendByte;
	while(1);
}

仿真:

原理:

一、工作方式的选择:SM0 = SM1 = 0 (同步移位寄存器方式)

二、开启中断:总中断E

### 51单片机串口通信74LS164驱动流水灯电路设计及代码实现 #### 硬件设计 在硬件设计中,51单片机串行口通过TXD(P3.1)引脚连接到74LS164的串行输入端(SER),而74LS164的时钟信号由51单片机的RXD(P3.0)引脚提供。为了确保数据正确传输至74LS164,需将51单片机配置为工作方式0,此时RXD作为移位时钟输出[^1]。 74LS164是一个8位串入并出移位寄存器,能够将串行输入的数据转换为并行输出,从而控制LED灯的亮灭状态。具体连接如下: - 单片机的P3.0(RXD)连接到74LS164的CLK。 - 单片机的P3.1(TXD)连接到74LS164的SER。 - 74LS164的Q0~Q7分别连接到8个LED的阳极或阴极,通过限流电阻接入电源或地。 #### 软件设计 软件部分主要包括初始化、中断服务程序和主函数。以下是完整的代码实现: ```c #include "reg51.h" sbit P1_0 = P1^0; // 定义P1.0引脚 unsigned char nSendByte; void delay(unsigned int i) { while (i--); } void init() { TMOD = 0x20; // 设置定时器模式 TH1 = 0xFD; // 波特率9600bps SCON = 0x00; // 设置串行口为工作方式0 EA = 1; // 开启总中断 ES = 1; // 开启串行口中断 nSendByte = 0x01; } void serial_port() interrupt 4 { if (TI) { TI = 0; // 清除发送标志 SBUF = nSendByte; // 发送当前字节 delay(1000); // 延时 nSendByte <<= 1; // 左移一位 if (nSendByte == 0) { nSendByte = 0x01; // 循环回到初始状态 } } } void main() { init(); while (1); // 主循环等待中断 } ``` #### 代码解析 1. **初始化部分**:`init()`函数中设置串行口为工作方式0,并开启总中断串行口中断。波特率设置为9600bps,适用于大多数应用环境。 2. **中断服务程序**:当发送完成标志`TI`被置位时,进入中断服务程序。在此程序中,将`nSendByte`左移一位以实现流水灯效果。如果`nSendByte`变为0,则重新赋值为1以恢复初始状态。 3. **主函数**:`main()`函数调用初始化函数后进入无限循环,等待中断触发。 #### 注意事项 - 确保单片机的晶振频率与波特率设置匹配,否则可能导致通信异常。 - 流水灯的速度可以通过调整`delay()`函数中的延时参数进行修改。 - 在实际电路中,建议使用适当的限流电阻保护LED和74LS164
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值