紅綠燈共有五個(gè)階段,直行和右轉(zhuǎn)、左轉(zhuǎn)、人行道、紅燈、黃燈。數(shù)字鍵盤按1~5可以調(diào)節(jié)相對(duì)應(yīng)階段的時(shí)間,按#和*可以暫停所所有信號(hào)燈
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei截圖20200624082839.png (78.85 KB, 下載次數(shù): 70)
下載附件
2020-6-24 08:31 上傳
單片機(jī)源程序如下:
- #include "reg51.h"
- #include "intrins.h"
- typedef unsigned char uchar;
- sbit X_forward = P1^0;
- sbit X_left = P1^1;
- sbit X_rignt = P1^2;
- sbit Y_forward = P1^3;
- sbit Y_left = P1^4;
- sbit Y_rignt = P1^5;
- sbit X_red = P1^6;
- sbit X_yellow = P1^7;
- sbit Y_yellow = P3^0;
- sbit Y_red = P3^1;
- sbit Y_red_people = P3^2;
- sbit Y_green_people = P3^3;
- sbit X_red_people = P3^4;
- sbit X_green_people = P3^5;
- uchar dir = 0; // x--0; y--1;
- uchar dat[] = {0,0};//ge,shi,y(f,l,r,s),x(f,l,r,s) //0-s 1-f 2-l 3-r
- char dx[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- int red_sj = 5;
- int yellow_sj = 3;
- int green_sj = 5;
- int left_sj = 5;
- int right_sj = 5;
- int people_sj = 5;
- int num = 0;
- uchar jd = 2;
- int state;
- int cmd;
- char key_value[] = {
- 0x3d,0x73,0x75,0x76,
- 0x6b,0x6d,0x6e,0x5b,
- 0x5d,0x5e,0x3b,0x3e
- };
- void ledDisplay(){
- uchar j,i;
- for(j=0;j<4;j++)
- {
- i = P3;
- i &= 0x3f;
- i |= ((j<<6)&0xc0);
- P3 = i;
- P0 = dx[dat[j>1?j-2:j]];
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- P0 = 0x00;
- }
- }
- void init(){ //初始化
- IE = 0x02; //允許定時(shí)器0中斷;
- TMOD = 0x01; //定時(shí)器0工作方式1
- TH0 = 0xDF;
- TL0 = 0x72;
- EA = 1; //開中斷
- }
- void set_state(uchar shi,uchar ge,uchar dirY,uchar dirX,uchar x_red,uchar x_yellow,uchar y_red,uchar y_yellow,uchar x_people,uchar y_people)
- {
- dat[1] = ge;
- dat[0] = shi;
- switch(dirY)
- {
- case 0: Y_forward=1;Y_left=1;Y_rignt=1;break;
- case 1: Y_forward=0;Y_left=1;Y_rignt=0;break;
- case 2: Y_forward=1;Y_left=0;Y_rignt=1;break;
- case 3: Y_forward=1;Y_left=1;Y_rignt=0;break;
- }
- switch(dirX)
- {
- case 0: X_forward=1;X_left=1;X_rignt=1;break;
- case 1: X_forward=0;X_left=1;X_rignt=0;break;
- case 2: X_forward=1;X_left=0;X_rignt=1;break;
- case 3: X_forward=1;X_left=1;X_rignt=0;break;
- }
- X_red = x_red;
- X_yellow = x_yellow;
- Y_red = y_red;
- Y_yellow = y_yellow;
-
- switch(x_people)
- {
- case 0: X_green_people = 1;X_red_people = 0;break;
- case 1: X_green_people = 0,X_red_people = 1;break;
- }
- switch(y_people)
- {
- case 0: Y_green_people = 1;Y_red_people = 0;break;
- case 1: Y_green_people = 0,Y_red_people = 1;break;
- }
-
- }
- void key_chuli(int i)
- {
- if(state==0)
- {
- cmd = i;
- state = 1;
- }else if(state==1)
- {
- switch(cmd)
- {
- case 1:red_sj = i;break;
- case 2:yellow_sj = i;break;
- case 3:green_sj = i;break;
- case 4:left_sj= i;break;
- case 5:right_sj= i;break;
- case 6:people_sj= i;break;
- }
- state = 2;
- }else if(state==2)
- {
- switch(cmd)
- {
- case 1:red_sj *= 10; red_sj += i;break;
- case 2:yellow_sj *= 10; yellow_sj += i;;break;
- case 3:green_sj *= 10; green_sj += i;;break;
- case 4:left_sj *= 10; left_sj += i;;break;
- case 5:right_sj *= 10; right_sj += i;;break;
- case 6:people_sj *= 10; people_sj += i;;break;
- }
- state = 0;
- }
- }
- void key_san(void)
- {
- int i;
- char wz;
- P2 = 0x07;
- if(P2!=0x07){
- _nop_();
- if(P2!=0x07){
- wz = P2;
- P2 = 0x78;
- wz |= (P2&0x78);
- for(i=0;i<12;i++){
- if(key_value[i]==wz){
- if(i>9)
- {
- set_state(0,0,0,0,0,1,0,1,0,0);
- TR0 = 0;
- while(1)
- {
- ledDisplay();
- }
- }else
- {
- key_chuli(i);
- P2 = 0x07;
- while(P2!=0x07);
- }
- }
- }
- }
- }
- }
- void main(void)
- {
- init();
- TR0 = 1;
- while(1)
- {
- key_san();
- ledDisplay();
- }
- }
- void chuli(void)
- {
- if(dir)
- {
- switch(jd)
- {
- case 1:set_state((red_sj/10)%10,red_sj%10,0,0,0,1,0,1,0,0);break;
- case 2:set_state((yellow_sj/10)%10,yellow_sj%10,0,0,0,1,1,0,0,0);break;
- case 3:set_state((green_sj/10)%10,green_sj%10,1,0,0,1,1,1,0,0);break;
- case 4:set_state((left_sj/10)%10,left_sj%10,2,0,0,1,1,1,0,0);break;
- case 5:set_state((people_sj/10)%10,people_sj%10,0,0,1,1,1,1,0,1);break;
- }
- }else
- {// shi, ge, dirY, dirX, x_red, x_yellow, y_red, y_yellow, x_people, y_people
- switch(jd)
- {
- case 1:set_state((red_sj/10)%10,red_sj%10,0,0,0,1,0,1,0,0);break;
- case 2:set_state((yellow_sj/10)%10,yellow_sj%10,0,0,1,0,0,1,0,0);break;
- case 3:set_state((green_sj/10)%10,green_sj%10,0,1,1,1,0,1,0,0);break;
- case 4:set_state((left_sj/10)%10,left_sj%10,0,2,1,1,0,1,0,0);break;
- case 5:set_state((people_sj/10)%10,people_sj%10,0,0,1,1,0,1,1,0);break;
- }
- }
-
- }
- void time_chuli(void)
- {
- if(dat[0]==0&dat[1]==0)
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
紅綠燈 - 副本 - 副本 (2).rar
(234.65 KB, 下載次數(shù): 13)
2020-6-24 08:41 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|