通信与信息工程学院
/ 学年第 学期
软件设计 实验报告
模 块 名 称 AVR单片机软件设计(proteus)
专 业
学 生 班 级
学 生 学 号
学 生 姓 名
指 导 教 师
设计题目
基于LED数码管显示的交通灯控制
任务要求
基本要求:
1.用2个7段数码管或2片LCD液晶显示屏分别倒计时东西及南北方向的通行及等待时间。
2.用两组各3个发光二极管模拟两个方向的红、黄、绿交通灯的显示。
3.可任意调节通行时长。
4.要求对东西、南北直行方向的交通灯进行控制,南北方向互相配合,在通行方向的最后5秒这样处理:绿灯闪烁3秒后灭,最后2秒黄灯亮。禁行方向则直接由红灯变为绿灯。
发挥部分:
1.设计三车道十字路口信号灯(左转、直行、右转),右转灯常亮,直行和左转分时通行。
2.用定时器而不是普通的延时程序控制显示时间
实验设备及软件
CVAVR编程软件、PROTUES 仿真软件
同组人员学号及姓名
一人一组,无同组成员
参考文献
[1]刘文涛.单片机应用开发实例.北京:清华大学出版社,2005年9月:19~113
[2]周宝善.经典电子设计与实践DIY.北京:人民邮电出版社,2008年8月:7~8,61~92
[3] 宁武,唐晓宇,闫晓金.电子设计竞赛技能指导.北京:电子工业出版社,2006年:128~156
[4] 胡伟,季晓衡.单片机c程序设计及应用.北京:人民邮电出版社,2003年7月:67~135
[5] 童诗白,华成英.模拟电子技术基础.北京:高等教育出版社,2001年1月:501~550
[6] 张靖武, 周灵彬.单片机原理应用与PROTEUS仿真.北京:电子工业出版社,2008年:28~60
[7] 张超琦,钟明哲.单片机原理及实例.实践篇.上海:上海交通大学出版社,2007年:110~158
[8]潘超群.单片机控制技术在通信中的应用:MCS-51.北京:电子工业出版社,2008年:200~228
[9]陈涛.单片机原理及C51程序设计.北京:机械工业出版社,2008年:20~66
AVR单片机软件设计(proteus)报告
摘 要
本文介绍了交通灯系统的设计。软件部分是基于ATMEGA128单片机的CVAVR软件系统。本系统利用单片机的定时器产生秒信号,控制十字路口的红绿黄灯交替点亮和熄灭,并且用2位共阳数码管显示十字路口两个方向的剩余时间。本系统可以按照设定程序在PROTUES仿真软件中自行运行。可实现基本交通灯功能,系统实用性强、操作简单。
关键词:单片机最小系统 ATMEGA128 红绿灯控制 仿真
一、总体设计原理及思路
(一)整体思路
本系统的整体框图由ATMEGA128构成主控芯片,主要是实现各个功能模块之间功能交互。
本系统包括红黄绿LED灯显示模块,LED数码管显示模块。
LED数码管显示模块用来显示被点亮的指示灯还将点亮多久;LED发光二极管模块用于指示该方向的3种状态:通行(绿灯亮)、暂缓通行(黄灯亮)和禁止通行(红灯亮)。
系统结构框图如图所示:
(图) 系统结构框图
红绿灯控制器的总体的设计如下图所示:
(图) 红绿灯控制器总体设计图
从上图中可以看出整个设计图。由CVAVR单片机最小系统模块来控制红绿黄发光二极管组合模块与LED数码管动态显示模块的联合动态显示,可通过代码的编写任意改变通行时间的长短和红绿黄三种灯的交替。
(二)整体设计流程图
二、各模块设计思路及原理图
n 单片机最小系统
ATMEGA128是ATMEL公司的8位系列单片机的最高配置的一款单片机,稳定性极高,应用极其广泛。它是高性能、低功耗的 AVR 8 位微处理器,具有先进的 RISC 结构 。它工作于16 MHz 时性能高达16 MIPS,具有只需两个时钟周期的硬件乘法器。它有128K 字节的系统内可编程Flash,4K字节的EEPROM,4K 字节的内部SRAM,多达64K 字节的优化的外部存储器空间。
它有两个具有独立的预分频器和比较器功能的8 位定时器/ 计数器,两个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器,具有独立预分频器的实时时钟计数器,两路8 位PWM,6路分辨率可编程(1 到16 位)的PWM,输出比较调制器,8路10 位ADC,2 个具有可编程增益(1x,10x, 或200x)的差分通道。它还具有6种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及扩展的Standby 模式。
单片机最小系统如下图所示:
(图) 单片机最小系统图
n LED数码管显示电路模块
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
本系统的数码管采用的是两位共阳数码管。
数码管如下图所示:
(图) LED数码管显示模块图
n LED灯显示模块
LED灯采用的是共阳接法,即所有的LED管阳级通过一个限流电阻上拉到5V电源,所有的阴级接到单片机的相应引脚。只要该I/O口置低,该灯就能点亮。 本系统出于节省资源,左转灯只用了红、绿两色,直行灯用了红、绿、黄三色,而右转灯由于要常绿,因此只用了一个绿灯。下图只给出了东西南北方向重其中任意的一个。
LED灯显示模块如下图所示:
(图) LED灯显示模块图
三、软件设计
(一)各模块设计思路及流程图
n 主程序模块
主要完成定时器T0的设置,绿、黄灯的初值设定以及各子程序的调用。
主程序的流程图如下图所示:
(图)主程序的流程图
n LED数码管显示模块
LED数码管显示模块包括南北方向LED显示、东西方向LED显示。
LED数码管显示模块的程序流程图如下图所示:
(图) LED显示模块程序流程图
n LED灯显示模块
LED 灯的显示及执行流程主要是对I/O的高低电平的控制。
LED显示模块的程序流程图如下图所示:
(图) LED显示模块程序流程图
n 定时器0中断模块
定时器0主要通过计数产生1秒的定时时间,使LED数码管按照每秒减1进行倒计时。
定时器0中断模块的程序流程图如下图所示:
(图) 定时器0中断模块程序流程图
(二)关键代码说明
Step1.以下是将计数数值转换成LED 能显示的两个数字的程序代码。将一个两位十进制数通过number0 = a/10;number1 = a%10; 转换成两个数字并显示
void led_play(unsigned char a)
{
number0 = a/10;
number1 = a%10;
PORTD = 0x00;
PORTD = wei[0];
PORTC = table[number0];
delay_ms(5);
PORTD = 0x00;
PORTD = wei[1];
PORTC = table[number1];
delay_ms(5);
}
Step2.以下是计数器0的中断服务程序。由于初始化的参数设置,使程序1ms进入一次中断函数,等到进入第1000次时代表1s 计时时间到。1s到了就讲time_counter清零,并将time_1s_os置1,便于主函数每1s 执行一次显示函数。
interrupt [TIM0_COMP] voidtimer0_comp_isr(void)
{
if(++time_counter==1000)
{
time_counter = 0;
time_1s_ok = 1;
}
}
Step3.以下是主函数里的while(1)函数。首先判断是否到达了1s(即检验time_1s_ok是否为1,若为1,则到达了1s)。然后将time_1s_ok 清零,将计数值num 自减1,并将num 的值送给LED 数码管显示。接着判断mode 为1 还是0。如果为0,则是南北方向通行,否则则是东西方向通行。我在函数中初始化计数初值num为30。假设mode 为0,那么如果num<=30&&num>21,那么使南北方向的左转方向通行,即使南北方向的左转灯为绿灯;同时南北方向的直行方向为红灯;而右转灯无论南北还是东西方向一直都是通行的,即为绿灯。如果num<=21&&num>6,那么南北方向的直行方向为绿灯,左转禁止通行了。如果num<=6&num>3,南北方向的绿灯闪烁三秒。如果num<=3&&num>1,则南北方向的直行方向为黄灯。在mode = 0的这30s 内,东西方向的左转和直行方向都是禁止的。mode=1时,则南北和东西方向的情况完全相反,这里就不赘述了。
while (1)
{
led_play(num);
if(time_1s_ok)
{
time_1s_ok = 0;
if(!mode)
{
PORTA=0x2d; //使东西方向的左转和直行灯都是红灯
if(num<=30&&num>21)
PORTB=0x1d;
if(num<=21&&num>6)
PORTB=0x2b;
if(num<=6&num>3) //南北方向绿灯闪烁
{
PORTB=0x2f;
for(i=0;i<20;i++)
{
led_play(num);
}
PORTB=0x2b;
}
if(num<=3&&num>1)
PORTB=0x2e;
if(num<=1)
{
mode=~mode;
num=31;
}
}
if(mode)
{
PORTB=0x2d;
if(num<=30&&num>21)
PORTA=0x1d;
if(num<=21&&num>6)
PORTA=0x2b;
if(num<=6&num>3)
{
PORTA=0x2f;
for(i=0;i<20;i++)
{
led_play(num);
}
PORTA=0x2b;
}
if(num<=3&&num>1)
PORTA=0x2e;
if(num<=1)
{
mode=~mode;
num=31;
}
}
num--;
}
}
四、系统测试
在PROTUES软件中画好了仿真图后,将CVAVR中写好的代码放入ATMEGA16芯片中,然后启动。情况如下:
mode=0的30秒内:
21<num<=30时,南北方向的左转、直行、右转分别为绿灯、红灯、绿灯;东西方向的左转、直行、右转分别为红灯、红灯、绿灯。
6<num<=21时,南北方向的左转、直行、右转分别为红灯、绿灯、绿灯;东西方向的左转、直行、右转分别为红灯、红灯、绿灯。
3<num<=6时,南北方向的直行方向绿灯有闪烁。
1<num<=3时,南北方向的直行方向黄灯亮。
mode=1的30秒内:
东西方向与南北方向与上述现象正好相反。
系统仿真出来的结果和实验的基础要求及提高要求大致上符合,较好的完成了预期期望。
PS:仿真一开始led灯的颜色较淡,之后将串接的限流电阻阻值改小后就解决了这个问题。
五、实验心得
首先,从此次实验的完成成果——基于LED数码管显示的交通灯控制的角度来总结,本次单片机课程设计的红绿灯控制器结构简单,操作方便,对优化城市交通具有一定的意义。本设计将各任务进行细分包装,使各任务保持相对独立;能有效改善程序结构,便于模块化处理,使程序的可读性、可维护性和可移植性都得到进一步的提高。同时由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大而且可以随时的更新系统,进行不同状态的组合。总而言之,本次实验我努力完成了课程要求的基本部分和发挥部分,探索的内容丰富、学习内容非常充实。
其次,从我个人的收获角度来说,在我学习AVR单片机之前我学过51单片机,51单片机用起来简单,价钱也便宜,用于一些比较简单的控制还算可以,开发平台相对单一,但是单片机应用系统开发时,首先遇到的问题就是存储器的扩展。因为51单片机内部的存储器容量一般都比较小,因此,从单片机外部配置外部存储器,包括程序存储器和数据存储器,就成了应用系统的重要工作之一。同时扩展的同时又占用了I/O口,当外部设备较多时,原有的几个内部I/O接口就明显不够使用。所以,通过此次对AVR的学习,让我掌握了一种新的、功能更强大的单片机,对我以后的实际应用很有帮助。不仅如此,在这几个礼拜的学习中,不断的摸索激发了我对AVR的兴趣,同时也锻炼我的耐心和分析能力,解决一个个困难的过程我认为是非常宝贵的,相信有了这次实验的经历,会对我今后各门学科的学习深有帮助,我觉得受益匪浅、收获良多。
|