单片机代码:使用51单片机的串行口从PC机接收数据,通过2位数码管来显示接收数据,同时通过8个LED灯以二进制的形式来显示接收数据,然后把接收数据加1后重新发送给PC机。
时间: 2023-11-13 12:05:06 浏览: 102
单片机接收数据并发送到PC机_51单片机;发送数据;_
5星 · 资源好评率100%
以下是使用51单片机的串口口从PC机接收数据,通过2位数码管来显示接收数据,同时通过8个LED灯以二进制的形式来显示接收数据,然后把接收数据加1后重新发送给PC机的代码:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIO = P2^0; //定义数码管数据口
sbit RCLK = P2^1; //定义锁存控制口
sbit SCLK = P2^2; //定义移位控制口
sbit LED = P1^0; //定义LED灯
uchar data_receive; //串口接收到的数据
uchar data_display; //用于显示的数据
uchar data_send; //要发送的数据
//数码管显示字符
uchar code LedChar[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
//数码管位选
uchar code LedPos[]={
0xfe,0xfd
};
//延时函数
void Delay(uint i)
{
while(i--);
}
//串口初始化
void UartInit()
{
TMOD = 0x20; //设置定时器1为模式2
TH1 = 0xfd; //设置波特率为9600
TL1 = 0xfd;
TR1 = 1; //启动定时器1
SM0 = 0; //设置串口工作模式
SM1 = 1;
REN = 1; //启用串口接收
EA = 1; //开启总中断
ES = 1; //开启串口中断
}
//数码管显示函数
void LedDisplay(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DIO = dat & 0x01;
dat >>= 1;
SCLK = 0;
_nop_();
_nop_();
SCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
//主函数
void main()
{
UartInit(); //串口初始化
while(1)
{
data_display = data_receive; //将接收到的数据显示在数码管上
LedDisplay(LedChar[data_display/10]); //数码管第一位显示
Delay(500);
LedDisplay(LedChar[data_display%10]); //数码管第二位显示
Delay(500);
LED = data_receive & 0x01; //LED灯第一位显示
data_receive >>= 1;
LED = data_receive & 0x01; //LED灯第二位显示
data_receive >>= 1;
LED = data_receive & 0x01; //LED灯第三位显示
data_receive >>= 1;
LED = data_receive & 0x01; //LED灯第四位显示
data_receive >>= 1;
LED = data_receive & 0x01; //LED灯第五位显示
data_receive >>= 1;
LED = data_receive & 0x01; //LED灯第六位显示
data_receive >>= 1;
LED = data_receive & 0x01; //LED灯第七位显示
data_receive >>= 1;
LED = data_receive & 0x01; //LED灯第八位显示
Delay(500);
data_send = data_display + 1; //将接收到的数据加1后发送
SBUF = data_send;
while(!TI);
TI = 0;
}
}
//串口中断服务函数
void Uart() interrupt 4
{
if(RI) //接收到数据
{
data_receive = SBUF; //保存接收到的数据
RI = 0; //清除接收标志
}
if(TI) //发送完成
{
TI = 0; //清除发送标志
}
}
```
这个程序使用定时器1和串口中断来接收和发送数据,使用移位寄存器和锁存器来控制数码管的显示,使用位运算和延时函数来控制LED灯的显示。需要注意的是,这个程序并没有对串口通信进行错误处理,因此在实际使用时需要进行相应的改进。
阅读全文