|
以下是一個51單片機的交通信號紅綠燈源程序,試運行一切正常,但我想將原來的信號燈輸出端口東西紅燈(P3.4)、東西黃燈(P3.5)、東西綠燈(P3.3);南北紅燈(P3.2)、南北黃燈(P3.1)、南北綠燈(P3.0)這六個端口由原來的低電平輸出有效修改為高電平輸出有效(也就是將源程序中定義輸出端口低電平時點亮信號燈修改為輸出端口高電平時點亮信號燈),謝謝了!
以下是電路圖僅供參考:
以下是源程序:
#include <reg52.h> //調(diào)用單片機頭文件
#define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
sbit key4 = P3^7; //按鍵IO口定義(狀態(tài)設(shè)置)
uchar menu_1; //設(shè)置不同參數(shù)的變量
char dx_s = 0,nb_s = 0; //東西 南北 倒計時變量
sbit dx_red = P3^4; //東西紅燈IO口定義(pin1~p3.4)
sbit dx_green = P3^3; //東西綠燈IO口定義(pin8~p3.3)
sbit dx_yellow = P3^5; //東西黃燈IO口定義(pin3~p3.5)
sbit nb_red = P3^2; //南北紅燈IO口定義(pin7~p3.2)
sbit nb_green = P3^0; //南北綠燈IO口定義(pin5~p3.0)
sbit nb_yellow = P3^1; //南北黃燈IO口定義(pin6~p3.1)
bit flag_1s = 0; //1秒的變量
bit flag_500ms; //500毫秒的變量
bit flag_dx_nb = 0; //東西南北模式
uchar dx_time = 20,nb_time = 35; //東西、南北的時間
uchar flag_jdgz ; //交通管制
/********************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時1ms函數(shù)
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
uchar i;
/***********************************************************************/
void display()
{
for(i=0;i<4;i++)
{
P0 = 0xff; //消隱
//位選
//段選
delay_1ms(3); //延時
}
}
/*********************定時器0、定時器1初始化******************/
void time0_init()
{
EA = 1; //開總中斷
TMOD = 0X01; //定時器0工作方式1
ET0 = 1; //開定時器0中斷
TR0 = 1; //允許定時器0定時
TH0 = 0x3c;
TL0 = 0xb0; //50ms
}
/*********************交通燈處理函數(shù)*********************************/
void jiaotongdeng_dis()
{
if(flag_1s == 1) //1秒執(zhí)行一次里面的程序
{
flag_1s = 0;
if(flag_dx_nb == 0) //南北綠燈時間
{
dx_s --; //東西倒計時時間減1
nb_s --; //南北倒計時時間減1
if(dx_s == 5)
nb_s = 5;
}
if(flag_dx_nb == 1) //東西綠燈時間
{
dx_s --; //南北倒計時時間減1
nb_s --; //東西倒計時時間減1
if(nb_s == 5)
dx_s = 5;
}
if(dx_s <= 0) //倒計時時間為0切換東西 南北綠燈時間
{
flag_dx_nb = ~flag_dx_nb;
if(flag_dx_nb == 1) //東西時間
{
dx_s = dx_time;
nb_s = dx_time + 5;
}
else //南北時間
{
dx_s = nb_time + 5;
nb_s = nb_time;
}
}
}
/***********************南北時間*********************************/
if(flag_dx_nb == 0)
{
if(dx_s > 5)
{
dx_red = 0; //東西紅燈亮
dx_green = 1; //東西紅燈滅
dx_yellow = 1; //東西黃燈滅
nb_red = 1; //南北紅燈滅
nb_green = 0; //南北綠燈亮
nb_yellow = 1; //南北黃燈滅
}else if(dx_s <= 5) //當(dāng)小于5秒時 黃燈要閃了
{
dx_red = 0; //東西紅燈滅
dx_green = 1; //東西紅燈滅
dx_yellow = 1; //東西黃燈滅
nb_red = 1; //南北紅燈滅
nb_green = 1; //南北綠燈滅
if(flag_500ms == 0) //黃燈閃爍
{
nb_yellow = 0; //亮
}
else
{
nb_yellow = 1; //滅
}
}
}
/***********************東西時間*********************************/
if(flag_dx_nb == 1)
{
if(nb_s > 5)
{
dx_red = 1; //東西紅燈滅
dx_green = 0; //東西紅燈亮
dx_yellow = 1; //東西黃燈滅
nb_red = 0; //南北紅燈亮
nb_green = 1; //南北綠燈滅
nb_yellow = 1; //南北黃燈滅
}else if(nb_s <= 5) //當(dāng)小于5秒時 黃燈要閃了
{
dx_red = 1; //東西紅燈滅
dx_green = 1; //東西紅燈滅
nb_red = 0; //南北紅燈亮
nb_green = 1; //南北綠燈滅
nb_yellow = 1; //南北黃燈滅
if(flag_500ms == 0) //黃燈閃爍
{
dx_yellow = 0;//東西黃燈亮
}
else
{
dx_yellow = 1;//東西黃燈滅
}
}
}
}
/********************獨立按鍵程序*****************/
uchar key_can; //按鍵值
void key() //獨立按鍵程序
{
static uchar key_new; //key_new 這個變量的功能是做按鍵松手檢測的
key_can = 0; //按鍵值還原成0
if( key4 == 0) //有按鍵按下
{
delay_1ms(1); //按鍵延時消抖動
if(key_new == 1)
{
key_new = 0; //key_new = 0 說明按鍵已按下
if(key4 == 0) //確認(rèn)是按鍵按下
key_can = 4; //得到按鍵值
}
}
else
key_new = 1; //key_new = 1 說明按鍵已經(jīng)松開了
}
/********************設(shè)置函數(shù)*****************/
void key_with()
{
if(key_can == 4) //交通管制按鍵
{
flag_jdgz ++;
if(flag_jdgz > 4)
flag_jdgz = 0;
if(flag_jdgz == 1) // 全部亮紅燈
{
dx_red = 0; //東西紅燈亮
dx_green = 1; //東西綠燈滅
dx_yellow = 1; //東西黃燈滅
nb_red = 0; //南北紅燈亮
nb_green = 1; //南北綠燈滅
nb_yellow = 1; //南北黃燈滅
}
if(flag_jdgz == 2) // 東西紅燈 南北綠燈
{
dx_red = 0; //東西紅燈亮
dx_green = 1; //東西綠燈滅
dx_yellow = 1; //東西黃燈滅
nb_red = 1; //南北紅燈滅
nb_green = 0; //南北綠燈亮
nb_yellow = 1; //南北黃燈滅
}
if(flag_jdgz == 3) // 南北紅燈 東西綠燈
{
dx_red = 1; //東西紅燈滅
dx_green = 0; //東西綠燈亮
dx_yellow = 1; //東西黃燈滅
nb_red = 0; //南北紅燈亮
nb_green = 1; //南北綠燈滅
nb_yellow = 1; //南北黃燈滅
}
if(flag_jdgz == 4) // 南北黃燈閃 東西黃燈閃
{
dx_red = 1; //東西紅燈滅
dx_green = 1; //東西綠燈滅
nb_red = 1; //南北紅燈滅
nb_green = 1; //南北綠燈滅
}
}
}
/********************************************************************
* 名稱 : main()
* 功能 : 實現(xiàn)燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
time0_init(); //定時器初始化程序
dx_s = nb_time + 5; //南北時間
nb_s = nb_time ; //東西時間
while(1)
{
key(); //按鍵函數(shù)
if(key_can > 0) //有按鍵按下
key_with(); //按鍵處理函數(shù)
if((menu_1 == 0) && (flag_jdgz == 0))
jiaotongdeng_dis(); //交通燈處理函數(shù)
if(flag_jdgz == 4) //夜間模式
if(flag_500ms == 1) // 南北黃燈閃 東西黃燈閃
{
flag_500ms = 0;
nb_yellow = ~nb_yellow; // 東西黃燈閃
dx_yellow = ~dx_yellow; // 東西黃燈閃
}
display(); //數(shù)碼管顯示函數(shù)
}
}
/*********************定時器0中斷服務(wù)程序************************/
void time0_int() interrupt 1
{
static uchar value; //定時50ms中斷一次
TH0 = 0x3c;
TL0 = 0xb0; //50ms
value ++;
if(value % 10 == 0)
flag_500ms = ~flag_500ms; //定時產(chǎn)生一個500毫秒的變量
if(value >= 20)
{
value = 0;
flag_1s = 1; //定時產(chǎn)生一個1秒的變量
}
}
|
|