交通灯实验报告 班级: 姓名: 一.实验要求 使用单片机系统主机板和单片机系统I/O板设计一个硬件系统,最终实现一个交通路口红绿灯的控制。用两个数码管显示秒,8个LED灯分成四组,分别作为十字交叉路口的红绿灯。亮灯的状态是:亮1s,灭1s
二.硬件连线方案见下表: 使用的并口 | 主机板插座 | I/O板插座 | 功能 | P0 | P2 | P00 | 段码传送至数码管 | P1 | P3 | P20 | 控制信号传送至数码管.段选DULA、位选G1、地址CBA | P2 | P4 | P2 | 给指示灯传送数据 |
三.程序流程图可参考下图:
四:单片机源代码 - #include<reg51.h> //包含特殊功能寄存器声明头文件
- sbit dula=P1^3; // 特殊功能位定义,数码管段码控制信号
-
- sbit g1=P1^4; //数码管位选控制信号
-
- sbit c=P1^5; //c表示P1.0口,地址最高位
- sbit b=P1^6; //地址次高位
- sbit a=P1^7; //地址最低位
- sbit sg=P2^0; //特殊功能位
- sbit sr=P2^1;
- sbit eg=P2^2;
- sbit er=P2^3;
- sbit ng=P2^4;
- sbit nr=P2^5;
- sbit wg=P2^7;
- sbit wr=P2^6;
- char s=10,ms=0;
-
- unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义无符号数组,定义的数据要放在ROM(程序存储区)里面
- bit fang=0;
-
- void delay(){ //延时函数,通过for循环进行延时
- unsigned char i; //定义计数器变量
- for(i=0;i<255;i++);
- }
-
- initial(){ //初始化函数
- TMOD=1; //设置定时器/计数器0工作方式1
- TL0=0XF0; //设置定时器/计数器0赋初值(低八位)
- TH0=0XD8; //设置定时器/计数器0赋初值(高八位)
-
- TR0=1; //启动定时器TO
- ET0=1; //允许定时器TO中断
- EA=1; //允许CPU中断
- sr=1;
- sg=0;
- er=0;
- eg=1;
- nr=1;
- ng=0;
- wr=0;
- wg=1;
- g1=0;
- }
-
- display(){
- P0=tab[s/10];dula=1; //显示秒十位
- c=1;b=1;a=0;g1=1;
- delay(); //延时
- g1=0;
-
- P0=tab[s%10];dula=1; //显示秒个位
- c=1;b=1;a=1;g1=1;
- delay();
- g1=0;
- }
-
- main(){ //主函数
- initial();
- while(1){ //无限循环
- display(); //延时
- }
- }
-
- t_0() interrupt 1{ //外部信号出发中断1中断服务函数
- TL0=0XF0; //设置定时器/计数器0赋初值(低八位)
- TH0=0XD8; //设置定时器/计数器0赋初值(高八位)
- ms++; //计数器加1
- if(ms==50&&s<=3){
- wg=1;
- sg=1;
- eg=1;
- ng=1;
- }
- if(ms==100){ //判断计数器是否记满100
- if(fang==0){ //数码管显示0
- ng=0;
- sg=0;
- }
- else{
- eg=0;
- wg=0;
- }
- ms=0;
- s--;
- if(s==0){ //数码管显示0
- s=10;
- fang=~fang;
- sr=~sr;
- sg=~sg;
- er=~er;
- eg=~eg;
- nr=~nr;
- ng=~ng;
- wr=~wr;
- wg=~wg;
- }
- }
- }
复制代码
五.实验总结: 最终实现一个交通路口红绿灯的控制。用两个数码管显示秒,8个LED灯分成四组,分别作为十字交叉路口的红绿灯。相对双向绿灯的最后几秒时,绿灯要闪烁,即亮灭交替,亮灭时间均为0.5秒,然后变成红灯。
完整的Word格式文档51黑下载地址:
|