一个用51单片机做的交通灯的设计制作,而且带ad画的原理图和pcb,有c语言和汇编语言两种格式的源代码.
ad格式的原理图:
pcb图:
单片机c语言源代码:
- /* 程序效果:单片机模拟控制交通灯程序,规则如下:当南北通车时,此时南北的绿灯亮,
- 东西的红灯亮,之后南北的绿灯闪烁3次,过后黄灯亮,延时片刻,转东西绿灯亮同时南北红灯亮,
- 之后东西的绿灯闪烁3次,过后黄灯亮,延时片刻;数码管显示的值都同步,结束。*/
- #include<AT89X52.h> //头文件
- #define uchar unsigned char//宏定义
- #define uint unsigned int
- /* 旧IO定义*/
- sbit FMQ= P1^0; //蜂鸣器
- sbit QR = P1^3; //北红灯
- sbit QY = P1^1 ; //北黄灯
- sbit QG = P1^2 ; //北绿灯
- sbit HR = P2^2 ; //南红灯
- sbit HY = P2^0; //南黄灯
- sbit HG = P2^1; //南绿灯
- sbit ZR = P1^4 ; //东红灯
- sbit ZY = P1^5 ; //东黄灯
- sbit ZG = P1^6 ; //东绿灯
- sbit YR = P2^5 ; //西红灯
- sbit YY = P2^4 ; //西黄灯
- sbit YG = P2^3 ; //西绿灯
- sbit SWITCH1 = P2^7; //时间显示的十位控制
- sbit SWITCH2 = P2^6; //时间显示的个位控制
- /* //新IO定义
- sbit FMQ= P1^0; //蜂鸣器
- sbit QR = P1^1; //北红灯
- sbit QY = P1^2 ; //北黄灯
- sbit QG = P1^3 ; //北绿灯
- sbit HR = P1^4 ; //南红灯
- sbit HY = P1^5; //南黄灯
- sbit HG = P1^6; //南绿灯
- sbit ZR = P2^7 ; //东红灯
- sbit ZY = P2^6 ; //东黄灯
- sbit ZG = P2^5 ; //东绿灯
- sbit YR = P2^2 ; //西红灯
- sbit YY = P2^3 ; //西黄灯
- sbit YG = P2^4 ; //西绿灯
- sbit SWITCH1 = P2^1; //时间显示的十位控制
- sbit SWITCH2 = P2^0; //时间显示的个位控制
- */
- //sbit P3_2=P3^2;
- //sbit P3_3=P3^3;
- uchar DAT;//显示时间变量
- uchar DISP[2]={0,0};//显示缓冲区
- uchar code table[]={0xC0,0xF9,0xA4,0xB0, ////共阳数码管段码表0 1 2 3
- 0x99,0x92,0x82,0xF8,0x80,0x90,0xFF //4 5 6 7 8 9 灭
- };
- void DISPCLK(uchar i);//显示函数
- void DEL1MS(uint z) //延时子函数
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- void main() //主函数
- { // uchar i,j,k,m,n;//定义局部变量
- uchar i,j;
- TCON=0x5; //外部中断为下降沿触发
- PX1=1;//南北方向高优先级
- EX0=1; //
- EX1=1; //开外部中断
- EA=1; //开总中断
- //IO口初始化
- P0=0xFF;
- P1=0xFF;
- P2=0xFF;
- P3=0xFF;
- //DAT=25; //汇编0x25
- while(1)
- {
- P1=0xFF;//灯灭
- P2=0xFF;//
- DAT=30;//写入每一通路的通行时间
- QG=0;//南北向绿灯亮
- HG=0;
- ZR=0;//东西向红灯亮
- YR=0;
- /*
- QR =1; //北红灯
- QY =1 ; //北黄灯
- QG =0 ; //北绿灯 QG=0;//南北向绿灯亮
- HR =1 ; //南红灯
- HY =1 ; //南黄灯
- HG =0 ; //南绿灯
- ZR =0 ; //东红灯
- ZY =1 ; //东黄灯
- ZG =1 ; //东绿灯
- YR =0 ; //西红灯
- YY =1 ; //西黄灯
- YG =1 ; //西绿灯
- */
- //ACC=DAT;
- for(i=0;i<25;i++)
- {
- for(j=0;j<220;j++)
- {
- // BCD();//BCD码调整
- DISPCLK(DAT);//显示
- DEL1MS(3);//延时3毫秒
- }
- FMQ=1;//蜂鸣器响
- //ACC=DAT;
- // ACC=ACC+0x99; //完成数字的减1操作
- // DA A;//???
- DAT=DAT-1; //调整好的数字送显存
- }
- //最后5秒黄灯闪
- P1=0xff;
- P2=0xff;//关所有的灯
- ZY=0;//黄灯亮
- YY=0;
- QY=0;
- HY=0;
- for(i=0;i<5;i++)
- {
- for(j=0;j<220;j++)
- {
- //BCD();//BCD码调整
- DISPCLK(DAT);//显示
- DEL1MS(3);//延时3毫秒
-
- }
- QY=~QY;// 南北向黄灯亮
- HY=~HY;
- ZY=~ZY;//东西方向黄灯亮
- YY=~YY;
- FMQ=~FMQ;//黄灯时蜂鸣器叫一声
- DAT=DAT-1; ////完成数字的减1操作,调整好的数字送显存
-
- }
- P1=0xff;
- P2=0xff;
- DAT=20; //汇编0x20
- ZG=0;//东西方向绿灯亮
- YG=0;
- QR=0;//南北方向红灯亮
- HR=0;
- ACC=DAT;
- for(i=0;i<15;i++)//执行15秒
- {
- for(j=0;j<220;j++)
- {
- //BCD();//BCD码调整
- DISPCLK(DAT);//显示
- DEL1MS(3);//延时3毫秒
- }
- FMQ=1;//蜂鸣器响
- DAT=DAT-1;////完成数字的减1操作,调整好的数字送显存
-
- }
- //最后5秒黄灯闪
- P1=0xff;
- P2=0xff;//关所有的灯
- ZY=0;//黄灯亮
- YY=0;
- QY=0;
- HY=0;
- for(i=0;i<5;i++)
- {
- for(j=0;j<220;j++)
- {
- //BCD();//BCD码调整
- DISPCLK(DAT);//显示
- DEL1MS(3);//延时3毫秒
- }
- QY=~QY;// 南北向黄灯亮
- HY=~HY;
- ZY=~ZY;//东西方向黄灯亮
- YY=~YY;
- FMQ=~FMQ;//黄灯时蜂鸣器叫一声
- DAT=DAT-1; //完成数字的减1操作 ,调整好的数字送显存
-
- }
- }
-
- }
- void D_X() interrupt 0 using 0 //东西(横向)方向道路紧急通行50秒中断程序
- {
- uchar i,j,temp1,temp2,temp3; //定义局部变量
- EA=0;//关总中断
- P3_2=1;
- while(!P3_2) ;//等待按键释放
- temp1=DAT;//保存显示数据
- temp2=P1;
- temp3=P2;
- DAT=50;
- P1=0xff;
- P2=0xff;
- ZG=0;//东西方向绿灯亮
- YG=0;
- QR=0; //南北向红灯亮
- HR=0;
-
-
- for(i=0;i<50;i++)//执行50秒
- {
- for(j=0;j<220;j++)
- {
- //BCD(DAT);//BCD码调整
- DISPCLK(DAT);//显示
- DEL1MS(3);//延时3毫秒
- }
- DAT=DAT-1;////完成数字的减1操作,调整好的数字送显存
- }
- DAT=temp1;//回复显示数据
- P1=temp2;
- P2=temp3;
- EA=1;//开总中断
- }
- void N_B() interrupt 2 using 0 //南北(纵向)方向道路紧急中断程序
- {
- uchar i,j,temp1,temp2,temp3; //定义局部变量
- EA=0;//关总中断
- P3_3=1;
- while(!P3_3) ;//等待按键释放
- temp1=DAT;//保存显示数据
- temp2=P1;
- temp3=P2;
- DAT=50;
- P1=0xff;
- P2=0xff;
- ZR=0;//东西方向红灯亮
- YR=0;
- QG=0; //南北向绿灯亮
- HG=0;
- for(i=0;i<50;i++)//执行50秒
- {
- for(j=0;j<220;j++)
- {
- //BCD(DAT);//BCD码调整
- DISPCLK(DAT);//显示
- DEL1MS(3);//延时3毫秒
- }
- DAT=DAT-1;////完成数字的减1操作,调整好的数字送显存
- }
- DAT=temp1;//回复显示数据
- P1=temp2;
-
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
汇编语言单片机源码:
- ;智能交通灯控制器程序
- ;以下程序完成各脚的预定义
- FMQ EQU P1.0 ;蜂鸣器
- QR EQU P1.1 ;北红灯
- QY EQU P1.2 ;北黄灯
- QG EQU P1.3 ;北绿灯
- HR EQU P1.4 ;南红灯
- HY EQU P1.5 ;南黄灯
- HG EQU P1.6 ;南绿灯
- ZR EQU P2.7 ;东红灯
- ZY EQU P2.6 ;东黄灯
- ZG EQU P2.5 ;东绿灯
- YR EQU P2.2 ;西红灯
- YY EQU P2.3 ;西黄灯
- YG EQU P2.4 ;西绿灯
- SWITCH1 EQU P2.1 ;时间显示的十位控制
- SWITCH2 EQU P2.0 ;时间显示的个位控制
-
- DAT EQU 60H ;显存
-
- ORG 0000H
- LJMP START
- ORG 0003H
- LJMP D_X ;外部中断0,东西向紧急按键
- ORG 000BH
- RETI ;
- ORG 0013H
- LJMP N_B ;外部中断1,南北向紧急按键
- ORG 001BH
- RETI
- ORG 0023H
- RETI
- ORG 0040H ;定位
- START:
-
- MOV TCON, #5H ;外部中断为下降沿触发
- SETB EX0 ;
- SETB EX1 ;开外部中断
- SETB EA ;开总中断
- ;IO口初始化
- MOV P0,#0FFH
- MOV P1,#0FFH ;
- MOV P2,#0FFH ;
- MOV P3,#0FFH ;
- MOV DAT, #25H ;
-
-
- AUTCLK:
- MOV P1, #0FFH ;
- MOV P2, #0FFH ;
- MOV DAT, #30H ;写入每一通路的通行时间
- CLR QG ;南北向绿灯亮
- CLR HG ;
- CLR ZR ;东西向红灯亮
- CLR YR ;
-
- MOV A, DAT ;
- MOV R2, #25 ;写入时间值
- A1:
- MOV R1, #220 ;
- A2:
- ACALL BCD ;BCD调整
- ACALL DISPCLK ;显示
- ACALL DEL1MS ;延时
- ACALL DEL1MS ;
- ACALL DEL1MS ;
- DJNZ R1, A2 ;
- SETB FMQ ;
- MOV A, DAT ;完成数字的减1操作
- ADD A, #99H ;
- DA A ;
- MOV DAT, A ;调整好的数字送显存
- DJNZ R2, A1 ;
- ;最后5秒黄灯闪
- MOV P1, #0FFH ;
- MOV P2, #0FFH ;关所有灯
- CLR ZY ;黄灯亮
- CLR YY ;
- CLR QY ;
- CLR HY ;
- MOV R2, #5 ;
- A3:
- MOV R1, #220 ;
- A4:
- ACALL BCD ;
- ACALL DISPCLK ;
- ACALL DEL1MS ;
- ACALL DEL1MS ;
- ACALL DEL1MS ;
- DJNZ R1, A4 ;
- CPL QY ;南北向绿灯亮
- CPL HY ;
- CPL ZY ;东西向红灯亮
- CPL YY ;
- CPL FMQ ;黄灯时蜂鸣器叫一声
- MOV A, DAT ;
- ADD A, #99H ;
- DA A ;
- MOV DAT, A ;
- DJNZ R2, A3 ;
- ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- MOV P1, #0FFH ;
- MOV P2, #0FFH ;
- MOV DAT, #20H ;
- CLR ZG ;东西向绿灯亮
- CLR YG ;
- CLR QR ;南北向红灯亮
- CLR HR ;
- MOV A, DAT ;
- MOV R2, #15 ;执行15秒
- A5:
- MOV R1, #220 ;
- A6:
- ACALL BCD ;BCD调整
- ACALL DISPCLK ;显示
- ACALL DEL1MS ;
- ACALL DEL1MS ;
- ACALL DEL1MS ;
- DJNZ R1, A6 ;
- SETB FMQ ;
- MOV A, DAT ;
- ADD A, #99H ;减1操作
- DA A ;
- MOV DAT, A ;
- DJNZ R2, A5 ;
- ;最后5秒黄灯闪
- MOV P1, #0FFH ;
- MOV P2, #0FFH ;关所有灯
- CLR ZY ;黄灯亮
- CLR YY ;
- CLR QY ;
- CLR HY ;
- MOV R2, #5 ;
- A7:
- MOV R1, #220 ;
- A8:
- ACALL BCD ;
- ACALL DISPCLK ;
- ACALL DEL1MS ;
- ACALL DEL1MS ;
- ACALL DEL1MS ;
- DJNZ R1, A8 ;
- CPL QY ;南北向黄灯亮
- CPL HY ;
- CPL ZY ;东西向黄灯亮
- CPL YY ;
- CPL FMQ ;黄灯时蜂鸣器叫一声
- MOV A, DAT ;
- ADD A, #99H ;
- DA A ;
- MOV DAT, A ;
- DJNZ R2, A7 ;
- AJMP AUTCLK ;
- NOP ;
- NOP ;
- NOP ;
- LJMP START
- ;;*********************************
- ;;显示子程序
- ;;**********************************
- DISPCLK:
- MOV DPTR, #TAB ;定入表头
- ;显示个位
- MOV A, 50H ;
- MOVC A, @A+DPTR ;
- MOV P0, A ;
- CLR SWITCH2 ; 个位显示
- LCALL DEL1MS ;
- SETB SWITCH2 ;个位灭
- ;显示十位
- MOV A, 51H ;
- MOVC A, @A+DPTR ;
- MOV P0, A ;
- CLR SWITCH1 ; 十位显示
- LCALL DEL1MS ;
- SETB SWITCH1 ; 十位灭
- RET ;
- NOP ;
- NOP ;
- NOP ;
- LJMP START
- ;************************************************************
- ;横向道路紧急中断程序
- ;************************************************************
- D_X:
- CLR EA ;关总中断
- JNB P3.2, $ ;
- MOV A, DAT ;保存显示数据
- MOV 20H, A ;
- MOV DAT, #50H ;
- MOV 21H, P1 ;
- MOV 22H, P2 ;
- MOV P1, #0FFH ;
- MOV P2, #0FFH ;
- CLR ZG ;东西向绿灯亮
- CLR YG ;
- CLR QR ;南北向红灯亮
-
- …………限于本文篇幅 余下代码请从51黑下载附件…………
- \032
复制代码
下载:
实例4 交通灯.zip
(6.96 MB, 下载次数: 127)
|