《单片机》课程设计.docx

上传人:b****4 文档编号:3695129 上传时间:2022-11-24 格式:DOCX 页数:24 大小:677.54KB
下载 相关 举报
《单片机》课程设计.docx_第1页
第1页 / 共24页
《单片机》课程设计.docx_第2页
第2页 / 共24页
《单片机》课程设计.docx_第3页
第3页 / 共24页
《单片机》课程设计.docx_第4页
第4页 / 共24页
《单片机》课程设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

《单片机》课程设计.docx

《《单片机》课程设计.docx》由会员分享,可在线阅读,更多相关《《单片机》课程设计.docx(24页珍藏版)》请在冰豆网上搜索。

《单片机》课程设计.docx

《单片机》课程设计

课程设计报告

 

课程名称:

单片机课程设计

系部:

专业班级:

学生姓名:

指导教师:

完成时间:

2012.3.5—2012.3.9

报告成绩:

评阅意见:

评阅教师日期

 

题目:

交通灯设计

一、设计任务与要求

1、设计任务:

十字路口红绿交通灯

利用单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。

用红、绿、黄发光二极管作信号灯。

如图上图所示。

设东西向为主干道,南北为支干道。

2、设计基本要求:

(1)车辆通行繁忙的十字交叉路口,设计一交通灯控制器,设东西方向通行时间为40秒,当剩余3秒时黄灯亮,南北方向通行时间为25秒,当剩余3秒时黄灯亮。

(2)东西、南北方向各用三个(绿、黄、红)LED表示,并用数码管显示东西、南北方向的剩余时间。

(3)可利用按键修改时间参数。

 

二、方案设计与论证

本次实训单片机交通灯控制要求用单片机编写程序,并且自制电路板,最后要能实现东西方向通行时间为40秒,当剩余时间为3秒时黄灯亮,南北方向通行时间为25秒,当剩余3秒时黄灯亮的基本功能。

东西方向通行,可用绿色的LED显示通行信号,同时南北方向须禁行,可用红色的LED显示禁行信号,并且用数码管显示禁行倒计时的数字显示,当倒计时为3秒时开始亮黄灯,作为警示信号,同时设计可以随时修改时间参数的按键。

方案一、STC89C52+点阵式LED显示

采用独立式的稳压电源。

显示采用点阵式LED显示。

这种方案实现复杂,需完成大量的软件工作,但同时其功能强大,可以显示各种英文字符,汉字,图形等。

方案二、STC89C52+七段共阳极数码管

电源供电可采用手机充电器提供的电源,不用的手机充电器可以改装成电源,其输出的电压稳定可靠,足以供给单片机及外围电路的正常工作,如果需要设计比较复杂的电路,或需多种电源,就需要其他电源电路的支持。

显示采用LED灯和数码管。

用89C52的P2口直接控制交通灯,此方案硬件实现简单,软件实现也比较容易,它极大能力的节省了89C52I/O口的使用,为系统功能扩展提供了必要的条件。

采用这样的设计成本较低,易实现,系统可靠性高。

综上所述:

方案二优势明显,采用方案二。

三、硬件电路设计

3.1硬件框图:

如图所示

3.2元件介绍

1、STC89C52芯片

(1)、功能特性

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。

使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

STC89C52具有以下标准功能:

8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

8位微控制器8K字节在系统可编程FlashSTC89C52。

STC89C52

主要功能特性:

与MCS-51单片机兼容

8K字节在系统可编程Flash存储器1000次插写周期

全静态操作:

0Hz-33Hz三级加密程序存储器

32个可编程I/O口线

三个16为位定时器、计数器八个中断源全双工UART串行通道、低功耗空闲和掉电模式

掉电后中断可唤醒

看门狗定时器

双数据指针

掉电标识符

(2)管脚说明

P0口:

P0口是一个8位漏极开路的双向I/O口。

作为输出口,每位能驱动8个TTL逻辑电平。

对P0端口写“1”时,引脚用作高阻抗输入。

当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。

在这种模式下,P0具有内部上拉电阻。

在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。

程序校验时,需要外部上拉电阻。

P1口:

P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。

对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。

此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。

在flash编程和校验时,P1口接收低8位地址字节。

引脚号第二功能 P1.0T2(定时器/计数器T2的外部计数输入),时钟输出 P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5MOSI(在线系统编程用) P1.6MISO(在线系统编程用) P1.7SCK(在线系统编程用)

P2口:

P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。

对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。

  在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。

在这种应用中,P2口使用很强的内部上拉发送1。

在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。

在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

P3口:

P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。

对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。

P3口亦作为STC89C52特殊功能(第二功能)使用,如下表所示。

在flash编程和校验时,P3口也接收一些控制信号。

