欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機交通信號燈Proteus仿真小制作(程序注釋很詳細)
[打印本頁]
作者:
hcc12138
時間:
2019-6-1 23:16
標題:
51單片機交通信號燈Proteus仿真小制作(程序注釋很詳細)
一個在科技節上的小制作交通信號燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(43.94 KB, 下載次數: 50)
下載附件
2019-6-2 06:05 上傳
單片機源程序如下:
#include <reg52.h> //調用單片機頭文件
#define uchar unsigned char //宏定義"uchar"代替"unsigned char"。
#define uint unsigned int //宏定義"uint"用來定義無符號整型數。
#define LED_a 0 //數碼管段選的a段接在段選IO口的第0位
#define LED_b 1
#define LED_c 2
#define LED_d 3
#define LED_e 4
#define LED_f 5
#define LED_g 6
#define LED_dp 7
uchar code DisplayOther[]={
0xff, //0 空
0x7f, //1 "."
0xbf, //2 "-"
0xa7 //3 c
};
//數碼管段選定義 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[10] = {
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
};
uchar dis_smg[4] = {0xc0,0xf5,0x8c,0x94};
//數碼管位選定義
sbit smg1 = P2^0; //東西數碼管2
sbit smg2 = P2^1; //東西數碼管1
sbit smg3 = P2^2; //南北數碼管2
sbit smg4 = P2^3; //南北數碼管1
char count = 0; //東西 南北 倒計時變量
sbit nb_red = P1^0; //南北紅燈
sbit nb_green = P1^2; //南北綠燈
sbit nb_yellow = P1^1; //南北黃燈
sbit dx_red = P1^3; //東西紅燈
sbit dx_green = P1^5; //東西綠燈
sbit dx_yellow = P1^4; //東西黃燈
uchar flag_jtd_mode; //交通燈的模式 根據時間
bit flag_1s = 1; //進入南北方向切換的標志位
bit flag_500ms;
bit flag_dx_nb; //東西南北模式
uchar flag_5m_value;
uchar dx_time = 30,nb_time = 30; //東西、南北的時間
uchar flag_jdgz ; //交通管制
/********************************************************************
* 名稱 : uchar ChangeFor(uchar dat)
* 功能 : 交換一個字節位的位置,用于數碼管顯示
* 輸入 : 需要改變的數
* 輸出 : 改變后的數
***********************************************************************/
uchar ChangeFor(uchar dat){
uchar temp=0;
if(dat&0x01)
temp|=0x01<<LED_a;
if(dat&0x02)
temp|=0x01<<LED_b;
if(dat&0x04)
temp|=0x01<<LED_c;
if(dat&0x08)
temp|=0x01<<LED_d;
if(dat&0x10)
temp|=0x01<<LED_e;
if(dat&0x20)
temp|=0x01<<LED_f;
if(dat&0x40)
temp|=0x01<<LED_g;
if(dat&0x80)
temp|=0x01<<LED_dp;
return temp;
}
/***********************數碼管位選函數*****************************/
void smg_we_switch(uchar i){
switch(i){
case 0: smg1 = 0; smg2 = 1; smg3 = 1; smg4 = 1; break;
case 1: smg1 = 1; smg2 = 0; smg3 = 1; smg4 = 1; break;
case 2: smg1 = 1; smg2 = 1; smg3 = 0; smg4 = 1; break;
case 3: smg1 = 1; smg2 = 1; smg3 = 1; smg4 = 0; break;
}
}
/****************************延時1ms函數****************************/
void delay_1ms(uint q){
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/***************************數碼管顯示函數*****************************/
void DisplayScan(){
static uchar i;
{
{
P0 = 0xff; //消隱
smg_we_switch(i); //位選
P0 = ChangeFor(dis_smg[i]); //段選
delay_1ms(3);
}
i++;
if(i>=4)
i=0;
}
}
/*********************定時器0、定時器1初始化******************/
void time0_init(){
TMOD = 0x01; //設置定時器0為工作模式1 (16-bit)
TL0 = 15536; //給定時器低位賦初始值 65536-15536=50000us=50ms,即50ms一個中斷
TH0 = 15536 >> 8; //給定時器高位賦初始值
TR0 = 1; //開啟定時器0
ET0 = 1; //允許定時器0中斷
EA = 1; //開啟全局中斷
}
/*********************交通燈處理函數*********************************/
void traffic_light_dispose(){
if(flag_1s == 1){//如果切換標志為1
flag_1s = 0; //清零標志位
if(count == 0){
if(flag_dx_nb == 1)
count = nb_time; //南北時間
else
count = dx_time; //東西時間
flag_dx_nb = ~flag_dx_nb; //切換南北時間
}
count --;
}
/***********************南北時間*********************************/
if(flag_dx_nb == 0){
if(count > 3){
dis_smg[0] = smg_du[count % 10] ;
dis_smg[1] = smg_du[count / 10] ;
dis_smg[2] = smg_du[(count-3) % 10] ;
dis_smg[3] = smg_du[(count-3) / 10] ;
dx_red = 1; //滅
dx_yellow = 1; //滅
nb_green = 1; //滅
nb_yellow = 1; //滅
dx_green = 0; //亮
nb_red = 0; //亮
flag_5m_value = 0;
}
else if(count <= 3){ //當小于3秒時 黃燈閃爍
dis_smg[0] = smg_du[count % 10] ;
dis_smg[1] = smg_du[count / 10] ;
dis_smg[2] = smg_du[count % 10] ;
dis_smg[3] = smg_du[count / 10] ;
dx_red = 1; //滅
dx_green = 1; //滅
nb_green = 1; //滅
nb_yellow = 1; //滅
nb_red = 0; //亮
if(flag_500ms == 0){ //黃燈閃爍
dx_yellow = 0;//亮
}
else{
dx_yellow = 1;//滅
}
}
}
/***********************東西時間*********************************/
if(flag_dx_nb == 1){
if(count > 3){
dis_smg[0] = smg_du[(count-3) % 10] ;
dis_smg[1] = smg_du[(count-3) / 10] ;
dis_smg[2] = smg_du[count % 10] ;
dis_smg[3] = smg_du[count / 10] ;
dx_red = 0; //亮
nb_green = 0; //亮
nb_yellow = 1; //滅
dx_green = 1; //滅
dx_yellow = 1; //滅
nb_red = 1; //滅
flag_5m_value = 0;
}
else if(count <= 3){ //當小于3秒時 黃燈閃爍
dis_smg[0] = smg_du[count % 10] ;
dis_smg[1] = smg_du[count / 10] ;
dis_smg[2] = smg_du[count % 10] ;
dis_smg[3] = smg_du[count / 10] ;
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; //滅
}
}
}
}
uchar key_can; //按鍵值
//按鍵定義
sbit Key1=P1^6; //設置鍵
sbit Key2=P1^7; //加按鍵
sbit Key3=P3^2; //減按鍵
sbit Key4=P3^3; //交通管制鍵
//========================================================================
// 函數: uchar Key_Scan()
// 應用: temp=uchar Key_Scan();
// 描述: 按鍵掃描并返回按下的鍵值
// 返回: 按下的鍵值
// 日期: 2019-03-31
// 備注: 該函數帶松手檢測,按下鍵返回一次鍵值后返回0,直至第二次按鍵按下
//========================================================================
uchar Key_Scan(){
static uchar key_up=1;//按鍵松開標志
if(key_up&&(Key1==0||Key2==0||Key3==0||Key4==0)){
delay_1ms(10);//去抖動
key_up=0;
if(Key1==0) return 1;
else if(Key2==0)return 2;
else if(Key3==0)return 3;
else if(Key4==0)return 4;
}
else if(Key1==1&&Key2==1&&Key3==1&&Key4==1)
key_up=1;
return 0;// 無按鍵按下
}
uchar menu_1;//縱橫加減標示
/********************設置函數*****************/
void setting(){
if(key_can == 4){ //交通管制按鍵
flag_jdgz ++;
if(flag_jdgz > 5)
flag_jdgz = 0;
if(flag_jdgz == 1){ // 全部亮紅燈
dx_red = 0; //亮
nb_red = 0; //亮
dx_green = 1; //滅
dx_yellow = 1; //滅
nb_green = 1; //滅
nb_yellow = 1; //滅
}
if(flag_jdgz == 2){ // 全部亮黃燈
dx_red = 1; //滅
dx_green = 1; //滅
nb_red = 1; //滅
nb_green = 1; //滅
nb_yellow = 0; //亮
dx_yellow = 0; //亮
}
if(flag_jdgz == 3){ // 全部亮綠燈
dx_green = 0; //亮
nb_green = 0; //亮
dx_red = 1; //滅
dx_yellow = 1; //滅
nb_red = 1; //滅
nb_yellow = 1; //滅
}
if(flag_jdgz == 4){ // 東西綠燈 南北紅燈
dx_red = 0; //亮
nb_green = 0; //亮
dx_green = 1; //滅
dx_yellow = 1; //滅
nb_red = 1; //滅
nb_yellow = 1; //滅
}
if(flag_jdgz == 5){ // 南北綠燈 東西紅燈
dx_green = 0; //亮
nb_red = 0; //亮
dx_red = 1; //滅
dx_yellow = 1; //滅
nb_green = 1; //滅
nb_yellow = 1; //滅
}
}
if(key_can == 1){ //設置鍵
menu_1 ++;
if(menu_1 >= 3){
menu_1 = 0;
}
}
if(menu_1 == 1){ //設置東西的時間
if(key_can == 2){
dx_time ++ ; //加1
if(dx_time > 99) //時間最大值為99s
dx_time = 99;
}
if(key_can == 3){
dx_time -- ; //減1
if(dx_time <= 5) //時間最小值為5s
dx_time = 5;
}
dis_smg[0] = smg_du[(dx_time-1) % 10] ;
dis_smg[1] = smg_du[(dx_time-1) / 10] ;
dis_smg[2] = DisplayOther[2] ;
dis_smg[3] = DisplayOther[2] ;
}
if(menu_1 == 2){ //設置南北的時間
if(key_can == 2){
nb_time ++ ; //加1
if(nb_time > 99) //時間最大值為99s
nb_time = 99;
}
if(key_can == 3){
nb_time -- ; //減1
if(nb_time <= 5) //時間最小值為5s
nb_time = 5;
}
dis_smg[0] = DisplayOther[2] ;
dis_smg[1] = DisplayOther[2] ;
dis_smg[2] = smg_du[(nb_time-1) % 10] ;
dis_smg[3] = smg_du[(nb_time-1) / 10] ;
}
}
/*********************************主函數********************************/
void main(){
time0_init();
while(1){
key_can=Key_Scan();
if(key_can)
setting();
if((menu_1 == 0) && (flag_jdgz == 0))
traffic_light_dispose();
DisplayScan();
}
}
/*********************定時器0中斷服務程序************************/
void time0_int() interrupt 1 {
static uchar value; //定時10ms中斷一次
TL0 = 15536; //給定時器低位重裝初始值 65536-15536=50000us=50ms,即50ms一個中斷
TH0 = 15536 >> 8; //給定時器高位重裝初始值
value ++;
flag_5m_value++;
if(flag_5m_value % 10 == 0)
flag_500ms = ~flag_500ms;
if(value >= 20){
value = 0;
flag_1s = 1;
}
}
復制代碼
0.png
(5.57 KB, 下載次數: 55)
下載附件
2019-6-2 06:06 上傳
所有資料51hei提供下載:
科技節——基于51單片機的交通燈項目.zip
(1.41 MB, 下載次數: 96)
2019-6-1 23:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
248653
時間:
2019-6-7 13:44
大神們,這個電路圖需不需要接鎖存器或者譯碼器
作者:
7676598
時間:
2019-6-10 12:29
這里面沒有DSN文件 別被他一個圖騙了
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1