DOS窗口模拟交通灯演示的设计.docx
- 文档编号:28411106
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:20
- 大小:142.48KB
DOS窗口模拟交通灯演示的设计.docx
《DOS窗口模拟交通灯演示的设计.docx》由会员分享,可在线阅读,更多相关《DOS窗口模拟交通灯演示的设计.docx(20页珍藏版)》请在冰豆网上搜索。
DOS窗口模拟交通灯演示的设计
《嵌入式系统二》课程设计报告
DOS窗口模拟交通灯演示的设计
设计日期:
2011年07月04日至2011年07月08日
摘要
本次课程设计的目的在于利用ARM系统进行简单的系统设计。
而在这次实训中,我利用ARM系统设计了模拟交通灯的演示,其基本步骤如下:
(1)总体方案的设计与选择:
根据设计任务要求和给定的条件,分析所要设计电路应完成的功能,并将总体功能分解成若干个单元功能,分清主次和相互的关系,形成若干单元功能然后再组成总体方案。
(2)程序的编写:
编写满足设计要求的程序并写入LPC2138芯片中,通过系统实现对电路的控制,从而达到设计的要求。
(3)程序的调试:
在课程设计的实践过程中程序的调试占有非常重要的地位,它是最基础的阶段,也是将理论转换为实际的一个关键过程,因此调试时要谨慎小心的进行,从各方面考虑不能产生结果的原因。
关键词:
ARM9、LPC2138、UART串口发送、定时器、GPIO、RTC中断、DOS窗口显示。
1、设计目的:
3
2、设计任务与要求4
2.1设计要求:
4
2.2设计仪器:
4
2.3小车在DOS窗口可以模拟遇到的各种情况例如:
4
3、课程设计原理:
5
3.1UART0查询:
5
3.2蜂鸣器连接图如图3-2所示:
6
3.3定时器:
7
3.4RTC中断:
8
4、程序设计流程图10
5、心得体会:
11
6、参考文献:
12
附录:
程序源代码13
1、设计目的:
随着电子技术的飞速发展,基于嵌入式的控制系统已广泛应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。
同时楼宇智能化的发展与成熟,也为基于嵌入式的控制系统的普及与应用奠定了坚实的基础。
而本次实训的目的在于利用ARM系统进行简单的系统设计。
而在这次实训中,我利用ARM系统设计模拟交通灯演示,其基本步骤如下:
(1)能够了解ARM各个部分的基本功能,将各个部分合理的组合在一起,实现一些实际功能。
(2)将ARM第四章中任意三个或三个以上的功能融合在一起,如UART串口,定时器,中断等等,形成具有特定功能的实际效果,并能够灵活处理实训过程中的各种问题。
(3)在学习了《嵌入式系统二》课程后,加深对理论知识的理解。
(4)学习理论知识在实际中的运用,培养动手能力和解决实际问题的能力。
(5)通过实训,进一步熟悉和掌握ARM的结构及工作原理。
(6)通过完成一个程序开发的完整过程,了解开发一个ARM应用
2、设计任务与要求
2.1设计要求:
(1)在DOS窗口模拟实现交通灯的基本功能。
(2)模拟两辆小车(东西、南北各一辆)遇到红灯停止,绿灯通行。
(3)小车遇到红灯时,蜂鸣器会发出声音提醒车主。
(4)在DOS窗口模拟实现数码管10s倒计时的功能。
(5)每10s红灯和绿灯转换,倒计时最后5s黄灯闪烁。
方案论证:
在DOS窗口模拟交通灯演示比较直观、逼真、明了。
而且,功能更加齐全,红灯、黄灯、绿灯也可以用颜色直接表示。
2.2设计仪器:
硬件:
ARM实验开发板一套
计算机一台(内装有ADS1.2及EasyJTAG仿真器)
软件:
Windowsxp系统,ADS1.2集成开发环境
2.3小车在DOS窗口可以模拟遇到的各种情况例如:
(1)东西方向的红色小车遇到红灯停止,蜂鸣器会发出声音提醒车主
(2)东西方向的红色小车遇到绿灯继续通行
(3)南北方向的蓝色小车遇到红灯停止,蜂鸣器会发出声音提醒车主
(4)南北方向的蓝色小车遇到绿灯继续通行
(5)在特殊情况下东西方向的红色小车遇到红灯时,转向南北方向行驶
3、课程设计原理:
3.1UART0查询:
(1)特性:
●16字节收发FIFO;
●寄存器位置符合16C550工业标准;
●接收器FIFO触发点可为1,4,8和14字节;
●内置波特率发生器;
●LPC2131包含使能实现软件流控制的机制。
(2)结构:
UART接收器模块UxRx监视串行输入线RxD的有效输入。
UARTRx移位寄存器(UxRSR)通过RxD接收有效的字符。
当UxRSR接收到一个有效字符时,它将该字符传送到UARTRx缓冲寄存器FIFO中,等待CPU或主机通过主机接口进行访问。
UART发送器模块UxTx接收CPU或主机写入的数据并将数据缓存到UARTTx保持寄存器FIF(UxTHR)中。
UARTTx移位寄存器(UxTSR)读取UxTHR中的数据并将数据通过串行输出管脚TxD发送。
UART波特率发生器模块UxBRG产生UARTTx模块所使用的定时。
UxBRG模块时钟源为VPB时钟(pclk)。
主时钟与UxDLL和UxDLM寄存器所定义的除数相除得到UARTTx模块使用的时钟。
该时钟为16倍过采样时钟NBAUDOUT。
中断接口包含寄存器UxIER和UxIIR。
中断接口接收几个由UxTx和UxRx发出的单时钟宽度的使能信号。
●UxTx和UxRx的状态信息保存在UxLSR中。
●UxTx和UxRx的控制信息保存在UxLCR中。
VPB接口提供CPU或主机与UART之间的通信连接。
UART的结构如图3-1所示:
图3-1UART方框图
3.2蜂鸣器连接图如图3-2所示:
图3-2蜂鸣器连接图
高电平时蜂鸣器停止鸣叫,低电平时开始鸣叫。
3.3定时器:
(1)概述:
LPC2131具有2个32位可编程定时/计数器,均具有4路捕获、4比较路匹配并输出电路。
定时器对外设时钟(pclk)周期进行计数,可选择产生中断或根据4个匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低电平、翻转或者无动作)。
它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。
可用于对内部事件进行计数的间隔定时器,或者通过捕获输入实现脉宽调制,亦可作为自由运行的定时器。
定时器0和定时器1除了外设基地址以外,其它都相同。
(2)定时器特性:
●带可编程32位预分频器的32位定时器/计数器;
●具有多达4路32位的捕获通道-当输入信号跳变时可取得定时器的瞬时值,也可选择使捕获事件产生中断;
●4个32位匹配寄存器:
Ø匹配时定时器继续工作,可选择产生中断;
Ø匹配时停止定时器,可选择产生中断;
Ø匹配时复位定时器,可选择产生中断。
●多达4个对应于匹配寄存器的外部输出,具有下列特性:
Ø匹配时设置为低电平;
Ø匹配时设置为高电平;
Ø匹配时翻转;
Ø匹配时无动作。
(3)结构:
定时器0和定时器1的方框图,如图3-3所示:
(注:
捕获寄存器3不能用于定时器0)
图3-3定时器原理图
(4)定时器基本操作方法:
●计算定时器的时钟频率,设置PR寄存器进行分频操作;
●设置比较匹配通道的初值及其工作模式,若是使用捕获功能,则设置捕获方式;
●若使用定时器的相关中断,则设VIC,使能中断;
●设置TCR,启动定时器。
如前所述,定时计数器时钟频率计算如下:
其中,N为PR的值。
3.4RTC中断:
中断的产生由中断位置寄存器(ILR)、计数器递增中断寄存器(CIIR)、报警寄存器和报警屏蔽寄存器(AMR)控制,只有转换到中断状态才能产生中断。
ILR单独使能CIIR和AMR中断(ILR寄存器实际是一个中断标志寄存器)。
CIIR中的每个位都对应一个时间计数器,如果CIIR使能用于一个特定的计数器,那么该计数器的值每增加一次就产生一个中断,如图3-4所示。
图3-4增量中断原理图
报警寄存器允许用户设定产生中断的日期或时间。
AMR提供一个屏蔽报警比较的机制,如果所有非屏蔽报警寄存器与它们对应的时间计数器的值相匹配时,则会产生中断,如图3-5所示。
图3-5报警中断原理图
4、程序设计流程图
本程序是结合了UART0串口、定时器查询、GPIO蜂鸣器和RTC中断,自编程序设计的一个在DOS窗口模拟拥有东西、南北两辆小车通行的十字路口交通灯演示,程序流程图如图4-1所示。
图4-1程序流程图
5、心得体会:
通过本次课程设计,让我对ARM9有了更加全面的了解,所有预期的功能都实现了。
最主要是有老师的耐心指导,还有自己的动脑思考,动手实践,以及一起的合作,才做好了本次课程设计。
通过本次课程设计,使我对于软件制作的流程有了更加深刻的认识和可以熟练使用相关软件的操作。
在实践中,我也认识到一个小小的失误都会整个过程变得缓慢。
在这次课程设计中,由于参考程序少,主要是自己动脑想,其中经历了很多的思维困扰,不过还是成功了。
课程设计不仅仅是对于知识的考察,更是考察我们的细心与耐心。
通过写论文,我也学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。
并认识到如何把握重点、攻克难关,学到用到、活学活用。
在设计过程中由于时间仓促有很多地方难免存在不足之处总之在实训中,要多动脑筋,多动手,将理论与实际相结合。
以前学习时,只会一个一个模块分开来看,不会把不同模块进行有效的结合。
所以在刚开始编写程序的时候,不知道怎么进行模块之间的连接。
然后通过不断的尝试和同学的帮忙,终于实现了不同模块之间的连接,所以此次课程设计真的受益匪浅。
6、参考文献:
[1]刘峥嵘,张智超,等.《嵌入式Linux应用开发详解》北京:
机械工业出版社,2004.
[2]陈渝.《嵌入式系统原理及应用开发》北京:
机械工业出版社,2008.P1-7.
[3]魏永明.《Linux设备驱动程序》[M].北京:
中国电力出版社2006.
[4]李式巨.《嵌入式Linux设备驱动程序开发》计算机程序与设计2006.1.
[5]AndrewN.Sloss等著,沈建华译.《ARM嵌入式系统开发-软件设计与优化》北京:
北京航空版社,2004.
[6]孙天泽,袁文菊,张海峰.《嵌入式设计及Linux驱动开发指南》北京:
电子工业出版社,2004:
138-261.
附录:
程序源代码
#include"config.h"
uint8k,j;
uint8a=0;
uint32m=79,w=1;
uint32n,p;
uint8c[9]={0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x10,0x40};
charb[]={'9','8','7','6','5','4','3','2','1','0'};
voidDelayNS(uint32dly)//延时程序
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
//定义串口模式设置的数据结构
typedefstructUartMode
{
uint8datab;//字长度5/6/7/8
uint8stopb;//停止位1/2
uint8parity;//奇偶校验0-无校验,1-奇校验,2-偶校验
}UARTMODE;
/******************************************************************************************函数名称:
UART0_Init()
**函数功能:
初始化串口:
设置工作模式和波特率。
**入口参数:
baud波特率
**set模式设置(UARTMODE数据结构)
**出口参数:
返回1表示成功,0表示参数出错。
****************************************************************************************/
uint8UART0_Init(uint32baud,UARTMODEset)
{
uint32bak;
//参数过滤
if((0==baud)||(baud>115200))return(0);
if((set.datab<5)||(set.datab>8))return(0);
if((0==set.stopb)||(set.stopb>2))return(0);
if(set.parity>4)return(0);
//设置串口波特率
U0LCR=0x80;//DLAB=1
bak=(Fpclk>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xff;
//设置串口模式
bak=set.datab-5;
if(2==set.stopb)bak|=0x04;
if(0!
=set.parity)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4;
U0LCR=bak;
return(0);
}
/******************************************************************************************函数名称:
SendByte()
**函数功能:
向串口UART0发送字节数据,并等待发送完毕。
**入口参数:
data要发送的数据
**出口参数:
无
****************************************************************************************/
voidSendByte(uint8data)
{
U0THR=data;
while((U0LSR&0X20)==0);//等待数据发送
}
/******************************************************************************************函数名称:
PC_DispChar()
**函数功能:
向PC机发送显示字符。
**入口参数:
no显示位置
**char显示的字符,不能为ff
**出口参数:
无
****************************************************************************************/
voidPC_DispChar(uint8x,uint8y,uint8color)
{
SendByte(0xff);
SendByte(x);
SendByte(y);
SendByte('');
SendByte(color);
}
voidPC_DispChar1(uint8x,uint8y,uint8data)
{
SendByte(0xff);
SendByte(x);
SendByte(y);
SendByte(data);
SendByte(0x1c);
}voidPC_DispChar2(uint8x,uint8y,uint8data,uint8color)
{
SendByte(0xff);
SendByte(x);
SendByte(y);
SendByte(data);
SendByte(color);
}
/******************************************************************************************函数名称:
SendTimeRtc()
**函数功能:
读取RTC的时间值,并通过串口送到上位机显示。
**入口参数:
无
**出口参数:
无
****************************************************************************************/
voidSend_cross()//十字路口的定义
{
uint8i;
for(i=0;i<10;i++)
{
PC_DispChar(9,i,0x30);
PC_DispChar(8,i,0x30);
}
for(i=0;i<10;i++)
{
PC_DispChar(20,i,0x30);
PC_DispChar(21,i,0x30);
}
for(i=15;i<25;i++)
{
PC_DispChar(9,i,0x30);
PC_DispChar(8,i,0x30);
}
for(i=15;i<25;i++)
{
PC_DispChar(20,i,0x30);
PC_DispChar(21,i,0x30);
}
for(i=0;i<10;i++)
{
PC_DispChar(i,9,0x30);
}
for(i=20;i<80;i++)
{
PC_DispChar(i,9,0x30);
}
for(i=0;i<10;i++)
{
PC_DispChar(i,15,0x30);
}
for(i=20;i<80;i++)
{
PC_DispChar(i,15,0x30);
}
}
voidSend_deng()//交通灯的定义,红0x40、紫0x50(代替黄灯)、绿0x20
{
if(k==0)//东西红灯,南北绿灯
{
c[0]=0x40;
c[2]=0x30;
c[3]=0x30;
c[5]=0x20;
}
if(k==1)//东西绿灯,南北红灯
{
c[3]=0x40;
c[5]=0x30;
c[0]=0x30;
c[2]=0x20;
if((k==0)&&(j==0))//东西红灯,南北绿灯,黄灯不亮
{
c[1]=0x30;
c[4]=0x30;
}
if((k==0)&&(j==1))//东西红灯,南北绿灯,东西黄灯闪烁
{
c[1]=0xd0;
c[4]=0x30;
}
if((k==1)&&(j==0))//东西绿灯,南北红灯,黄灯不亮
{
c[1]=0x30;
c[4]=0x30;
}
if((k==1)&&(j==1))//东西绿灯,南北红灯,南北黄灯闪烁
{
c[4]=0xd0;
c[1]=0x30;
}
//交通灯颜色的定义,红0x40、紫0x50(代替黄灯)、绿0x20
PC_DispChar(6,11,c[0]);
PC_DispChar2(7,11,'Y',c[1]);
PC_DispChar(8,11,c[2]);
PC_DispChar(21,13,c[2]);
PC_DispChar2(22,13,'Y',c[1]);
PC_DispChar(23,13,c[0]);
PC_DispChar(16,6,c[3]);
PC_DispChar(17,6,c[3]);
PC_DispChar2(16,7,'Y',c[4]);
PC_DispChar2(17,7,'Y',c[4]);
PC_DispChar(16,8,c[5]);
PC_DispChar(17,8,c[5]);
PC_DispChar(12,16,c[5]);
PC_DispChar(13,16,c[5]);
PC_DispChar2(12,17,'Y',c[4]);
PC_DispChar2(13,17,'Y',c[4]);
PC_DispChar(12,18,c[3]);
PC_DispChar(13,18,c[3]);
}
voidSend_daojishi()//倒计时的定义
{
PC_DispChar1(25,3,b[a]);
}
/******************************************************************************************函数名称:
main()
**函数功能:
读取实时时钟的值,通过串口发送出去。
****************************************************************************************/
intmain(void)
{
UARTMODEuart0_set;
PINSEL0=0x00000005;//连接IO到UART0
PINSEL1=0x00000000;
//定时器0初始化
T0TC=0;//定时器设置为0
T0PR=0;//时钟不分频
T0MCR=0x03;//设置T0MR0匹配后复位T0TC,并产生中断标志T0MR0=Fpclk/1;//1s定时
T0TCR=0x01;//启动定时器
uart0_set.datab=8;
uart0_set.stopb=1;
uart0_set.parity=0;
UART0_Init(115200,uart0_set);
U0FCR=0x01;//FIFO使能
while
(1)
{
while((T0IR&0x01)==0)//启动RTC中断
{
Send_cross();
Send_deng();
Send_daojishi();
}
a++;
if(a==5)
{
j=1;
}
if(a==10)
{
a=0;
k++;
j=0;
if(k==2)k=0;
}
T0IR=0x01;//取消RTC中断
}
return(0);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DOS 窗口 模拟 交通灯 演示 设计