当前位置:文档之家› 基于AT89C51单片机的交通灯实验报告

基于AT89C51单片机的交通灯实验报告

EW_GREEN = 1;
EW_IFGREEN = 1;
}
}
void led_show(){
int height_LED = LEDTIME/10;//高10位
int litter_LED = LEDTIME%10;//低10位
//南北方向的时间跳变控制
PA = 1;
PB = 1;
PC = 1;
P0 = LED_TABLE[litter_LED];//低10位
//是否到达1s
--TIME1S == 0 ? time_SUB() : "";
}
void main(){
init_SYS();//初始化系统
while(1);//一直循环等待T0中断的发生
}
void init_SYS(){
TMOD = 0x01;//工作方式1
TH0 = 0xEC;
TL0 = 0x78;
//红灯跳转到绿灯
SN_RED = 0;
SN_YELLOW = 1;
SN_GREEN = 0;
SN_IFGREEN = 1;
}
}
void east_west(){
if(EW_IFGREEN && LEDTIME == 5){
//绿灯跳转到黄灯的变换
EW_RED = 0;
EW_YELLOW = 1;
EW_GREEN = 0;
/*设置74HC138的位选码*/
sbit PA = P2^2;
sbit PB = P2^3;
sbit PC = P2^4;
//初始化系统信息
void init_SYS();
//每当时间运行1s时进行操作处理
void time_SUB();
//南北方向的交通灯的操作控制
void south_north();
PA = 1;
PB = 1;
PC = 0;
P0 = LED_TABLE[height_LED];
//东西方向的时间跳变控制
PA = 1;
PB = 0;
PC = 1;
P0 = LED_TABLE[litter_LED];
PA = 1;
PB = 0;
PC = 0;
P0 = LED_TABLE[height_LED];
TIME1S = 100;//重新从1秒处定时
south_north();
east_west();
LEDTIME-- == 0 ? LEDTIME = 60 : "";
led_show();//对于LED的时间更改操作
}
void south_north(){
if(SN_IFGREEN && LEDTIME == 5){
//绿灯跳转到黄灯的变换
SN_RED = 0;
SN_YELLOW = 1;
SN_GREEN = 0;
}else if(SN_IFGREEN && LEDTIME == 0){
//黄灯跳转到红灯
SN_RED = 1;
SN_YELLOW = 0;
SN_GREEN = 0;
}else if(!SN_IFGREEN && LEDTIME == 0){
}
//东西方向的交通灯的操作控制
void east_west();
//LED时间显示的操作控制
void led_show();
//复位系统
void reset_SYS() interrupt 0{
init_SYS();
}
/*
*设置一个T0的时间中断用于控制操作->>定时时间为10ms
*定时时间设置为10ms原因是->LED的动态扫描频率为100HZ
/*
* SN_IFGREEN:用于控制南北方向的灯的显示操作
* EW_IFGREEN:用于控制东西方向的灯的显示操作
* 0:红灯
* 1:绿灯
*/
int SN_IFGREEN = 0;
int EW_IFGREEN = 1;
/*用于控制定时时间为1s */
int TIME1S = 100;
/*用于控制时间为60s */
/*
*实现基于C51的交通信号灯的控制操作
*使用器件->>
* 1.74HC138用于控制LED的位选码的设定
* 2.T0->>实现一个时间的定时操作(设置为10ms)
* 3.P0->>作为LED现实的断码输出端
* 4.P1->>作为LED交通灯的信号灯的控制端
* 5.P2->>作为74HC138的为选码的控制端
* 6.P3.2->>作为一个复位的中断信号处理(与K1相连用于控制复位交通信号灯)
*需要考虑的一个问题是-》这个难道南北方向和东西方向的时间控制长短是一样的?
#include <reg51.h>
//LED显示的字符段码
static char[] LED_TABLE = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
IE = 0x83;//设置T0中断&init0外部中断0
TCON = 0x11;
/*
* 1.南北方向为:红灯
* 2.东西方向为:绿灯
*/
SN_RED = 1;
SN_YELLOW = 0;
SN_GREEN = 0;
EW_RED = 0;
EW_YELLOW = 0;
EW_GREEN = 1;
}
void time_SUB(){
*所以需要使用一个中断用于控制这个LED的显示操作(所以对于T0中断设置为10ms)
* 10ms->>65536-5000 = EC78
*/
void time_t10ms_SYS() interrupt 1{
TH0 = 0xEC;
TL0 = 0x78;
//每个10ms刷新LED显示
led_show();
}else if(EW_IFGREEN && LEDTIME == 0){
//黄灯跳转到红灯
EW_RED = 1;
EW_YELLOW = 0;
EW_GREEN = 0;
}else if(!EW_IFGREEN && LEDTIME == 0){
//红灯跳转到绿灯
EW_RED = 0;
EW_YELLOW = 0;
int LEDTIME = 60;
/* LED交通灯的设置*/
sbit SN_RED = P1^0;
sbit SN_YELLOW = P1^1;
sbit SN_GREEN = P1^2;
sbit EW_RED = P1^3;
sbit EW_YELLOW = P1^4;
sbit EW_GREEN = P1^5;
相关主题