单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
单片机课程设计
第一章单片机简介
AT89S51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的AT89S51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
1.1单片机的构成
图1-1单片机的结构图
1、CPU
89S51内部CPU是一个字长为8位的中央处理单元(centerprocessingunit)它对数据的处理是按资字节为单位的。
CPU包括三部分:
运算器、控制器和专用寄存器。
2、存储器
片内程序存储器
程序存储空间ROM
片外程序存储器
片内数据存储器
数据存储空间RAM
片外数据存储器
3、I/O端口
I/O端口,也称为I/O接口或I/O通路
功能:
是AT89S51与外部实现控制和交换的通道,分为并行端口和串行端口。
(1)并行I/O端口
写端口:
即写到端口,就是把CPU中的A或其它寄存器中的数据传送到端口锁存器中,然后由端口自动输出到引脚线上。
读端口:
即读出端口,就是把端口锁存器中的数据输送到累加器A中。
读引脚:
即读出引脚,就是把引脚上的外部数据输送到内部。
读引脚时一定要先关断端口,即先将端口锁存器置位,这样锁存器的输出使驱动器T3截止,引脚上的信号就可以通过三态缓冲器输入到内部总线上。
故读引脚时,必须同时有两条指令:
ORLP1,#0FFH、MOVA,P1
(2)串行I/O端口
89S51是具有一个全双工可编程串行I/O端口。
故可以由TXD串行发出,又可以由RXD串行接收。
它们都利用了P3口的第二功能:
RXD(P3.0),TXD(P3.1)。
4、定时/计数器:
80C51中有2个16位的定时/计数器T0,T1,它们有定时和计数两种模式。
具体内容在以后章节中专门讨论。
5、中断系统
80C51可以处理5个中断源发出的中断请求,其中2个外部中断请求INT0,INT1,2个内部定时/计数器中断请求T0,T1,一个内部串行口中断请求。
具体内容在以后章节中专门讨论。
1.2单片机的特点
(1)高集成度,体积小,高可靠性
单片机将各功能部件集成在一块晶体芯片上,集成度很高,体积自然也是最小的。
芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用的CPU。
单片机程序指令,常数及表格等固化在ROM中不易破坏,许多信号通道均在一个芯片内,故可靠性高。
(2)控制功能强
为了满足对对象的控制要求,单片机的指令系统均有极丰富的条件:
分支转移能力,I/O口的逻辑操作及位处理能力,非常适用于专门的控制功能。
(3)低电压,低功耗,便于生产便携式产品
为了满足广泛使用于便携式系统,许多单片机内的工作电压仅为1.8V~3.6V,而工作电流仅为数百微安。
(4)易扩展
片内具有计算机正常运行所必需的部件。
芯片外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易构成各种规模的计算机应用系统。
(5)优异的性能价格比
单片机的性能极高。
为了提高速度和运行效率,单片机已开始使用RISC流水线和DSP等技术。
单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。
由于单片机的广泛使用,因而销量极大,各大公司的商业竞争更使其价格十分低廉,其性能价格比极高。
1.3单片机的工作原理
单片机由运算器、控制器、存储器、输入输出设备构成。
单片机自动完成赋予它的任务的过程,也就是单片机执行程序的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种操作用的命令的形式写下来,这是在设计人员赋予它的指令系统所决定的,一条指令对应着一种基本操作;单片机所能执行的全部指令,就是该单片机的指令系统,不同种类的单片机,其指令系统亦不同。
为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件——存储器中。
存储器由许多存储单元(最小的存储单位)组成,就像大楼房有许多房间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一一个房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。
程序通常是顺序执行的,所以程序中的指令也是一条条顺序存放的,单片机在执行程序时要能把这些指令一条条取出并加以执行,必须有一个部件能追踪指令所在的地址,这一部件就是程序计数器PC(包含在CPU中),在开始执行程序时,给PC赋以程序中第一条指令所在的地址,然后取得每一条要执行的命令,PC在中的内容就会自动增加,增加量由本条指令长度决定,可能是1、2或3,以指向下一条指令的起始地址,保证指令顺序执行。
第二章交通灯控制系统设计
2.1设计内容
十字路口交通灯控制系统的设计
利用单片机的定时器产生秒信号,控制十字路口的红绿黄灯交替点亮和熄灭,并且用4只LED数码管显示十字路口两个方向的剩余时间。
要求系统的工作符合一般交通灯控制要求。
2.2基本要求
课程设计的基本要求:
单片机课程设计的主要内容包括:
理论设计撰写设计报告等。
其中理论设计又包括选择总体方案,硬件系统设计、软件系统设计;硬件设计包括单元电路,选择元器件及计算参数等;软件设计包括模块化层次结构图,程序流程图。
程序设计是课程设计的关键环节。
课程设计的最后要求是写出设计总结报告,把理论设计内容进行全面的总结,把实践内容上升到理论高度。
2.3设计要求
往南和往北的信号一致,即红灯(绿灯或黄灯)同时亮或同时熄灭。
用两个数码管来显示被点亮的指示灯还将点亮多久。
往东和往西方向的信号一致,其工作方式与南北方向一样,也采用两个数码管来倒计时。
当南北方向为绿灯和黄灯时,东西向的红灯点亮禁止通行;而东西方向为绿灯和黄灯时,南北向的红灯点亮禁止通行。
表2.2交通信号灯工作模式
南北向
绿灯亮40秒
黄灯亮5秒
红灯亮45秒
东西向
红灯亮45秒
绿灯亮40秒
黄灯亮5秒
2.4设计要点
2.4.1硬件设计
1)单片机建议选用AT89S51,它与8051系列单片机全兼容,但其内部带有4KB的FLASHROM,设计时无需外接程序存储器,为设计和调试带来极大的方便。
2)LED显示系统:
南北向和东西向各采用2个数码管计时,对该方向的指示灯的点亮时间进行倒计时,最长计时范围为99秒。
设计时可利用单片机的P0口和P1口作为字段和片选信号输出,经驱动芯片后驱动数码管显示倒计时时间,数码管采用动态扫描方式显示。
3)键盘系统:
一个非程序按键:
系统复位键。
4)电源供电系统:
本系统采用220V电源供电,应设计相应的稳压电源电路。
但课程设计受时间限制,也可采用现成的5V直流稳压电源供电,这样可以节约设计时间、简化设计过程。
图2.3系统元器件组成方框图
2.4.2本系统的工作流程
1)接通电源时或系统复位后,系统按程序给定的时间工作,即南北向通行40秒,东西向通行40秒,黄灯亮5秒,工作模式如表1.1所示。
首先南北向通行,然后东西向通行,如此循环。
·显示程序模块:
完成12个发光二极管(实际上只需驱动6个)和4个LED数码管的显示驱动。
·键盘扫描程序模块:
判断是否有键按下,并求取键号。
2.5硬件设计
2.5.1系统的工作流程
图2.4交通信号灯工作程序流程图
2.5.2系统电气原理图
图2.5AT89S51单片机引脚
图2.6复位电路
图2.7晶振电路
图2.8交通信号灯电路
图2.9电源电路
图2.9.1数码管连接电路
图2.9.2系统硬件总体连接图
2.5.3元件清单
序号
名称
型号
数量
编号
1
单片机
AT89S51
1
A1
2
晶振
12MHz
1
Y1
3
电容
30PF
2
C1、C2
4
电解电容
10uF
1
C3
5
发光二极管(红)
2
L1、L4
6
发光二极管(黄)
2
L2、L5
7
发光二极管(绿)
2
L6、L7
8
电阻
10K/0.25W
7
R1、R2、R3、R4、R5、R6、R7
9
电阻
100Ω/0.25W
7
R8、R9、R10、R11、R12、R13、R14
10
排阻
510Ω(4脚)
2
J1、J2
11
按键开关
1
S1
12
共阳极数码管
4
DS1、DS2、DS3、DS4
2.6软件设计
2.6.1各模块功能及原理
(1)数码管显示:
程序进入主程序后在显示程序中一直循环,通过定时器中断改变ss1、gg1,ss2,gg2的值,使得数码管显示不同的数字。
显示程序利用动态扫描原理:
首先将共阳极编码送入P0口,同时打开P2口的第一个数码管关闭其他数码管,然后将下一个编码送入P0口,同时打开P2口的第二个数码管关闭其他数码管,以此类推。
让人的视觉产生误差,这样就看到了四位数码管同时显示并且不断变化。
(2)定时器中断:
本程序采用定时/计数器0,定时时间为50ms,让它50ms产生一次中断,进入中断后把(65536-50000)/256赋给高八位,把(65536-50000)%256赋给低八位,然后number加1,判断number的情况:
如果number等于800即从45s到5s就将0xf5赋给P1口(南北点亮黄灯,东西依然红灯)。
如果number等于900即过了45s,将0xde赋给P1口(南北亮红灯东西绿灯)。
如果number等于1700即过了85s,就将0xee赋给P1口(东西亮黄灯,南北红灯)。
如果number等于1800即过了90s,就将0xf3赋给P1口(点亮南北绿灯,东西红灯),同时将number、show_SN、show_EW重新赋值并且进入下一阶段定时中断。
2.6.2程序设计
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRED_1=P1^0;//南北红灯接P1.0
sbitYELLOW_1=P1^1;//南北黄灯接P1.1
sbitGREEN_1=P1^2;//南北绿灯接P1.2
sbitRED_2=P1^3;//东西红灯接P1.3
sbitYELLOW_2=P1^4;//东西黄灯接P1.4
sbitGERRN_2=P1^5;//东西绿灯接P1.5
ucharnumber,show_SN,show_EW;//定义循环次数变量,数码管显示变量
ucharss1,gg1,ss2,gg2;//定义数码管十位,个位变量
uchartab[]={0xc0,0xf9,0xa4;0xb0;0x99;
0x92;0x82;0xf8,0x80,0x90};//共阳极数码管段码表
voiddelay(uintt)//延时函数
{
uchari;
while(t--)
{
for(i=0;i<125;i++)
{;}
}
}
/********************************主函数*****************************/
voidmain()//主函数
{
TMOD=0x01;//定时器T0方式1
TH0=(65536-50000)/256;//向TH0写入初值的高8位
TL0=(65536-50000)%256;//向TL0写入初值的低8位
P1=0xf3;//南北绿灯亮,东西红灯亮
EA=1;//总中断允许
ET0=1;//定时器T0中断允许
TR0=1;//启动定时器
while
(1);//无限循环,等待中断
{
display(ss1,gg1,ss2,gg2);//数码管十位,个位选择子函数
}
}
/********************************子函数*****************************/
voiddisplay(uchara,ucharb,ucharc,uchard)
{
P0=tab[a];//南北十位
P2=0xfe;//数码管位选
delay
(2);//短暂延时
P0=tab[b];//南北个位
P2=0xfd;//数码管位选
delay
(2);//短暂延时
P0=tab[c];//东西十位
P2=0xfb;//数码管位选
delay
(2);//短暂延时
P0=tab[d];//东西个位
P2=0xf7;//数码管位选
delay
(2);//短暂延时
}
/******************************中断函数*****************************/
voidT0()interrupt1//中断函数
{
ucharnumber=0,show_SN=40,show_EW=45;//中断循环次数赋值,南北东西
数码管赋值
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
number++;//循环次数+1
if(number%20==0)//定时1S
{
show_SN--,show_EW--;//南北、东西数码管-1
ss1=show_SN/10;//南北数码管十位
gg1=show_SN%10;//南北数码管个位
ss2=show_EW/10;//东西数码管十位
gg2=show_EW%10;//东西数码管个位
}
if(number==800)//定时40S
{
P1=0xf5;//南北黄灯亮,东西红灯亮
show_SN=5;//东西数码管赋值5S
}
if(number==900)//定时5S
{
P1=0xde;//南北红灯亮,东西绿灯亮
show_SN=45,show_EW=40;//南北数码管赋45S,东西数码管
赋40S
}
if(number==1700)//定时40S
{
P1=0xee;//南北红灯亮,东西黄灯亮
show_EW=5;//东西数码管赋5S
}
if(number==1800)//定时5S
{
P1=0xf3;//南北绿灯亮,东西红灯亮
show_SN=40,show_EW=45;//南北数码管赋40S,东西数码管
赋45S
number=0;//重新赋循环次数初值
}
}
课程设计小结
在这期末最后两周中怀着激动且亢奋的情绪参加了我们张奔老师的单片机课程设计,从起初懵懵懂懂到最后的融会贯通;从起初的青涩生练到最后的稳重熟练。
都是我们亲爱的张老师带着我们一步步辛辛苦苦的走过来的,从硬件设计到而后的软件设计,中间遇到的困难像大山那样一座座,是张老师带着我们翻山越岭,让我们体会到“一览众山小”的那一天。
时间在编写,调试程序中一点点流逝,而我对单片机的认识和使用又有了进一步加深,他是这么的切合实际,能帮我们解决生活中很多的麻烦。
我们使用的是AT89C51,虽然市场上每种单片机种类各不相同,但是解决问题的思路是一样的,只要我们学会了如何用单片机解决问题,即使使用不同的单片机我们也只需要花很少的时间熟悉两个编程软件的不同就行了。
在机械生产当中更是起着弥足珍贵的作用。
没有哪次的程序编写能顺顺利利,要一步步地检查,调试,再检查,再调试。
但也正是这些不顺利才使得我们对单片机有更进一步的了解和掌握。
同学间会互相讨论如何解决问题,互相帮助,老师也会在第一时间内帮我们找出问题的所在。
在学习技能的同时还能促进友谊,实属难得。
在学习单片机AT89C51中,慢慢地开始学会了实际应用,慢慢地学会了在脑海中思考如何运用单片机解决生活中的实际问题。
这段时间的课程设计可谓是学校用心良苦,让学生们把理论用于实践,把知识变成经验。
如果可以我要给三江学院三十二个赞,给我们张奔老师六十四个大大的赞!
参考文献
1、《单片机原理与应用技术》余发山主编
2、《微型计算机控制技术》赖寿宏主编
3、《单片机原理及应用》丁元杰主编
4、《单片机中级教程》张迎春主编
5、《基于单片机的交通信号控制系统》欧伟民主编
6、《单片机原理及应用》张毅刚主编
7、《单片机器件应用手册》王毅主编
8、《AT89系列单片机原理与接口技术》王幸之主编