串口助手向AT89C51发送一串字符的keil代码
时间: 2023-10-24 14:25:22 浏览: 267
下面是向AT89C51发送一串字符的Keil代码:
```c
#include <REG51.H>
void main()
{
// 设置串口为模式1,波特率为9600
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
// 发送字符串
SBUF = 'H';
while(!TI);
TI = 0;
SBUF = 'e';
while(!TI);
TI = 0;
SBUF = 'l';
while(!TI);
TI = 0;
SBUF = 'l';
while(!TI);
TI = 0;
SBUF = 'o';
while(!TI);
TI = 0;
// 此处可以继续发送其它字符
// 无限循环
while(1);
}
```
在上面的代码中,我们首先设置了串口为模式1,波特率为9600。然后,我们通过 `SBUF` 向串口发送了每个字符,并使用 `TI` 标志位来判断每个字符是否发送成功。
需要注意的是,由于AT89C51芯片的串口通信需要外部晶振,因此在实际应用中需要将晶振连接到芯片上才能正常使用串口通信功能。
相关问题
Keil AT89C51单片机接收串口助手发送的字符串并转化为整数然后显示在数码管上的代码
以下是基于 Keil C51 编写的代码,实现了 AT89C51 单片机接收串口助手发送的字符串并转化为整数,最后将整数显示在数码管上:
```c
#include <reg51.h>
#define FOSC 11059200L
#define BAUD 9600
#define TH1 256 - FOSC / 12 / BAUD
sbit SDA = P1 ^ 0;
sbit SCL = P1 ^ 1;
sbit D1 = P2 ^ 0;
sbit D2 = P2 ^ 1;
sbit D3 = P2 ^ 2;
sbit D4 = P2 ^ 3;
void delay(unsigned int t)
{
while (t--);
}
void start()
{
SDA = 1;
delay(1);
SCL = 1;
delay(1);
SDA = 0;
delay(1);
SCL = 0;
delay(1);
}
void stop()
{
SDA = 0;
delay(1);
SCL = 1;
delay(1);
SDA = 1;
delay(1);
SCL = 0;
delay(1);
}
void ack()
{
SDA = 0;
delay(1);
SCL = 1;
delay(1);
SCL = 0;
delay(1);
SDA = 1;
delay(1);
}
void nack()
{
SDA = 1;
delay(1);
SCL = 1;
delay(1);
SCL = 0;
delay(1);
}
unsigned char read()
{
unsigned char i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
SCL = 1;
delay(1);
dat <<= 1;
dat |= SDA;
SCL = 0;
delay(1);
}
return dat;
}
void write(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SDA = dat & 0x80;
dat <<= 1;
delay(1);
SCL = 1;
delay(1);
SCL = 0;
}
ack();
}
void init_uart()
{
TMOD = 0x20;
TH1 = TH1;
SCON = 0x50;
TR1 = 1;
}
unsigned char get_byte()
{
while (!RI);
RI = 0;
return SBUF;
}
void put_byte(unsigned char dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}
void put_string(char *str)
{
while (*str)
{
put_byte(*str++);
}
}
void main()
{
char buf[16];
unsigned int num;
unsigned char i, len;
init_uart();
while (1)
{
i = 0;
while (1)
{
buf[i++] = get_byte();
if (buf[i - 1] == '\r')
{
buf[i - 1] = '\0';
break;
}
}
num = 0;
len = strlen(buf);
for (i = 0; i < len; i++)
{
num = num * 10 + buf[i] - '0';
}
D1 = num % 10;
D2 = num / 10 % 10;
D3 = num / 100 % 10;
D4 = num / 1000;
}
}
```
这段代码首先定义了几个宏,包括晶振频率、波特率以及定时器 TH1 的值。接着定义了一些函数,包括启动信号、停止信号、应答信号、非应答信号、读取数据和写入数据等。然后实现了串口初始化函数、读取一个字节、发送一个字节和发送字符串等。最后在主函数中循环读取串口数据,并将读取到的字符串转化为整数,最后将整数显示在数码管上。
Keil AT89C51单片机接收串口助手发送的字符串并转化为整数然后显示在数码管上的示例代码
以下是一个示例代码,可以实现Keil AT89C51单片机接收串口助手发送的字符串并转化为整数,然后将该整数显示在四位共阳数码管上。
```
#include <reg51.h>
sbit D1 = P2^0; // 数码管第一位
sbit D2 = P2^1; // 数码管第二位
sbit D3 = P2^2; // 数码管第三位
sbit D4 = P2^3; // 数码管第四位
unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示0~9的编码
void delay(unsigned int i) // 延时函数
{
unsigned int j, k;
for(j = i; j > 0; j--)
for(k = 110; k > 0; k--);
}
void display(unsigned int num) // 数码管显示函数
{
unsigned int i, j, k;
unsigned char temp;
temp = num / 1000; // 取出千位数
D1 = 0; D2 = 1; D3 = 1; D4 = 1; // 第一位数码管亮
for(i = 0; i < 50; i++) // 延时
delay(1);
P0 = table[temp]; // 显示千位数
for(i = 0; i < 50; i++) // 延时
delay(1);
temp = (num % 1000) / 100; // 取出百位数
D1 = 1; D2 = 0; D3 = 1; D4 = 1; // 第二位数码管亮
for(i = 0; i < 50; i++) // 延时
delay(1);
P0 = table[temp]; // 显示百位数
for(i = 0; i < 50; i++) // 延时
delay(1);
temp = (num % 100) / 10; // 取出十位数
D1 = 1; D2 = 1; D3 = 0; D4 = 1; // 第三位数码管亮
for(i = 0; i < 50; i++) // 延时
delay(1);
P0 = table[temp]; // 显示十位数
for(i = 0; i < 50; i++) // 延时
delay(1);
temp = num % 10; // 取出个位数
D1 = 1; D2 = 1; D3 = 1; D4 = 0; // 第四位数码管亮
for(i = 0; i < 50; i++) // 延时
delay(1);
P0 = table[temp]; // 显示个位数
for(i = 0; i < 50; i++) // 延时
delay(1);
}
void main()
{
unsigned char ch, i;
unsigned int num = 0;
TMOD = 0x20; // 定时器1工作在方式2(自动重装载)
TH1 = 0xfd; // 波特率为9600bps
TL1 = 0xfd;
SCON = 0x50; // 串口工作在方式1
TR1 = 1; // 启动定时器1
while(1)
{
while(RI == 0); // 等待接收到一个字符
ch = SBUF; // 读取接收到的字符
if(ch == '\r') // 如果接收到回车符,则表示整个字符串接收完毕
{
display(num); // 在数码管上显示该整数
num = 0; // 清零,准备接收下一个整数
}
else // 如果还没有接收到回车符,则将接收到的字符转化为整数
{
num = num * 10 + ch - '0';
}
RI = 0; // 清除接收中断标志位
}
}
```
需要注意的是,本示例代码中假设串口助手发送的字符串中只包含一个整数,并且该整数不大于9999。如果需要处理更复杂的情况,可以根据具体需求进行修改。
阅读全文