端口引脚第二功能 P3.0RXD(串行输入口) P3.1TXD(串行输出口) P3.2INTO(外中断0) P3.3INT1(外中断1) P3.4TO(定时/计数器0) P3.5T1(定时/计数器1) P3.6WR(外部数据存储器写选通) P3.7RD(外部数据存储器读选通)  此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。

  

RST——复位输入。

当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。

  

ALE/PROG——当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。

一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。

要注意的是:

每当访问外部数据存储器时将跳过一个ALE脉冲。

  对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。

  如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。

该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。

此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。

 

PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当STC89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。

  EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。

需注意的是:

如果加密位LB1被编程,复位时内部会锁存EA端状态。

  如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。

  FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。

2、数码管

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管; 

按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

本次设计中使用的是七段共阳极数码管。

LED数码管驱动方式:

LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。

静态驱动也称直流驱动。

静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。

静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:

),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

LED数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

3.3单片机最小系统介绍

(1)单片机:

本次设计使用单片机芯片STC89C52,单片机最小系统电路图如下:

单片机最小系统

(2)晶振电路:

本次设计采用的是12MHz的晶振,两只电容在20pF~100pF之间取值,其取值在60pF~70pF时振荡器频率稳定性较高,按照一般经验,外接晶体时两个电容取值为30pF,本次设计选为30pF。

(3)复位电路:

本次设计复位电路采用的是上电复位方式。

上电复位时通过外部复位电路的电容充电来实现的,为了保证复位成功,只要RST引脚保持足够时间。

具体连接图见单片机最小系统。

(4)通行灯控制:

电路如下图所示,P2口接6个发光二极管和6个小电阻,当P2口的对应端子为低电平时,LED亮。

串接电阻是为了限流。

当P2口输出电压为5V,则流经LED的电流为0,不发亮。

(5)按键电路:

电路如下图所示,P3口接四个按键,DL-SS1控制复位电路,S1改变时间参数,S2可以倒计时。

3.4LED显示器件工作原理

LED显示器件是通过发光二极管显示字段的器件。

在单片机控制系统中常用的是由7段LED数码管,它的显示块中有8个发光二极管,7个发光二极管组成字符“8”,1个发光二极管构成小数点,因此有人称7段LED数码管为8段显示器。

LED数码管的管脚配置如下图所示:

 

3.5总设计电路

(1)电路原理图

 

(2)PCB电路板

(3)元件清单

 

4、软件设计

1、本设计使用keil软件完成该系统的软件设计.通过新建源文件、建立工程文件、编译和连接,最后生成所需单片机烧录的HEX文件。

程序流程图如下:

 

2、交通灯控制系统主程序

#include//声明头文件

#defineuintunsignedint

#defineucharunsignedchar

sbitred1=P2^0;//定义六个灯分别为P1.0~7

sbityellow1=P2^1;

sbitgreen1=P2^2;

sbitred2=P2^3;

sbityellow2=P2^4;

sbitgreen2=P2^5;

sbitkey1=P3^0;//模式选择键

sbitkey2=P3^1;//数值+

sbitkey3=P3^2;//数值-

sbitkey4=P3^3;//暂停开始键

ucharaa,qian,bai,shi,ge,bb,shu1,shu2;

uintnum,key1num,key4num;

//定义数组0~9

ucharcodetable[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90};

//延时函数z毫秒

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//初始化函数

voidinit()

{

TMOD=0x01;//设置定时器T0为工作方式1

TH0=(65536-50000)/256;//赋初值

TL0=(65536-50000)%256;

EA=1;//开总中断

ET0=1;

TR0=1;//开定时器

num=40;//数码管初始显示40

qian=num/10;

bai=num%10;

red1=0;//起始状态为南北绿灯,东西红灯

yellow1=0;

green2=0;

yellow2=0;

bb=1;

key1num=0;

//key4num=0;

shu1=40;//南北通行时间初始为40s,东西通行时间初始为25s

shu2=25;

}

//数码管显示函数

voiddisplay(ucharqian,ucharbai)

{

P0=table[qian];

delay

(1);

 

P1=table[bai];

delay

(1);

}

//键盘扫描函数

voidkeyscan()

