河南理工大学万方科技学院
课程设计报告
200 8 — 200 9 学年第 2 学期
课程名称 单片机的c语言程序设计 设计题目 交通灯
学生姓名
学 号 0628030053 专业班级 通信06-1班 指导教师
20xx年06月 02日
1
河南理工大学万方科技学院
目录
一.前言??????????????????????3 二.功能概述······?????????????????3
三.设计思路????????????????????3
四.硬件介绍????????????????????4
五.软件程序设计??????????????????7
六.电路图及仿真实现???·????????????10
七.总结??????????????????????11
八.源程序?????????????????????12 参考文献??????????????????????14
2
河南理工大学万方科技学院
一.前言
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多,在学习了单片机的有关知识之后,运用相关知识来设计完成交通信号灯。
二.功能概述
2.1设计任务:交通灯的硬件和软件设计
2.2设计目的
1.进一步熟悉和掌握单片机的结构和工作原理。
2.掌握单片机的接口技术及相关外围芯片的外特性,控制方法。
3.通过课程设计,掌握以单片机为核心的电路设计的基本方法和技术,了解有关电路参数的计算方法。
4.通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
5.通过完成一个包括电路设计和程序开发的完整过程,为我们今后从事相应工作打下基础。
三.设计思路
交通灯的变化规律
按照常规我们假设一个十字路口为东西南北走向。初始状态为状态1,南北方向绿灯通车,东西方向红灯。经过过一段时间(25S)转换状态2,南北方向绿灯闪几次转亮黄灯,延时5S,东西方向仍然红灯。再转换到状态3,东西方向
3
河南理工大学万方科技学院
绿灯通车,南北方向红灯。过一段时间(25S)转换到状态4,东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯。最后循环至南北绿灯,东西红灯。在这些状态下,有时钟倒数计时。
四.硬件介绍
基础知识
交通灯控制器实例主要使用了89C51单片机的定时器/计数器,基础知识主要包括交通灯的变化规律、定时器/计数器的概念、定时器/计数器的相关寄存器、定时器/计数器的4种工作方式、以及定时器/计数器的变成。
4.1定时器/计数器
定时器/计数器是单片机中最常用、最重要的功能模块之一,本节通过交通灯控制器实例来演示定时器的使用,并复习如何使用散转程序。
首先介绍交通灯以及定时器/计数器的基础知识,接着介绍本实例的硬件电路构成,然后逐步分析定时器的变成以及程序的全貌,最后总结一下本实例的技巧与注意点。
4.2定时器/计数器的概念
89C51单片机内有两个可编程的定时器/计数器T0、T1。
当定时器/计数器用作“定时器”时,每经过1个机器周期(12个时钟周期),计数器加1。
当定时器/计数器用作“计数器”时,计数器在对应的外部输入管脚(T0为P3.4引脚,T1为P3.5引脚)上每发生一次1到0的跳变时加1。使用“计数器”功能时,外部输入每个机器周期被采样一次。当某一周期管脚状态采样为高电平而下一周期采样为低电平时,计数器加1。由于检测下降沿跳变需要两个机器周期(24个时钟周期)的时间,所以技术频率最大值只能为时钟周期的1/24。计数器对外部输入信号的占空比并无限制,但为了保证给定的电平信号在其改变之前至少被采样一次,外部输入信号必须至少保持一个完整的机器周期。
4.3定时器/计数器的相关寄存器
与定时器/计数器相关的寄存器有定时器/计数器工作方式寄存器(TMOD)、定时器/计数器控制寄存器(TCON)。TCON已经在2.5节受控输出实例中介绍过,
4
河南理工大学万方科技学院
因此,在本例中主要介绍TMOD寄存器。
定时器/计数器工作方式寄存器(TMOD),字节地址89H,不可进行位寻址。 定时器/计数器工作方式寄存器(TMOD)的8位分为两组,高4位控制T1,低4位控制T0。TMOD每一位的功能如下。
GATE:门控位。
GATE=0,仅由运行控制位TRX(X=0,1)=1来启动定时器/计数器运行; GATE=1,由运行控制位TRX(X=0,1)=1和外部中断引脚上的高电平共同来启动定时器/计数器运行。
C/T:定时器模式和计数器模式选择位。
C/T=0,为定时器模式;
C/T=1,为计数器模式。
M1、M0:工作方式选择位。M1、M0的4中编码对应4种工作方式,对应关系见表2-10。
4.5定时器/计数器的4种工作方式
定时器/计数器的4种工作方式下的逻辑结构如表所示。
(1)方式0。
定时器/计数器的工作方式0称为13位定时器/计数器的。它由TLX的低5位和TLX的8位构成13位的计数器,此时TLX的高3位未使用。改工作方式是为了和48系列单片机兼容而设计的一种工作方式,一般情况不使用方式0进行定时/计数。方式0的控制方式与方式1完全相同,下面重点介绍方式1的控制方式 。
(2)方式1
定时器/计数器的工作方式1称为16位定时器/计数器。它由TLX和THX构成,TLX计数溢出向THX进位,THX计数溢出置位TCON中溢出标志位TFX。
5
河南理工大学万方科技学院
GATE位的状态定时器/计数器运行控制取决于TRX一个条件还是TRX和INTX引脚这两个条件。当GATE=0时,则只要TRX被置为1,定时器/计数器即被允许计数(定时器/计数器的计数控制仅由TRX的状态确定,TRX=1计数,TRX=0停止计数)。当GATE=1时,定时器/计数器是否计数由INTX输入的电平和TRX的状态共同确定:当TRX=1,且INTX=1时,才允许定时器/计数器计数(定时器/计数器的计数控制由TRX和INTX两个条件控制)。
(3)方式2
定时器/计数器的工作方式0和方式1再计数溢出后,计数器的值为0,需要通过程序重新装入计数初值。
定时器/计数器的工作方式1称为初值自动重装的8位定时器/计数器。在该工作方式下,TLX作为计数器,当TLX计数溢出时,在置1溢出标志TFX的同时,还自动的将THX中的常数送至TLX,使TLX从该常数开始重新计数。这种工作方式可以省去用户软件中重装常数的程序,简化定时常数的计算方法(确定计数初值),可以相当精确地确定定时时间。
(4)方式3
工作方式3仅对定时器/计数器0有效,在该工作方式之下,定时器/计数器的0被拆成2个独立的定时器/计数器:TL0、TF1。TL0使用T0的状态控制C/T、GATE、TR0、INT0,而TH0被固定位一个8位定时器(不能作外部计数方式),并使用定时器/计数器1的状态控制位TR1、和TF1,同时占用定时器T1的中断源。此时,定时器/计数器1可设定为方式0、方式1和方式2,作为串行口的波特率发生器。
4.5 定时器/计数器的编程
(1)初始化
定时器/计数器的初始化编程包括以下几个部分。
根据要求给定时器/计数器方式寄存器(TMOD)送一个方式控制字,以设定定时器/计数器的工作方式。
根据需要给TH和TL寄存器送初值,以确定需要的定时时间或计数的初值。 根据需要给中断允许寄存器(IE)送中断控制字,以开放相应的中断和设定中断优先级。
6
河南理工大学万方科技学院
给TCON寄存器送命令字以启动或禁止定时/计数器的运行。
(2)定时器/计数器初值的计算。
计数器初值:
设计算器的模值位M,所需的计数值为C,计数初值设定为TC,则TC=M-C (M等于2的13次方,16次方,8次方)。
定时器初值:
设定时器的模值为M,需要的定时时间为T,定时器的初值设定为TC,则TC=M-T/t(M等于2的13次方,16次方,8次方)。
五.软件程序设计
交通灯控制器实例使用了89C51单片机的定时器/计数器,首先分定时器初始化,定时器中断服务程序两个部分介绍定时器计数器的软件编程,其次在画出程序流程图的基础上编写软件程序,并给出完整的交通灯控制器程序实例。
5.1定时器初始化
为了使定时器时间准确,避免因为定时器重装而引起的累计误差,应将定时器设置为初值自动装置的8位定时器/计数器,即定时器工作在工作方式2.在12MHz晶振条件下,8位定时器的最长定时时间是0.256ms,为了方便计算取定时时间为0.25ms,所以,定时0.5s需要定时器中断2000次。
下面计算定时器的初值。定时器初值TC=M-T/t=256-250/1=6,因此TH0=06H,TL0=06H.
定时器初始化程序如下,定时器T0设定为工作方式2,初始值为06H,自动重装入值为06H。
T0-INIT;
MOV TMOD,#00000010B ; 定时器T0工作方式2
MOV TL0,#06H ; 设定时器T0的初始值
MOV TH0,#06H ; 设定时器T0的自动重装值
MOV TCON,#00010000B ; 定时器T0的使能
SETB EA ;中断允许总控制位使能
SETB ET0 ;T0中断使能
RET
7
河南理工大学万方科技学院
5.2定时器中断服务程序
T0-INIT;
DJNZ TIME-COUNT0,T0-INT-EXIT
MOV TIME-COUNT0,#250
DJNZ TIME-COUNT1, T0-INT-EXIT
MOV TIME-COUNT1,#8
SETB SECOND-FLAG ;
T0-INT-EXIT;
RETI
每0.25ms定时器中断发生,程序跳转到中断服务程序T0-INT开始执行。中断服务程序每次将定时器中断计数变量减1,但定时器中断计数变量为0时,0.5s定时时间到,将位变量SECOND-FLAG置为1.定时器中断服务程序通过RETI指令返回,程序将跳转到进入中断前的断点继续执行。
5.3程序流程图
程序较为简单,可以直接进行程序的编写,但本实例的程序流程比较复杂,在编写程序前,应当先画出程序流程图。程序流程图是描述程序运行流程的一种图表。它不仅描绘程序从头到尾的运行顺序,也描述程序运行过程中的所有可能 发生的状况。
8
河南理工大学万方科技学院
9
河南理工大学万方科技学院
六.电路图及仿真设计
6.1设计完成原理图如下
在电路连接完成后,将写好的程序放入单片机,运行。
6.2在初始状态南北绿灯,东西红灯,持续时间为25s
10
河南理工大学万方科技学院
6.3南北跳转到黄灯5s,东西仍为红灯
在南北转换为红灯的同时,东西灯转换到绿灯持续25s;东西转换为黄灯持续5s,南北红灯不变;如此循环,从而实现交通灯的作用。
七.总结
回顾起此次单片机课程设计,我仍感慨颇多,学到了很多的东西。同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。因此可以说单片机的设计是软件和硬件的结合,二者是密不可分的。
通过这次课程设计我发现单片机原理应用行很强,只有老师的讲解不行,只看也不中,只有自己动手去做才会发现自己确实有太多的不足,许多的原理,程序看似简单,真正去做才知道知识并没有自己想象的那样扎实。从而懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识
11
河南理工大学万方科技学院
与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。
在设计完成之际再次衷心感谢李泉溪老师的指导!
八.源程序
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
uchar n=0,temp=0;
uchar code segcode0[]={0x5b,0x06,0x3f,0x5b,0x06,0x3f,0x5b,0x06,0x3f};
uchar code segcode1[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f}; //uchar code segcode0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(x)
{ while(x--);
}
void timer0() interrupt 1
{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
n++;
temp=temp%61;
if(n==20)
{ temp++;
n=0;
}
if(temp<25) P1=0x21;
if((temp>=25)&&(temp<28)) P1=0x22;
12
河南理工大学万方科技学院
if((temp>=28)&&(temp<30)) P1=0x24; if((temp>=30)&&(temp<55)) P1=0x0c; if((temp>=55)&&(temp<58)) P1=0x14; if((temp>=58)&&(temp<60)) P1=0x24; }
main()
{ uint i=0;
//P1_0=0;
//P1_7=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
//while(1)
//{//i=temp;
// }
// TH1=256-125;
// TL1=256-125;
EA=1;
ET0=1;
// ET1=1;
TR0=1;
while(1)
{
P2_0=0;
P2_1=1;
P0=segcode0[temp/10];
delay(3000);
P2_0=1;
P2_1=0;
P0=segcode1[temp%10];
13
河南理工大学万方科技学院
delay(3000); P2_1=1;//TR1=1;
}
}
参考文献
【1】单片机的C语言应用程序设计
【2】51单片机应用开发案例精选
【3】51系列单片机设计实例
【4】单片机原理与接口技术
【5】单片机原理与应用 马忠梅 籍顺心 北京航空航天大学出版社2007 王为青 邱文勋 人民邮电出版社 2007 楼然苗 李广飞 北京航空航天大学出版社 2003 胡汉才 清华大学出版社 2006 丁元杰 机械工业出版社 2007
14
附录一:系统总程序
#include<reg52.h>
/****************初始变量设定*****************/
sbit p1_0=P1^0; //定义P0口的8位
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p1_3=P1^3;
sbit p1_4=P1^4;
sbit p1_5=P1^5;
sbit p0_0=P1^6;
bit flag=0; //定义显示状态控制位
int ns_time; //定义东西,南北红黄绿各自的时间初值分别为20,15,5秒
int ew_time;
int ns_time_red=20;
int ns_time_green=15;
int ns_time_yellow=5;
int ew_time_red=20;
int ew_time_green=15;
int ew_time_yellow=5;
char point=20; //定时的控制次数初值设定
int a=0; //南北,东西两方向切换状态标志初值设定
/**************延时子函数**************/
delay(int t) //延时子函数
{
while(t--);
}
/*************显示子函数***************/
display(int ew_time,int ns_time) //显示子函数
{
char table[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //共阳极数码显示0-9对应的字型码
char i,a[4];
a[2]=ns_time%10; //南北时间个位数赋值给a[2]
a[3]=ns_time/10; //南北时间十位数赋值给a[3]
a[0]=ew_time%10; //东西时间个位数赋值给a[0]
a[1]=ew_time/10; //东西时间个位数赋值给a[1]
SM1=0;SM0=0; //串行口工作方式0设定
for(i=3;i>=0;i--) //分别将4位数送到SBUF区域
{SBUF=table[a[i]];
while(!TI) ; //判断是否发送完一个数据
TI=0; //若发送完,0赋给TI
}
}
/*************主函数*************/
void main(void)
{
TMOD=0x01; //设置定时方式1
TH0=0x3c; //定时初值50MS
TL0=0xb0;
TR0=1; //T0溢出中断请求开启
EA=1; //总中断开启
ET0=1; //T0中断开启
EX0=1; //外部中断INT0开启
IT0=1; //设置开关下降沿有效
EX1=1; //外部中断INT0开启
IT1=1; //设置开关下降沿有效
ns_time=ns_time_green; //东西南北红黄绿灯时间赋值
ew_time=ew_time_red;
ew_time_red=ns_time_green+ns_time_yellow;
if(!a) //a=0,东西显示19开始倒计时,南北14开始倒计时
{
ns_time=ew_time_red;
ew_time=ns_time_green+ns_time_yellow;
}
while(!a) //a=0,进入循环
{
if(ew_time-5>0)
{
while(!flag);
display(ew_time,ew_time-5); //flag=1,显示东西19,南北14
P1=0xdd; //南北绿灯,东西红灯
flag=0;
}
if(ew_time<=5) //东西时间<=5时,南北黄灯闪烁,东西红灯
{
while(!flag);
flag=0;
display(ns_time,ns_time); //东西,南北均从5开始倒计时显示
P1=0xdf; //东西红灯,南北黄灯一亮一灭显示
/*p1_4=0;*/
delay(5000);
p1_0=~p1_0; //南北黄灯所在位,对应取反,实现亮灭变化
delay(5000);
}
if(ew_time==0) //如果东西时间为0,赋值a为1,以实现方向转变
a=1;
}
if(a) //a=1,南北显示19开始倒计时,东西14开始倒计时
{
ns_time=ew_time_red;
ew_time=ns_time_green+ns_time_yellow;
}
while(a) //a=1,进入循环
{
if(ns_time-5>0) //南北红灯,东西绿灯
{
while(!flag);
display(ns_time-5,ns_time); //flag=0,显示南北19,东西14
delay(5000); //延时子函数调用
P1=0xeb; //南北红扥个,东西绿灯显示
}
if(ns_time-5<=0) //南北时间<=5时南北红灯,东西黄灯闪烁
{
while(!flag); //flag=0南北显示19开始倒计时,东西14开始倒计时
flag=0;
display(ns_time,ns_time); //东西,南北均从5开始倒计时显示
P1=0xfb; //南北红灯,东西黄灯一亮一灭显示
p1_3=~p1_3; //东西黄灯P1.3位取反,以实现黄灯亮灭变化显示
delay(5000); //延时函数调用
}
if(ns_time==0) //如果南北时间为0赋值a为0
a=0;
}
}
/**************t0中断定时子函数*****************/
int t0int()interrupt 1 //t0中断(定时器0中断)子函数
{
TH0=0x3c; //定时50ms初值设定
TL0=0xb0;
point--; //20次T0定时次数控制
if(point==0) //如果20次到了,改变显示的东西南北方向的时间
{
flag=1;
point=20;
if(ns_time!=0)
ns_time--;
if(ew_time!=0)
ew_time--;
}
}
/***************int0中断紧急情况处理子函数***************/
void int0(void) interrupt 0 //int0中断子函数,当紧急情况(救护车等)发生时,对应INT0按键调用此函数
{ int i,j;
display(00,00); //显示器显示0000,不再进行倒计时
delay(5000);
for(i=0;i<10;i++) //利用flag实现东西南北方向红灯均显示亮,对应东西南北方向车流均停止,处理紧急情况
{
for(j=0;j<10;j++)
{delay(50000);
while(!flag)
{ P1=0xdb;
}
}
}
flag=0;
}
/***************int1中断流量处理子函数***************/
void int1(void) interrupt 2 //int1中断子函数,当紧急情况(救护车等)发生时,对应INT1按键调用此函数
{ int i,j;
display(00,00); //显示器显示0000,不再进行倒计时
for(i=0;i<10;i++)
{
for(j=0;j<10;j++) //利用flag实现主干道东西方向绿灯南北方向红灯
{
while(!flag)
{ P1=0xeb;
}
}
}
flag=0;
}
系统总硬件电路仿真图
系统硬件电路总图包括复位电路,时钟电路,按键紧急处理电路,LED显示电路,数码管显示电路模块,对应各自电路功能如前面硬件电路设计部分进行说明。
图 :东西方向数码管显示19,东西方向红灯亮;南北方向显示14, 南北方向绿灯亮
东西方向数码管从19,南北方向从14开始倒计时,东西方向红灯亮,禁止车辆通行,南北方向绿灯亮,车辆通行
图 :东西方向数码管显示4,东西方向红灯亮;南北方向显示4, 南北方向黄灯亮灭 当南北方向计数到5时,东西方向数码管从4,南北方向从4开始倒计时,东西方向红灯亮,禁止车辆通行,南北方向黄灯亮灭变化,处于状态变化等待状态
图 :东西方向数码管显示14,东西方向绿灯亮;南北方向显示19, 南北方向红灯亮
东西方向数码管从14,南北方向从19开始倒计时,东西方向绿灯亮,允许车辆通行,南北方向红灯亮,禁止车辆通行
图 :东西方向数码管显示4,东西方向黄灯亮灭变化;南北方向显示4, 南北方向红灯亮当南北方向计数到5时,东西方向数码管从4,南北方向从4开始倒计时,东西方向黄灯亮灭变化,处于等待转换的状态,南北方向红灯亮,禁止车辆通信
图 :东西方向数码管显示0,东西方向红灯亮;南北方向显示0, 南北方向红灯亮
当发生救护车到来等紧急情况发生时,对应仿真时按键INT0来模拟,对应东西南北方向
显示红等,使得两方向车禁止通行,处理紧急情况
图 :东西方向数码管显示0,东西方向绿灯亮;南北方向显示0, 南北方向红灯亮
假设东西方向为主干道,车流量特别多,南北方向为次干道,对应控制东西方向绿灯亮,南北方向红灯亮,从而南北方向车禁止通行,疏通交通,保证正常进行。
摘要31引言42总体设计方案521设计思路5211设计目的5212设计任务和内容6213方案比较设计与论证6214芯片简介922设…
摘要自从1858年英国人发明了原始的机械扳手交通灯之后随后的一百多年里交通灯改变了交通路况也在人们日常生活中占据了重要地位随着人们…
单片机应用综合实验报告题目:平面交叉口多时段多相位交通信号灯控制器设计学院:电子与控制工程学院专业:自动化(交通信息与控制)班级:…
测控技术与仪器专业课程设计报告姓名:学号:专业班级:20##级测控技术与仪器题目:基于单片机原理的交通信号灯设计攀枝花学院电气信息…
单片机原理及系统课程设计专业zzzzzzzzzzzzzzzz班级zzzzzzzzzzzzzz姓名zzzzzzzzzzzz学号zzz…
西安航空职业技术学院课程设计实训报告课程名称所属学院指导教师学生姓名学号专业1西安航空职业技术学院课程设计实训任务书课程名称任务与…
摘要31引言42总体设计方案521设计思路5211设计目的5212设计任务和内容6213方案比较设计与论证6214芯片简介922设…
单片机交通灯设计洛阳理工学院电气工程与其自动化系专业自动化班级自动化八班姓名01白彦芳02何一婷11靳亚磊指导老师姚惠林洛阳理工学…
摘要自从1858年英国人发明了原始的机械扳手交通灯之后随后的一百多年里交通灯改变了交通路况也在人们日常生活中占据了重要地位随着人们…
摘要31引言42总体设计方案521设计思路5211设计目的5212设计任务和内容6213方案比较设计与论证6214芯片简介922设…