串口控制74HC164C语言,51单片机74HC164串口控制数码管显示
时间: 2023-07-27 10:26:03 浏览: 62
好的,我来回答你的问题。首先,74HC164是一个8位移位寄存器,可以实现串行输入并行输出的功能,适合驱动数码管等显示器件。而在51单片机中,我们可以通过串口通信来控制74HC164。
下面是一个简单的代码示例,可以实现通过串口控制74HC164驱动数码管显示数字:
```c
#include <reg51.h>
// 74HC164控制引脚定义
sbit HC164_CLK = P1^0;
sbit HC164_SER = P1^1;
sbit HC164_RCLK = P1^2;
// 数码管显示码表
unsigned char code LED_Table[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f
};
// 串口初始化
void UART_Init() {
TMOD |= 0x20; // 设置定时器1为模式2
TH1 = 0xfd; // 波特率设置为9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 设置串口为模式1
ES = 1; // 允许串口中断
EA = 1; // 允许总中断
}
// 串口发送数据
void UART_SendByte(unsigned char dat) {
SBUF = dat;
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
}
// 延时函数
void delay(unsigned int n) {
unsigned int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 50; j++);
}
}
// 74HC164移位函数
void HC164_Shift(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
HC164_CLK = 0;
HC164_SER = (dat & 0x80) ? 1 : 0;
dat <<= 1;
HC164_CLK = 1;
}
}
// 74HC164输出函数
void HC164_Output() {
HC164_RCLK = 0;
HC164_RCLK = 1;
}
// 主函数
void main() {
unsigned char num = 0;
UART_Init(); // 初始化串口
while (1) {
// 等待串口接收完成
while (!RI);
num = SBUF; // 读取串口数据
RI = 0; // 清除接收完成标志
HC164_Shift(LED_Table[num]); // 移位
HC164_Output(); // 输出
}
}
```
在这个代码中,我们将串口通信设置为了9600波特率,当接收到一个字节的数据时,就将其作为数字0~9的索引,查表得到对应的数码管显示码,然后通过HC164移位和输出函数控制74HC164驱动数码管显示。