{

if(key1==0)

{

delay(10);//消抖

if(key1==0)

{

key1num++;

if(key1num==4)

{

key1num=1;

}

while(!

key1);

if(key1num==1)//按下第一次进入设置南北通行时间模式

{

TR0=0;

num=40;

qian=num/10;

bai=num%10;

display(qian,bai);

green1=1;

yellow1=0;

red1=0;

green2=0;

yellow2=0;

red2=1;

}

if(key1num==2)//按下第二次进入设置东西通行时间模式

{

TR0=0;

num=25;

qian=num/10;

bai=num%10;

display(qian,bai);

//key1num=0;

green1=0;

yellow1=0;

red1=1;

green2=1;

yellow2=0;

red2=0;

}

}

}

if(key1num!

=0)//当key1键被按下

{

if(key2==0)

{

delay(10);

if(key2==0)//按下key2键调整南北通行时间

{

num--;

qian=num/10;

bai=num%10;

display(qian,bai);

shu1=num;//将设置后的时间赋给shu1

if(shu1==0)

{

shu1=40;

num=shu1;

qian=num/10;

bai=num%10;

display(qian,bai);

}

}

while(!

key2);

}

if(key3==0)

{

delay(10);

if(key3==0)//按下key3键设置东西通行时间

{

num--;

qian=num/10;

bai=num%10;

display(qian,bai);

shu2=num;//将设置后的值赋给shu2

if(shu2==0)

{

shu2=25;

num=shu2;

qian=num/10;

bai=num%10;

display(qian,bai);

}

}

while(!

key3);

}

}

/*if(key4==0)

{

delay(10);

if(key4==0)

{

key4num++;

while(!

key4);

if(key4num==1)

{

TR0=1;

}

if(key4num==2)

{

TR0=0;

key4num=0;

}

}

}*/

if(key1num==3)

{

TR0=1;

}

}

//主函数

voidmain()

{

init();

while

(1)

{

display(qian,bai);

keyscan();

}

}

//定时器中断函数

voidtimer0()interrupt1

{

TH0=(65536-50000)/256;//重赋初值

TL0=(65536-50000)%256;

aa++;

if(aa==20)//定时到达1S

{

aa=0;

num--;

qian=num/10;

bai=num%10;

display(qian,bai);

if(bb==1)

{

if(num==3)

{yellow1=1;

green1=0;

red1=0;

green2=0;

red2=0;

yellow2=1;

}

if(num==0)

{

green1=0;

red1=1;

yellow1=0;

yellow2=0;

green2=1;

red2=0;

num=shu2;

qian=num/10;

bai=num%10;

display(qian,bai);

bb++;

}

}

if(bb==2)

{

if(num==3)

{green1=0;

red1=0;

yellow2=1;

yellow1=1;

green2=0;

red2=0;

}

if(num==0)

{

num=shu1;

qian=num/10;

bai=num%10;

display(qian,bai);

green1=1;

red1=0;

yellow2=0;

yellow1=0;

red2=1;

green2=0;

bb=1;

}

}

}

}

 

五、仿真过程与仿真结果

(1)仿真过程:

系统仿真是通过对拥护程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。

程序后,查看程序是否有逻辑的错误。

进行仿真后,经过调试与修改,所制电路板与所编写程序均符合实训要求,能正常运行,并且实现东西方向40秒通行(绿灯亮)同时南北方向禁行(红灯亮),接着3秒钟黄灯闪烁后南北方向25秒通行(绿灯亮),同时东西方向禁行(红灯亮)的设计目标。

(2)仿真结果:

六、安装与调试

1、按电路原理图制板;

2、各元器件的焊接;

3、编写好的程序下载到芯片上;

4、接上电源,进行调试。

接通电源后电路板总体可以正常运作,开始时数码管显示不正常,红绿灯也没有正常运作,开始以为是电路虚焊或电路断掉,所以我用万用表检查了是否电路有问题,检查完后发现没问题,然后想到会不会是数码管坏了,然后换过数码管,接通电源查看后数码管正常工作,原来真的是数码管坏了。

然后在检测红绿灯的问题,一一排除电路问题和元件是否损坏的问题后就是所编写的程序是否跟电路图对应的问题,通过修改编程最终把所有问题都解决了,红绿灯、数码管都能正常工作,调试完成。

七、结论与心得

这次单片机课程设计历时一个星期的时间,在这次设计过程里我们体验了从设计、画板、编程、焊板到调试的整个过程。

通过这次交通灯的课程设计,使我得到了用专业知识、专业技能分析和解决现实问题的能力。

使我在单片机的基本原理、单片机的应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈一大步。

综合课程设计让我以前学习的知识得到巩固和进一步的认识,对已有知识有了更深层次的理解和认识。

在此,由于自身能力的限制,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得到解决,还有交通灯是我们生活中非常常见的一种东西,对于我们学以致用的这种能力得到了很好的锻炼,能够为我们以后的工作学习打下基础。

在实验过程中,单片机作为核心控制元件,使得电路的可靠性比较高,功能也比较强大。

而且可以随时的更新系统,进行不同状态的切换,进行不同状态的组合,但是在设计和调试过程中,也发现一些问题,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1