运用keil,用at89c51单片机,灯D1亮1秒,灭1秒,以此反复,完整代码
时间: 2024-05-07 09:22:52 浏览: 183
以下是基于 keil 平台的 at89c51 单片机代码,实现灯 D1 亮 1 秒,灭 1 秒,以此反复循环:
```
#include <reg52.h>
void delay(unsigned int xms); // 延时函数声明
void main()
{
while(1) // 循环执行
{
P1 = 0x01; // 灯 D1 亮
delay(1000); // 延时 1 秒
P1 = 0x00; // 灯 D1 灭
delay(1000); // 延时 1 秒
}
}
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
```
其中,延时函数 `delay()` 可以根据实际需要进行修改,这里默认为 1 毫秒的延时。需要注意的是,单片机的时钟频率可能会影响到延时的准确性,这里默认使用 12MHz 的时钟频率。如果实际使用的时钟频率不同,需要相应地调整延时函数的参数。
相关问题
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。如果需要处理更复杂的情况,可以根据具体需求进行修改。
阅读全文