电子秒表式计数器 ARM嵌入式_基于嵌入式的电子秒表
电子秒表式计数器 ARM嵌入式由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“基于嵌入式的电子秒表”。
ARM嵌入式系统基础课设
基于LPC2106的电子秒表式计数器
I
目 录
1.引言...............................................................................................1 2.系统设计.......................................................................................1 2.1 课题目标及总体方案...........................................................1 2.2 元器件的选择和连线...........................................................2 2.3 程序和芯片的初始化...........................................................3 3.实验(软硬件测试)结果...........................................................4 3.1 ADS1.2 软件的编译,连接和运行.....................................4 3.2 protues 仿真软件的联合调试..............................................6 3.3 总原理图...............................................................................7 4.心得体会.........................................................................................7 5.参考文献.........................................................................................8 6.附录.................................................................................................8
II
1.引言
近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。
秒表是日常生活中比较常用的精确计时工具,特别是在体育竞技以及生产科研中,跳动精确的秒表更是有着不可替代的作用。过去机械秒表的设计制作极为复杂,而且成本高、不稳定给使用者带来了不少的困扰。但是随着电子技术的飞速发展,电子秒表的出现彻底改变了这一局面,电子秒表以其成本低廉、工作稳定、走时精确、操作简单在人类的工作生活中得到了广泛的应用。本次实训任务是依托嵌入式系统设计一个电子秒表,能实现记录3个时间节点,误差小于0.5秒,并能完成暂停启动功能。
2.系统设计
2.1 课题目标及总体方案
课程设计目标
1、培养综合运用知识和独立开展实践创新的能力;
2、培养学生的编程能力、用计算机解决实际问题的能力。总体方案
利用LPC2106芯片和LCD显示器,通过汇编和C语言编译,完成实时秒
表的显示。
1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;
2、使用ADS1.2编译汇编语言和C语言,连接生成Hex文件。
3、联合Protues仿真,选用ARM7 LPC2106 芯片,导入Hex文件,实现模拟
秒表显示。
2.2 元器件的选择和连线
选用嵌入式ARM 7系列的LPC2106芯片和LCD lm016l显示器:
根据使用的需要配置端口连线:
2.3 程序和芯片的初始化
程序中包括:
1、Lcd的初始化:
2、中断向量的初始化:
3、定时器0初始化:
4、中断初始化:
5、芯片Lpc2106基础配置:
中间使用了上接正电源配合电容的交流特性,为芯片提供电源和复位功能。其他引脚根据芯片要求配置连接。
3.实验(软硬件测试)结果
3.1 ADS1.2 软件的编译,连接和运行
构建完整的程序:
1、添加头文件,中断处理汇编程序段,初始化函数和主函数:
2、编译所有的文件:
编译器提示:成功生成所需Hex文件,将得到的Hex文件导入仿真芯片 Lpc 2106中,观察实时秒表。
3.2 protues 仿真软件的联合调试
为Lpc 2106 芯片选择Hex文件路径:
连接芯片与LCD端口,运行程序,观察效果。显示如下秒表界面:
3.3 总原理图
4.心得体会
通过ARM嵌入式课程和实验的学习,我完成了这个课程设计题目。在课程设计的过程中,我发现我们在这半个学期里所学的嵌入式课程的知识点仅仅是基础,要完成一个有实用价值的设计是需要一定努力和学习的,于是我首先上网搜集了许多相关的资料,学习了ADS1.2 软件的编译、连接和运行以及 Protues软件的仿真和联合调试,根据搜集到的嵌入式知识,接下来完成设计方案和程序修改调试,实现了课程设计的基本要求,最终完成了课程设计报告。
通过这次课设,我发现了自己在课本知识上掌握的不足,同时把以前所学过的知识重新温故,巩固了所学的知识。让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。既让我懂得了怎样将理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。在设计过程中,总是会遇到这样或那样的问题如程序的修改,调试,编译等,这就需要我冷静、耐心和细心等心理素质。另外,这次课设的独自完成,给了我日后毕业设计宝贵的经验,使我受益匪浅。
5.参考文献
[1] 周立功,ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社 2008 [2] 周立功,深入浅出ARM7-LPC213X/214X[M].北京:北京航空航天大学出版社2006 [3] 周立功,从51到ARM-32位嵌入式系统入门[M].北京:北京航空航天大学出版社2006 [4] 王田苗,嵌入式系统设计与实例开发[M].北京:清华大学出版社,2003 [5] 杜春雷,ARM 体系结构与编程[M].北京:清华大学出版社.2003 [6] 桑楠.嵌入式系统原理及应用开发技术,北京:北京航空航天大学出版社, 2002
6.附录
软件程序:
/**************************************************************************** * File: main.c * 功能:向LCD输出计数值
****************************************************************************/ #include “config.h” #define rs(1
uint8 BCD[6];//十位二进制的显示码分别是千百十个位的显示
uint16 count=0;/**************************************************************************** * File: enable_irq()
* 功能:中断使能函数
****************************************************************************/ __inline void enable_irq(){ uint8 tmp;__asm
{
MRS tmp,CPSR
BIC tmp,tmp,#0x80
MSR CPSR_c,tmp
} }
void delay(uint32 dly);void timer0_init(void);void __irq timerInt(void);void int_init(void);void ChkBusy(void);void WrOp(uint8 dat);void WrDat(uint8 dat);void lcd_init(void);void DisText(uint8 addr,uint8 *p);void ShowInt(uint8 addr,uint16 num);
/**************************************************************************** * File: main()* 功能:显示计数值
****************************************************************************/ int main(void){ IODIR=0x7ff;//设置为输出
IOCLR=0x7ff;lcd_init();
int_init();timer0_init();ShowInt(0x80,count++);enable_irq();while(1);} /**************************************************************************** * File:delay()* 功能:延时
****************************************************************************/
void delay(uint32 dly){ uint32 i;
for(;dly>0;dly--)
for(i=0;i
/**************************************************************************** * File:timer0_init * 功能:定时器0初始化
****************************************************************************/ void timer0_init(void){//定时器计数器0设置,晶振为12M,1秒要运行1000000个周期, T0PR=1000;//预分频寄存器
T0MR0=1000;//匹配值
T0MCR=0x00000003;//开放匹配0中断
T0TCR=0x00000003;//T0PC和T0TC复位
T0TCR=0x00000001;//T0PC和T0TC复位 } /**************************************************************************** * File:timerInt * 功能:中断处理程序
****************************************************************************/
void __irq timerInt(void){ ShowInt(0x80,count++);VICVectAddr=0;T0IR=0x00000001;
}
/**************************************************************************** * File:int_init()* 功能:中断初始化
****************************************************************************/ void int_init(void){ VICIntSelect=0x00000000;VICIntEnable=0x00000010;VICVectCntl0=0x00000024;VICVectAddr0=(int)timerInt;}
/****************************************************************************
* 名称:ChkBusy()* 功能:检查总线是否忙
****************************************************************************/ void ChkBusy(){ IODIR=0x700;while(1){
IOCLR=rs;
IOSET=rw;
IOSET=en;
if(!(IOPIN & busy))break;
IOCLR=en;} IODIR=0x7ff;} /**************************************************************************** * 名称:WrOp()* 功能:写函数
****************************************************************************/ void WrOp(uint8 dat){ ChkBusy();IOCLR=rs;//全部清零
IOCLR=rw;IOCLR=0xff;//先清零
IOSET=dat;//再送数
IOSET=en;IOCLR=en;} /**************************************************************************** * 名称:WrDat()* 功能:写数据函数
****************************************************************************/ void WrDat(uint8 dat){ ChkBusy();IOSET=rs;IOCLR=rw;IOCLR=0xff;//先清零
IOSET=dat;//再送数
IOSET=en;IOCLR=en;}
/**************************************************************************** * 名称:lcd_init()* 功能:lcd初始化函数
****************************************************************************/ void lcd_init(void){ WrOp(0x38);
WrOp(0x06);
//光标加1 WrOp(0x0c);
//开显示 } /**************************************************************************** * 名称:DisText()* 功能:显示文本函数
****************************************************************************/ void DisText(uint8 addr,uint8 *p){ WrOp(addr);while(*p!=' ')WrDat(*(p++));}
void ShowInt(uint8 addr,uint16 num)
//在addr处显示数字num {//将num转化成五个BCD码存放在全局数组BCD[5]中
uint8 i;for(i=5;i>0;i--)
//将NUM数据转化成ASCII码,如521会转化为00521 {
BCD[i-1]=(uint8)(num%10+0x30);
//取出最低位
num/=10;
//去掉最低位
}
i=0;while(BCD[i] ==0x30 && i
//NUM转换成数组存放,但还没有加上小数点
BCD[5]=' ';DisText(addr,BCD);}