运用keil,用at89c51单片机,灯D1亮1秒,灭1秒,以此反复,完整代码
时间: 2024-05-07 19:22:52 浏览: 6
以下是基于 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单片机,灯D1亮1秒,灭1秒,以此反复
在Keil中使用AT89C51单片机编写程序,实现灯D1亮1秒,灭1秒,以此反复的功能,可以参考以下代码:
```
#include <REGx51.H> //包含单片机头文件
void delay(unsigned int t) //定义延时函数
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<125;j++);
}
void main()
{
while(1) //循环执行
{
P1=0x01; //点亮D1灯
delay(1000); //延时1秒
P1=0x00; //熄灭D1灯
delay(1000); //延时1秒
}
}
```
在程序中,我们使用了一个`delay()`函数来实现延时功能。这个函数会让程序在运行到该语句时暂停一段时间,从而实现延时效果。在本例中,我们使用了一个简单的循环来实现延时,每执行一次循环就会让程序停留大约1毫秒,因此循环1000次就可以让程序停留1秒。
然后,在主函数中,我们使用了一个无限循环`while(1)`,来让程序不断执行灯的亮灭操作。在每次循环中,我们先点亮D1灯,然后延时1秒,再熄灭D1灯,再延时1秒。这样就可以实现灯D1亮1秒,灭1秒的循环效果了。
需要注意的是,由于AT89C51单片机的时钟速度较慢,因此我们需要使用一个比较大的延时循环来实现1秒的延时。在本例中,我们使用了一个循环1000次的延时函数,每次循环大约需要执行1毫秒的时间,因此循环1000次就可以让程序停留1秒。如果需要更精确的延时效果,可以根据具体的情况进行调整。
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 的值。接着定义了一些函数,包括启动信号、停止信号、应答信号、非应答信号、读取数据和写入数据等。然后实现了串口初始化函数、读取一个字节、发送一个字节和发送字符串等。最后在主函数中循环读取串口数据,并将读取到的字符串转化为整数,最后将整数显示在数码管上。