89c51单片机简易交通灯
时间: 2023-06-19 13:06:04 浏览: 32
下面是89C51单片机简易交通灯的代码,其中使用了外部中断和定时器/计数器:
```c
#include <reg51.h>
sbit red = P2^0; // 红灯控制引脚
sbit yellow = P2^1; // 黄灯控制引脚
sbit green = P2^2; // 绿灯控制引脚
sbit button = P3^2; // 外部中断按键引脚
unsigned char time_count; // 定时器计数器
void delay(int ms) // 延迟函数,单位为毫秒
{
int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 114; j++);
}
void timer_init() // 定时器初始化函数
{
TMOD &= 0xF0; // 清零定时器模式寄存器的低四位
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 定时器0计数初值
TL0 = 0x67;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xFC; // 定时器0计数初值
TL0 = 0x67;
time_count++; // 计时器加1
}
void button_init() // 外部中断初始化函数
{
EX0 = 1; // 允许外部中断0
IT0 = 1; // 外部中断0触发方式为下降沿触发
EA = 1; // 开启总中断允许位
}
void button0() interrupt 0 // 外部中断0服务函数
{
time_count = 0; // 计时器清零
red = 0; // 红灯亮
yellow = 1; // 黄灯灭
green = 1; // 绿灯灭
delay(3000); // 红灯亮3秒
yellow = 0; // 黄灯亮
delay(1000); // 黄灯亮1秒
red = 1; // 红灯灭
yellow = 1; // 黄灯灭
green = 0; // 绿灯亮
while (time_count < 10); // 绿灯亮10秒
green = 1; // 绿灯灭
}
void main()
{
red = 1; // 红灯灭
yellow = 1; // 黄灯灭
green = 0; // 绿灯亮
timer_init(); // 定时器初始化
button_init(); // 外部中断初始化
while (1);
}
```
在这个程序中,我们使用了一个外部中断和一个定时器/计数器。
外部中断使用了P3.2引脚,当这个引脚从高电平变为低电平时,就会触发外部中断0。在外部中断0的服务函数中,我们控制交通灯的状态,同时使用了计时器来控制绿灯亮的时间。
定时器/计数器使用了定时器0,当定时器0的计数器溢出时,就会触发定时器0中断。在定时器0的中断服务函数中,我们将计时器加1。我们设置了定时器0的初值为65536-5000,这样每次定时器0溢出时,就会延迟500ms。我们使用了一个变量time_count来记录交通灯的状态,当time_count小于10时,绿灯会一直亮着。
这个程序是一个简单的交通灯控制程序,可以通过外部中断0来控制交通灯的状态。当按下外部中断按键时,交通灯状态会依次变化:红灯亮3秒,黄灯亮1秒,绿灯亮10秒。在绿灯亮的过程中,我们使用了计时器来控制时间。
相关推荐















