交通灯的仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include"reg51.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit dula=P2^1;
- sbit wela=P2^2;
- sbit p1_0=P1^0;
- uchar code dat[]={
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- uchar code tem[]={0x01,0x02,0x04,0x08,0x10,0x20};
- uint i;
- uchar num,st;
- void delay(uint);
- void init();
- void main()
- {
- init();
- dula=1;
- P0=0xc0;
- dula=0;
- while(1)
- {
- if(i==1000)
- {
- i=0;
- num++;
- if(st==0)
- {
- if(num==10)
- {
- num=0;
- st=1;
- P2=0x40;
- }
- }
- if(st==1)
- {
- if(num==2)
- {
- num=0;
- st=2;
- P2=0x30;
- }
- }
- if(st==2)
- {
- if(num==10)
- {
- num=0;
- st=3;
- P2=0x40;
- }
- }
- if(st==3)
- {
- if(num==2)
- {
- num=0;
- st=0;
- P2=0x88;
- }
- }
- dula=1;
- P0=dat[num];
- dula=0;
- delay(5);
- }
- }
- }
- //程序初始化
- void init()
- {
- EA=1;//开总中断允许
- EX0=0;//外部中断0允许
- IT0=0;//外部中断0为低电平触发方式
- TMOD=0X01;//设定T0为16位定时器
- ET0=1;//定时器T0中断允许
- TR0=1;//启动定时器T0
- TH0=0XFC;
- TL0=0X66;
- i=0;
- num=0;
- st=0;
- p1_0=1;
- wela=1;
- P0=0x01;
- wela=0;
- P0=0xff;
- P2=0x88;
- }
- //延时约为Z毫秒
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=113;y>0;y--);
- }
- //外部中断0
- void int0()interrupt 0
- {
- P2=0x28;
- st=0;
- i=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
单片机.zip
(87.5 KB, 下载次数: 15)
|