这是一个运用51单片机写的交通灯的例子,可以显示时间,红黄蓝等,第一个按键是左右路通行20S,第二个按键是上下路通行20S,第一个按键是所有路都是红灯20S。这是从时钟该来的程序,与上一个始终的程序大体相同。
#include
#define uint unsigned int
int code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,
};
sbit hongA=P0^0;
sbit huangA=P0^1;
sbit lvA=P0^2;
sbit hongB=P0^3;
sbit huangB=P0^4;
sbit lvB=P0^5;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
int t=0,t1=0,flag=0,tt0,tt1;
void delay();
void ziyou();
void Bfangxing();
void Afangxing();
void zhongduan();
void main()
{
EA=1;//开总中断
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
P0=0xff;
lvA=0;//打开绿灯
hongB=0;
while(1)
{
if(flag==0) ziyou();//自由状态
if(flag==1) Afangxing();//B放行期间改变
if(flag==2) Bfangxing();//B放行期间改变
if(flag==3) zhongduan();//B放行期间改变
if(tt0==-1) {tt1--;tt0=9;}
P3=0X01;
P2=table[tt1];
delay();
P3=0X02;
P2=table[tt0];
delay();
}
}
void delay()
{
int i;
for(i=0;i<200;i++);
}
void ziyou()//自由状态
{
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;//减少秒
}
if(t1==0)
{
hongB=0;lvB=1;huangB=1;//B道
lvA=0;huangA=1;hongA=1;//A道
tt1=3;tt0=0;
}
if(t1==30)//30
{
hongB=0;lvB=1;huangB=1;//B道
lvA=1;huangA=0;hongA=1;//A道
tt1=0;tt0=5;
}
if(t1==35)//35
{
hongB=1;lvB=0;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
tt1=2;tt0=0;
}
if(t1==55)//55
{
hongA=0;lvA=1;huangA=1;//A道
lvB=1;huangB=0;hongB=1;//B道
tt1=0;tt0=5;
}
if(t1==60)//60
{
t1=0;
tt1=0;tt0=0;
}
}
void Afangxing()//A放行
{
hongB=0;lvB=1;huangB=1;//B道
lvA=0;huangA=1;hongA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==15)
{
t1=30;//跳至30
flag=0;
}
}
void Bfangxing()//B放行
{
hongB=1;lvB=0;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==15)
{
t1=55;//跳至55
flag=0;
}
}
void zhongduan()//key3
{
hongB=0;lvB=1;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==20)
{
t1=0;//跳至55
flag=0;
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
t++; //tt=20为1s
if(key1==0)
{
if(t1>30) {flag=1;t=0;t1=0;tt1=1;tt0=5;}//35
}
if(key2==0)
{
if(t1<35) {flag=2;t=0;t1=0;tt1=1;tt0=5;}//35
}
if(key3==0)
{ tt1=2;tt0=0;
flag=3;t=0;t1=0;
}
}
关键字:交通灯 定时器 51单片机
引用地址:
运用定时器中断写的交通灯
推荐阅读最新更新时间:2024-03-16 13:51
51单片机的控制引脚介绍
ALE/#PROG:地址锁存控制/片内EPROM编程脉冲输入信号 ALE(Address Lock Enable)功能是在访问外部存储器时,P0口做为地址/数据复用口,ALE信号用于锁存低8位地址。当ALE信号为高电平时,P0口上的信息为低8位地址,在ALE信号的下降沿时将P0口上的低8位地址送到地址锁存器锁存起来。在ALE为低电平期间P0口上的信息为指令或数据信息。在ALE为低电平期间P0口上的信息为指令或数据信息,以实现低位地址与数据的分离。 值的注意的是,在访问片外数据存储器时,人会缺少一个ALE脉冲。 当不访问外部存储器时,该信号也以晶振频率的六分之一固定输出正脉冲信号,可以作为外部的定时脉冲使
[单片机]
基于51单片机的无线防盗报警器
一.硬件方案 本无线多路防盗报警器由l台接收机和多台发射机组成。接收机可以接收多台发射机(其频率都是一样的,只是编码脉冲不同)发来的报警信号,并且加以区别,进行译码然后以数字显示的形式将这些台发射机识别出来,同时音响报警。 多路无线防盗报警器主要是由无线人体探测器(红外探测信号发射电路)、无线接收电路、数据解码电路、中央控制单元、数字显示单元、遥控电路、报警电路和电源电路等部分组成,如图: 二.设计功能 (1)主机有三个控制按键,一个按键布防,一个按键是遇到紧急情况紧急报警(或是测试键),一个是撤防。另一个为单片机的上电复位按键。 (2)按下布防按键后, 30秒后进入监控状态(此时有人靠近不报警),当有人靠近时,热释红外感
[单片机]
51单片机+ESP8266点亮LED小灯
ESP8266模块采用STA工作模式,先在电脑上用串口调试助手,将ESP8266模块设置为STA模式,波特率9600,具体指令如下: 1.设置AP模式 AT+CWMODE=2 2.复位生效 AT+RST 3.配置热点 AT+CWSAP= test , 12345678 ,1,3 这样即使ESP8266复位也不会将这些信息擦除,直接上后面的指令就可以 单片机接ESP8266一定注意两者一定要共地,否则ESP8266不能正常工作,ESP8266电源要3.3V供电,5V的貌似不行,ESP8266的EN脚外接一个1K欧的电阻再接3.3V电源 #include reg52.h typedef unsigned char u8; typed
[单片机]
51单片机16*16LED点阵滚动显示
* 功能:LED16*16点阵滚动显示 说明:74LS154用作发送数据,P0,P2口用来列选 看本程序最好的工具最好旁边有标号和语法着色,推荐keil或UltraEdit 懒人提示:要改成自己所要的显示内容,要怎么改? 1.要改显示内容改第23~92行代码,还有第119行代码,具体改法见下面注释 2.要改滚动速度改第102行代码 */ /*头文件*/ #include reg52.h #include intrins.h /*宏定义*/ #define uchar unsigned char #define uint unsigned int /*函数声明*/ void delay(); /*全局变量*/ uint li
[单片机]
基于51单片机的多点8路温度采集系统
硬件设计 仿真图1: 总共有8路温度采集点,基于DS18B20,LCD1602以轮询的方式显示 程序设计 #include AT89X52.h #include Intrins.h #define DATA P1 //1602驱动端口 //ROM操作命令 #define READ_ROM 0x33 //读ROM #define SKIP_ROM 0xCC //跳过ROM #define MATCH_ROM 0x55 //匹配ROM #define
[单片机]
51单片机编写60秒倒计时程序
#include reg52.h #define guan P0 #define wei P2 #define uchar unsigned char #define uint unsigned int uint m=0; uchar a1,a0,k=0,j,k,s=60; sbit beep=P2^3; unsigned char code weiyu ={0x1f,0x2f,0x4f,0x8f}; //代码与P2对应做位处理,显示相应的位 unsigned char code table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x
[单片机]
51单片机STC89C52定时器中断法扫描数码管及秒表的实现
定时器中断法扫描数码管及秒表的实现 程序源码 /*-----------------------包含头文件区域-------------------------*/ #include reg52.h //单片机头文件 /*-----------------------数据类型定义区域-----------------------*/ typedef unsigned char u8; //定义类型unsigned char别名为u8 typedef unsigned int u16; //定义类型unsigned int别名为u16 /*-----------------------用户自定义数据区域----
[单片机]
基于51单片机的自动转换开关控制器设计
1. 引言(Introduction) 随着近几年技术的进步和发展,在电源切换系统中出现了一种新型产品——自动转换开关电器(ATSE),它由1个(或几个)转换开关电器和其它必需的电器组成,用于监测电源电路,并将负载电路(出现故障)从一个电源自动转至另一个(备用)电源的开关电器,是专用于电源转换的新型产品,可以说自动转换开关电器(ATSE)代表着电源切换系统类产品发展的方向 。它主要用在紧急供电系统,如:消防、电梯等供电系统,在民用住宅和商用住宅中有着广泛的应用。其产品应用的场合决定了其可靠性尤为重要。转换一旦失败将会造成以下二种危害之一:电源间的短路或重要负荷断电(甚至短暂停电),其后果都是严重的。这不仅仅会带来经济损失(使生
[单片机]