我觉得,厉害的是可以直接做PCB,仿真的和真实的还是有差距的,建议升级的8.2版本哦
交通灯仿真原理图
单片机交通灯源代码:
- /**************************************************************
- ** *
- *第一个状态:主干道、支干道均亮红灯5S *
- *第二个状态:主干道亮绿灯30S、支干道亮红灯 *
- *第三个状态:主干道绿灯闪3次转亮黄灯、支干道亮红灯3S *
- *第四个状态:主干道亮红灯、支干道亮绿灯25S *
- *第五个状态:主干道亮红灯、支干道绿灯闪3次转亮黄灯3S *
- *返回到第二个状态 *
- * *
- ***************************************************************
- /
- /* 11.0952M晶振*/
- #include//头文件
- #include//头文件
- #define uchar unsigned char//宏定义
- #define uint unsigned int//宏定义
- ***it RED_ZHU = P1^0;
- ***it YELLOW_ZHU = P1^1;
- ***it GREEN_ZHU = P1^2;
- ***it RED_ZHI = P1^3;
- ***it YELLOW_ZHI = P1^4;
- ***it GREEN_ZHI = P1^5;
- uint aa, bai,shi,ge,bb; //定义变量
- /*数码管显示0-9*/
- uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- /*子函数声明*/
- void delay(uint z);
- void delay0(uint z);
- //void init(uint a);
- void display(uint ge,uint shi);
- void xtimer0();
- void init1();
- void init2();
- void init3();
- void init4();
- void init5();
- void xint1();
- void xint0();
- void LED_ON();
- void LED_OFF();
- /*********************************************************
- 主函数
- *********************************************************/
- void main()
- {
- P0=0XFF;
- P1=0xFF;
- P2=0xFF;
- EA=1;//打开外部中断
- EX1=1;//允许外部中断1中断
- IT1=0;//INT0为沿触发方式
- init1();
- while(1)
- {
- init2();//第2个状态
- init3(); //第3个状态
- init4(); //第4个状态
- init5();//第5个状态
- }
- }
- void init1()//第一个状态:主干道、支干道均亮红灯5S
- {
- uint temp;
- temp=6;//变量赋初值
- TMOD=0x01;//定时器0工作于方式1
- TH0=0x4c;
- TL0=0x00;//定时器赋初值
- EA=1;//开外部中断
- ET0=1;//开定时中断
- TR0=1;//开定时器0
- while(1)
- {
- RED_ZHU=0; //第一个状态主干道、支干道均亮红灯5S
- RED_ZHI=0;
- GREEN_ZHU=1;
- GREEN_ZHI=1;
- YELLOW_ZHU=1;
- YELLOW_ZHI=1;
- if(aa==20)//定时20*50MS=1S
- {
- aa=0;//定时完成一次后清0
- temp--;//变量自增
- //delay(10);
- if(temp>250)//定时100S
- {
- temp=6;//变量清0
- break;
- }
- shi=temp%100/10;//显示十位
- ge=temp%10;//显示个位
- }
- display(ge,shi);
- }
- }
- void init2()//第二个状态:主干道亮绿灯30S、支干道亮红灯
- {
- uint temp;
- temp=31;//变量赋初值
- TMOD=0x01;//定时器0工作于方式1
- TH0=0x4c;
- TL0=0x00;//定时器赋初值
- EA=1;//开外部中断
- ET0=1;//开定时中断
- TR0=1;//开定时器0
- while(1)
- {
- RED_ZHU=1;
- RED_ZHI=0;
- GREEN_ZHU=0;
- GREEN_ZHI=1;
- YELLOW_ZHU=1;//第二个状态:主干道亮绿灯30S、支干道亮红灯
- YELLOW_ZHI=1;
- if(aa==20)//定时20*50MS=1S
- {
- aa=0;//定时完成一次后清0
- temp--;//变量自增
- if(temp==3)//定时100S
- {
- temp=30;//变量清0
- break;
- }
- shi=temp%100/10;//显示十位
- ge=temp%10;//显示个位
- }
- display(ge,shi);
- }
- }
- void init3() //第三个状态:主干道绿灯闪3次转亮黄灯、支干道亮红灯3S
- {
- uint temp;
- temp=4;//变量赋初值
- TMOD=0x01;//定时器0工作于方式1
- TH0=0x4c;
- TL0=0x00;//定时器赋初值
- EA=1;//开外部中断
- ET0=1;//开定时中断
- TR0=1;//开定时器0
- while(1)
- {
- RED_ZHI=0;
- GREEN_ZHU=1;
- //YELLOW_ZHU=~YELLOW_ZHU;
- if(aa==20)//定时20*50MS=1S
- {
- aa=0;//定时完成一次后清0
- temp--;//变量自增
- YELLOW_ZHU=~YELLOW_ZHU;
- if(temp>200)//定时100S
- {
- temp=4;//变量清0
- break;
- }
- shi=temp%100/10;//显示十位
- ge=temp%10;//显示个位
- }
- display(ge,shi);;
- }
- }
- void init4()//第四个状态:主干道亮红灯、支干道亮绿灯25S
- {
- uint temp;
- temp=26;//变量赋初值
- TMOD=0x01;//定时器0工作于方式1
- TH0=0x4c;
- TL0=0x00;//定时器赋初值
- EA=1;//开外部中断
- ET0=1;//开定时中断
- TR0=1;//开定时器0
- while(1)
- {
- RED_ZHU=0;
- RED_ZHI=1;
- YELLOW_ZHU=1;//第一个状态主干道、支干道均亮红灯5S
- GREEN_ZHI=0;
- if(aa==20)//定时20*50MS=1S
- {
- aa=0;//定时完成一次后清0
- temp--;//变量自增
- if(temp==3)//定时100S
- {
- temp=25;//变量清0
- break;
- }
- shi=temp%100/10;//显示十位
- ge=temp%10;//显示个位
- }
- display(ge,shi);
- }
- }
- void init5()//第五个状态:主干道亮红灯、支干道绿灯闪3次转亮黄灯3S
- {
- uint temp;
- temp=4;//变量赋初值
- TMOD=0x01;//定时器0工作于方式1
- TH0=0x4c;
- TL0=0x00;//定时器赋初值
- EA=1;//开外部中断
- ET0=1;//开定时中断
- TR0=1;//开定时器0
- while(1)
- {
- RED_ZHI=1;
- RED_ZHU=0;
- GREEN_ZHU=1;
- GREEN_ZHI=1;
- //YELLOW_ZHI=~YELLOW_ZHI;
- if(aa==20)//定时20*50MS=1S
- {
- aa=0;//定时完成一次后清0
- temp--;//变量自增
- YELLOW_ZHI=~YELLOW_ZHI;
- if(temp>200)//定时100S
- {
- temp=4;//变量清0
- break;
- }
- shi=temp%100/10;//显示十位
- ge=temp%10;//显示个位
- }
- display(ge,shi);
- }
- }
- /*显示子函数*/
- void display(uint ge,uint shi)
- {
- P0=0xfd;
- P2=table[shi];//显示十位
- delay0(5);
- P0=0xfe;
- P2=table[ge];//显示个位
- delay0(5);
- }
- void xint0() interrupt 2 //外部中断1,这里用2是INT1的优先级为0
- {
- LED_ON();
- }
- void LED_ON()//外部中断0显示子程序
- {
- RED_ZHI=0;
- RED_ZHU=0;
- GREEN_ZHI=1;
- GREEN_ZHU=1;
- YELLOW_ZHI=1;
- YELLOW_ZHU=1;
- delay0(1000);
- return ;
- }
- /*定时中断子函数*/
- void xtimer0() interrupt 1
- {
- TH0=0x4c;
- TL0=0x00;
- aa++;
- }
- /*延时子函数*/
- void delay0(uint z)
- {
- uint i,j;
- for(i=0;i for(j=0;j<110;j++);
- }
- /*********************************************************
- 500ms延时函数
- 晶振:11.0592MHz
- *********************************************************/
- void delay(unsigned char j)
- {
- unsigned char k;
- unsigned int i;
- for(;j>0;j--)
- {
- for(i=1250;i>0;i--)
- {
- for(k=180;k>0;k--);
- }
- }
- }
51Protues.rar
|
0
|
|
|
|