久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機交通燈程序 4個數碼管
[打印本頁]
作者:
jiayoujiayou121
時間:
2025-4-24 23:22
標題:
單片機交通燈程序 4個數碼管
#define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
//數碼管段選定義 0 1 2 3 4 5 6 7 8 9 A B
uchar smg_du[]={0x40,0x75,0x0c,0x14,0x31,0x12,0x02,0x74,0x00,0x10,0x20,0x03,}; //斷碼
uchar dis_smg[4] = {0}; //數碼管顯示數組的緩沖區
//數碼管位選定義
sbit smg_we1 = P2^0; //數碼管位選IO口定義
sbit smg_we2 = P2^1; //數碼管位選IO口定義
sbit smg_we3 = P3^6; //數碼管位選IO口定義
sbit smg_we4 = P3^7; //數碼管位選IO口定義
sbit key1 = P1^0; //按鍵IO口定義
sbit key2 = P1^1; //按鍵IO口定義
sbit key3 = P1^2; //按鍵IO口定義
sbit key4 = P1^3; //按鍵IO口定義
uchar menu_1; //設置不同參數的變量
char dx_s = 0,nb_s = 0; //東西 南北 倒計時變量
sbit dx_red = P2^7; //東西紅燈IO口定義
sbit dx_green = P2^6; //東西綠燈IO口定義
sbit dx_yellow = P2^5; //東西黃燈IO口定義
sbit nb_red = P2^4; //南北紅燈IO口定義
sbit nb_green = P2^3; //南北綠燈IO口定義
sbit nb_yellow = P2^2; //南北黃燈IO口定義
bit flag_1s = 0; //1秒的變量
bit flag_500ms; //500毫秒的變量
bit flag_dx_nb = 0; //東西南北模式
uchar dx_time = 30,nb_time = 20; //東西、南北的時間設置的時間
uchar flag_jdgz ; //交通管制
/***********************數碼位選函數*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/********************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時1ms函數
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
uchar i;
/********************************************************************
* 名稱 : display()
* 功能 : 數碼管顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void display()
{
for(i=0;i<4;i++)
{
P0 = 0xff; //消隱
smg_we_switch(i); //位選
P0 = dis_smg[i]; //段選
delay_1ms(3); //延時
}
}
/*********************定時器0初始化******************/
void time0_init()
{
EA = 1; //開總中斷
TMOD = 0X01; //定時器0工作方式1
ET0 = 1; //開定時器0中斷
TR0 = 1; //允許定時器0定時
TH0 = 0x3c;
TL0 = 0xb0; //50ms
}
/*********************交通燈處理函數*********************************/
void jiaotongdeng_dis()
{
if(flag_1s == 1) //1秒執行一次里面的程序
{
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;
}
}
}
dis_smg[0] = smg_du[dx_s % 10] ; //顯示東西倒計時 時間
dis_smg[1] = smg_du[dx_s / 10] ;
dis_smg[2] = smg_du[nb_s % 10] ; //顯示南北倒計時 時間
dis_smg[3] = smg_du[nb_s / 10] ;
/***********************南北時間綠燈時間*********************************/
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) //當小于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) //當小于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(key1 == 0 || key2 == 0 || key3 == 0 || key4 == 0) //有按鍵按下
{
delay_1ms(1); //按鍵延時消抖動
if(key_new == 1)
{
key_new = 0; //key_new = 0 說明按鍵已按下
if(key1 == 0) //確認是按鍵按下
key_can = 1; //得到按鍵值
if(key2 == 0) //確認是按鍵按下
key_can = 2; //得到按鍵值
if(key3 == 0) //確認是按鍵按下
key_can = 3; //得到按鍵值
if(key4 == 0) //確認是按鍵按下
key_can = 4; //得到按鍵值
}
}
else
key_new = 1; //key_new = 1 說明按鍵已經松開了
}
/********************設置函數*****************/
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; //南北綠燈滅
}
}
if(key_can == 1) //設置鍵
{
menu_1 ++;
if(menu_1 >= 3)
{
menu_1 = 0; //menu_1 = 0 退出設置,是在正常顯示界面下
}
}
if(menu_1 == 1) //設置東西綠燈的時間
{
if(key_can == 2) //加鍵
{
dx_time ++ ; //設置東西綠燈的時間 加1
if(dx_time > 99)
dx_time = 99;
}
if(key_can == 3) //減鍵
{
dx_time -- ; //設置東西綠燈的時間 減1
if(dx_time <= 5)
dx_time = 5;
}
dis_smg[0] = smg_du[dx_time % 10] ; //顯示設置的東西綠燈的時間 個位數
dis_smg[1] = smg_du[dx_time / 10] ; //顯示設置的東西綠燈的時間 十位數
dis_smg[2] = smg_du[10] ; //顯示為A
dis_smg[3] = smg_du[10] ; //顯示為A
}
if(menu_1 == 2) //設置南北綠燈的時間
{
if(key_can == 2) //加鍵
{
nb_time ++ ; //設置南北綠燈的時間 加1
if(nb_time > 99)
nb_time = 99;
}
if(key_can == 3) //減鍵
{
nb_time -- ; //設置南北綠燈的時間 減1
if(nb_time <= 5)
nb_time = 5;
}
dis_smg[0] = smg_du[11] ; //顯示為B
dis_smg[1] = smg_du[11] ; //顯示為B
dis_smg[2] = smg_du[nb_time % 10] ; //顯示設置的南北綠燈的時間 個位數
dis_smg[3] = smg_du[nb_time / 10] ; //顯示設置的南北綠燈的時間 十位數
}
}
/********************************************************************
* 名稱 : main()
* 功能 : 實現燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
time0_init(); //定時器初始化程序
dx_s = nb_time + 5; //南北時間
nb_s = nb_time ; //東西時間
while(1)
{
key(); //按鍵函數
if(key_can > 0) //有按鍵按下
key_with(); //按鍵處理設置函數
if((menu_1 == 0) && (flag_jdgz == 0))
jiaotongdeng_dis(); //交通燈處理函數
if(flag_jdgz == 4) //夜間模式
if(flag_500ms == 1) // 南北黃燈閃 東西黃燈閃
{
flag_500ms = 0;
nb_yellow = ~nb_yellow; // 南北黃燈閃
dx_yellow = ~dx_yellow; // 東西黃燈閃
}
display(); //數碼管顯示函數
}
}
/*********************定時器0中斷服務程序************************/
void time0_int() interrupt 1
{
static uchar value; //定時50ms中斷一次
TH0 = 0x3c;
TL0 = 0xb0; //50ms
value ++;
if(value % 10 == 0)
flag_500ms = ~flag_500ms; //定時產生一個500毫秒的變量
if(value >= 20)
{
value = 0;
flag_1s = 1; //定時產生一個1秒的變量
}
}
復制代碼
# 交通燈 4個數碼管 大 1.zip
2025-4-24 23:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
528.64 KB, 下載次數: 0, 下載積分: 黑幣 -5
程序,原理圖
作者:
zwxzj
時間:
2025-5-12 07:13
這個程序寫的非常好,運行穩定可靠。
作者:
zwxzj
時間:
2025-5-13 22:40
有事請教
作者:
1600485495
時間:
2025-5-19 01:33
這個程序非常好
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久国产综合
|
亚洲福利
|
欧美成人免费在线视频
|
国产1区在线
|
日韩久久精品电影
|
中文字幕av色
|
亚洲免费视频在线观看
|
午夜精品一区
|
欧美 视频
|
亚洲精品成人av久久
|
视频一区二区中文字幕
|
老头搡老女人毛片视频在线看
|
日韩精品不卡
|
91亚洲国产成人精品一区二三
|
国产a视频
|
精品国产一区二区久久
|
www.788.com色淫免费
|
国产精品射
|
国产区精品
|
91精品一区二区
|
五月天婷婷综合
|
日韩在线精品强乱中文字幕
|
中文字幕亚洲精品
|
国产精品一区二区在线
|
国产日本精品视频
|
91精品久久久久久久久久小网站
|
国产精品视频区
|
亚洲91
|
国产人成在线观看
|
精品久久久999
|
成人片免费看
|
国产欧美日韩一区二区三区在线
|
国产区在线
|
国产精品99久久久久久久久久久久
|
精品久久香蕉国产线看观看亚洲
|
亚洲一区二区中文字幕
|
成人在线观看免费视频
|
九九热精品视频
|
亚洲综合色视频在线观看
|
日本成人中文字幕
|
精品一区二区三区在线观看国产
|