红绿灯共有五个阶段,直行和右转、左转、人行道、红灯、黄灯。数字键盘按1~5可以调节相对应阶段的时间,按#和*可以暂停所所有信号灯
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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; //允许定时器0中断;
- TMOD = 0x01; //定时器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)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
红绿灯 - 副本 - 副本 (2).rar
(234.65 KB, 下载次数: 13)
|