
课 程 设 计 报 告
课程设计名称: 单片机原理与应用
系别 : 三
学生姓名:
班 级:
学 号:
成 绩:
指导教师:
开课时间: 2011-2012 学年 2 学期
一.设计题目
数字时钟
二.主要内容
利用定时器设计一个电子钟,并定义一个启动键。当按下该键时电子时钟从当前设定值开始走时。按秒刷新,要求在LCD屏上显示。
三.具体要求
在课程设计时,1人一组,设计报告由学生完成,不得互相抄袭。教师的主导作用主要在于指明设计思路,启发学生设计的思路,解答疑难问题和按设计进度进行阶段审查。学生必须发挥自身学习的主动性和能动性,主动思考问题、分析问题和解决问题,而不应处处被动地依赖指导老师。
学生在设计中可以引用所需的参考资料,避免重复工作,加快设计进程,但必须和题目的要求相符合,保证设计的正确。学生学会掌握和使用各种已有的技术资料,不能盲目地、机械地抄袭资料,必须具体分析,使设计质量和设计能力都获得提高。学生要在老师的指导下制定好自己各环节的详细设计进程计划,按给定的时间计划保质保量的完成个阶段的设计任务。设计中可边设计,边修改,软件设计与硬件设计可交替进行,问题答疑与调试和方案修改相结合,提高设计的效率,保证按时完成设计工作并交出合格的设计报告。
| 周一 | 周二 | 周三 | 周四 | 周五 |
| 讲课设内容,安排任务 | 查资料,确定硬件电路方案 | 画出程序流程图,写出程序清单 | 画出程序流程图,写出程序清单 | 写总结报告 |
五.成绩评定
考核方法:现场验收(占50%),课程设计报告(占50%)。
考核内容:学习态度(出勤情况,平时表现等)、方案合理性、程序编制质量、演示效果、设计报告质量。
成绩评定:优,良,中,及格,不及格。
特别说明:如发现抄袭,按照不及格处理。
第一章 系统概要………………………………………………………………3
1.1 系统背景 ……………………………………………………………3
1.2 系统功能 ……………………………………………………………4
第二章 系统硬件设计…………………………………………………………5
2.1 系统原理图…………………………………………………………5
2.2 单片机(MCU)模块………………………………………………6
2.2.1 MC9S08AW60单片机功能概述 ………………………………6
2.2.2 内部结构简图…………………………………………………7
2.3 串行通信模块………………………………………………………7
2.3.1 MAX232引图 ………………………………………………7
2.3.2 串行通信的电路原理 ………………………………………8
2.4 液晶显示模块 ……………………………………………………9
第三章 系统软件设计…………………………………………………11
3.1 MCU方(C)程序…………………………………………………11
3.1.1串行通信子程序 ……………………………………………12
3.1.2 LCD子程序 ………………………………………………16
第四章 系统测试 …………………………………………………………20
第五章 总结展望……………………………………………………………23
5.1 总结 ……………………………………………………………23
5.2 展望 ……………………………………………………………24
参考文献 ……………………………………………………………………24
第一章 系统概要
1.1 系统背景
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。单片机技术自发展以来已走过了近20年的发展路程 。单片机技术的发展以微处理器(MPU)技术及超大规模集成电路技术的发展为先导,以广泛的应用领域拉动,表现出较微处理器更具个性的发展趋势。小到遥控电子玩具,大到航空航天技术等电子行业都有单片机应用的影子。1946年第一台电子计算机诞生至今,依靠微电子技术和半导体技术的进步,从电子管——晶体管——集成电路——大规模集成电路,使得计算机体积更小,功能更强。特别是近20年时间里,计算机技术获得飞速的发展,计算机在工农业,科研,教育,国防和航空航天领域获得了广泛的应用,计算机技术已经是一个国家现代科技水平的重要标志。单片机诞生于20世纪70年代,所谓单片机是利用大规模集成电路技术把处理单元(Center Processing Unit,也即常称的CPU)和数据存储器(RAM)、程序存储器(ROM)及其他I/O通信口集成在一块芯片上,构成一个最小的计算机系统,而现代的单片机则加上了中断单元,定时单元及A/D转换等更复杂、更完善的电路,使得单片机的功能越来越强大,应用广泛。20世纪70年代,微电子技术正处于发展阶段,集成电路属于中规模发展时期,各种新材料新工艺尚未成熟,单片机仍处在初级的发展阶段,元件集成规模还比较小,功能比较简单,一般均把CPU、RAM有的还包括了一些简单的I/O口集成到芯片上,像Fairchild公司就属于这一类型,它还需配上外围的其他处理电路方才构成完整的计算系统。九十年代以后,单片机获得了飞速的发展,世界各大半导体公司相继开发了功能更为强大的单片机。美国Microchip公司发布了一种完全不兼容MCS-51的新一代PIC系列单片机,引起了业界的广泛关注,特别它的产品只有33条精简指令集吸引了不少用户,使人们从INTEL的111条复杂指令集中走出来。PIC单片机获得了快速的发展,在业界中占有一席之地。21世纪新一代的嵌入式处理器已经开始内嵌网络接口,除了支持TCP/IP协议,还有的支持IEEE1394、USB、CAN、Bluetooth或IrDA通信接口中的一种或者几种,同时也需要提供相应的通信组网协议软件和物理层驱动软件。目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次。
1.2 系统功能
本次课程设计的主要任务是设计一个时钟计数器,也就是要做一个秒表,能够计数,并且按照我们平时的时间计数格式显示,当我们按下某个计数按键时候,这个计数系统就一秒一秒的计数,当计数到59秒就进位,显示分钟的部分加1,当计数分钟的数字显示到59,同样要进位,这时候时钟部分加1,如此循环下去。当我们再次按下此按键时候,计数器暂停计数,此时显示器也就暂停在那个时候不在计数了,并且显示当前计数时间。LCD 显示器要求每显示一次就刷新一次,或者刷新频率更高些。
嵌入式系统源于计算机在测量与控制系统(简称测控系统)中的应用,因此现代测控系统是典型嵌入式系统。几乎所有嵌入式系统都可以简化成一个测控系统模型。其主要内容有通用输入/输出、键盘、液晶显示(LCD)、数码管(LED)、数/模与模/数转换(A/D与D/A)、串行通信接口(SCI)、串行外设接口(SPI)、集成电路互线(IIC或I2C)、定时器、PWM等。还可以包括USB、CAN、嵌入式以太网及各种具体应用等。
第二章 系统硬件设计
2.1 系统原理图
在进行具体的硬件设计之前,必须根据系统所要实现的功能确定MCU的选型。选用了AW60作为系统的MCU。MCU选型确定之后,接下来考虑电源,AW60 MCU需要3.3V供电。定时器模块,时间设置并在LCD上显示。通过上面的分析,根据构件化思想,“定时显示功能”包含的硬件构件有:AW60最小系统、电源构件、LCD显示构件、通信接口构件。它们的功能和类型参见表。
| 表2-1 定时器显示控制系统的硬件构件划分 | |||
| 构件中文名称 | 构件英文名称 | 构件功能 | 类型 |
| AW60最小系统 | AW60-MinSys | AW60 MCU的最小系统,包含BDM电路。 | 核心构件 |
| 电源 | Power | 将+24V电压转换为+3.3V电压。 | 中间构件 |
| 液晶显示 | LCD | 采用串行输入模式显示数据。 | 终端构件 |
图2-1系统电路图
图2-1中AW60是主要模块,所有的信号都是经过AW60模块进行处理,各个功能模块在AW60模块的连接下才能够协调运行起来。图中,左边一块是各异晶振和两个电容连接,用来产生标准的时钟脉冲,在AW60上面连接的是LCD液晶显示器,用来动态显示当前所计数的秒数,右边一个模块是接地使用,最下面的是一个开关模块,用来在程序加载后由此开关控制何时开始计数,何时暂停计数,以及一些复位等操作。
2.2 单片机(MCU)模块
2.2.1 MC9S08AW60单片机性能概述
S80是单芯片8位微控制器解决法案。MC9S08AW60/AW60/AW48/AW32/AW16是低成本高性能的8位饿、微处理器单元(MCU)S08家族中的成员。家族中有的MCU使用增强型S08S核,且使用不同的模块,存储空间,存储器类型与封装类型。
AW60系列主要常规模块和特点:
(1)最高达40MHz的CPU工作频率和20MHz的内部总线工作频率;时钟源选项包括晶振,谐振器,外部时钟或,内部产生的时钟。
(2)相比HC08CPU指令集,S08CPU增加了BGND指令。
(3)单线后台调试模式接口:增强的断点能力,允许单一的断点设置在线调试(在片内调试模块增加了多于两个的断点)。
(4)内含32个中断/复位源;内含2KB的片内RAM;内含60KB的片内在线可
编程的Flash存储器,带有 块保护和安全选项。
(5)可选的计算机正常操作(COP)复位;低电压检测与复位或中断;非法操作码检测与复位;非法地址检测与复位。
(6)ADC:多达16个通道,10个A/D转换器与动动比较功能;两个串行通信接口SCI模块与可选的13位中断;一个串行外设接口SPI模块;集成电路互线IIC模块运行高达100kbps的最高总线负载;8引脚键盘中断KBI模块。
(7)Timers:1个2 通道和一个6通道16位定时器/脉冲宽度调制器模块。既有输入捕获,输出比较,脉宽调制功能。
AW子系列MCU的4种封装形式只是引脚数量和形式有所区别,其他方面是一致的。
2.2.2 内部结构简图
1. 内部结构简图
图2-2 AW60 MCU内部结构框图
图2-2给出了SW60内部结构框图,它对于我们理解和应用AW60 MCU有重要作用,在学习了基本方法后,应再反过来熟悉这个内部结构图,以便好好地理解AW60 MCU的基本原理。从内部结构框图可以看出,AW60主要有以下部件:S08 CPU,存储器,定时器接口模块,定时器模块,看门狗模块,通用I/O模块,串行通信模块(SCI),串行外设接口模块(SPI),I2C(IIC)模块,A/D转换模块,键盘中断模块,时钟发生器模块,复位与中断模块等。
2.3 串行通信模块
2.3.1 MAX232引脚图
在MCU中,若用RS-232总线进行串行通信,则需外界电路实现电平转换,在发送端需要用驱动电平将TTL电平转换成RS-232电平;在接收端,需要用接收电路将RS-232电平转换为TTL电平。电平转换器不仅可以由晶振管分立元件构成,也可以直接使用集成电路。目前使用MAX232芯片比较多,该芯片使用单一+5V电源供电实现电平转换,下图的引脚说明:
(1)VCC(16脚):正电源端,一般为+5V;
(2)GND(15脚):接地;
(3)Vs+(2j脚):vs+=2vcc-1.5v=8.5v;
(4)Vs-(6脚):vs-=-2vcc-1.5v=-11.5v;
(5)C2+,C2-(4,5脚):一般接1uF的电解电容;
(6)C1+,C2-(1,3脚):一般接1uF的电解电容。 图2-3 MAX232引脚
2.3.2 串行通信的电路原理
1、焊接到PCB板上的MSX232芯片检测方法
正常情况下,(1)T1IN=5V,则T1OUT=-9V;T1IN=0V;则T1OUT=9V。(2)将R1IN与T1OUT相连,令T1IN=5V,则R1OUT=5V;令T1IN=0V,则T1OUT=0V。
具有串行通信接口的MCU,一般具有发送引脚(TxD)与接受引脚(RxD),不同公司或不同系列的MCU,使用的引脚缩写名可能不一致,但含义相同。串行通信接口的外围硬件电路,主要目的是:将MCU的发送引脚TxD与接收端引脚RxD的TTL电平,通过RS-232电平转换器芯片转换成RS-232电平,上图就是基本串行通信的电平转换电路。
2、 MAX232芯片进行电平转换的基本原理
发送过程:MCU的TxD(TTL电平)经过MAX232的11脚(T1IN)送到MAX232内部,在内部TTL电平被“提升”为232电平,通过14脚(T1OUT)发送出去。
接收过程:外部232电平经过MAX232的13脚(R1IN)送入到MAX232的内部,在内部的电平被“降低”为TTL电平,经过12脚(R1OUT)送到MCU的RxD,进入MCU内部。
进行MCU的串行通信接口编程时,只针对MCU的发送与接收引脚,与MAX232无关,MAX232只是起到电平转换作用。
输入输出引脚分两组,基本含义如表2-2所示。在实际使用时,若只需要一路串行通信接口,可以使用其中任何一组。
| 表2-2 MAX232芯片输入输出引脚分类与基本接法 | ||||||
| 组别 | TTL电平引脚 | 方向 | 典型接口 | 232电平引脚 | 方向 | 典型接口 |
| 1 | 11 12 | 输入 输出 | 接MCU的TxD 接MCU的RxD | 13 14 | 输入 输出 | 连接到接口,与其它设备通过232相接 |
| 2 | 10 9 | 输入 输出 | 接MCU的TxD 接MCU的RxD | 8 7 | 输入 输出 | 连接到接口,与其它设备通过232相接 |
图2-4液晶显示模版
点阵字符型LCD基本特点:
LCD作为电子信息产品的主要显示器件,相对于其他类型的显示器件来说有其自身的特点,主要包括:(1)低电压,低功耗;(1)平板型结构;(3)使用寿命长;(4)被动显示;(5)显示信息量大且易于彩色化;(6)无电磁辐射。
点阵字符型LCD是专门用于显示数字,字母,图形符号及少量自定义符号的液晶显示器。这类显示器把LCD控制器,点阵驱动器,字符存储器,显示体及少量的阻容元件等集成一个液晶显示模板。鉴于字符型液晶显示模块目前在国际上已经规范化,其电特性及接口特性是统一的,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示器模块。
点阵字符型液晶显示器模块的控制器大多数为日立公司生产的HD44780及其兼容的控制电路,如:SED1278(SEIKO EPSON),KS0066(SAMSUNG),NJU08(NER JAPANRADIO)等。
字符型液晶显示器模块的特点如下:
(1)液晶显示屏是以若干5*8或5*11点阵块等组成的显示字符群。每个点阵块块为一个字符位,字符间距和行间距都是一个点的宽度。
(2)主控制电路为HD44780(HITACHI)及 其他公司的兼容电路。从程序员的角度来看LCD显示接口与编程是面向HD44780的,只要了解HD44780的编程结构即可进行LCD的显示编程。
(3)内部具有字符发生器ROM,可显示192种字符。
(4)具有字节的字符发生器RAM,可以定义8个5*8点阵字符或4个5*11
的点阵字符。
(5)具有字节的数据显示RAM,供显示器编程使用。
(6)标准接口特性,与MC9S08系列的MCU容易接口。
(7)模块结构紧凑,轻巧,装配容易。
(8)单+5V电源供电(宽温型需要加-7V驱动电源)。
(9)低功耗,高可靠性。
LCD(YM1602C)
| 图2-5 MCU控制液晶显示接口接线图 |
3.1 MCU方(C)程序
//-------------------------------------------------------------------------*
//工 程 名: Timer *
//硬件连接: MCU的串口与PC方的串口相连 *
//程序描述: *
// (1)打开程序目录中的Timer1.exe,用串口发生给MCU表示时间的3字节数据*
// (2)利用定时器溢出中断修改时间,并发送新时间 *
//目 的: 学习定时器基本功能 *
//说 明: 无 *
//----------------苏州大学飞思卡尔嵌入式系统实验室2010年-------------------*
//总头文件
#include "Includes.h"
//在此添加全局变量定义
uint8 time[3]; //记录时间的数组
void main(void)
{
uint8 i=0;
uint8 LCDbuff[] = " pangxiaoyue ";//32个空格,显示屏初始字符
uint8 remember; //记录当前秒数的变量
//1 关总中断
DisableInterrupt(); //禁止总中断
//2 芯片初始化
MCUInit();
//3 模块初始化
TPMinit(1); //(1)定时器1初始化
SCIInit(1,SYSTEM_CLOCK,9600); //(2)串行口初始化
//4 内存初始化
time[0] = 0; //(1) "时分秒"缓存初始化(00:00:00)
time[1] = 0;
time[2] = 0;
remember = time[2]; //(2) 临时变量remember初始化
LCDshow(LCDbuff); //显示初始字符
//5 开放中断
EnableSCIReInt(); //(1)开放串口接受中断
EnabletimerInt(1); //(2)开放定时器1溢出中断
EnableInterrupt(); //(3)开放总中断
//6 主循环
while (1)
{
if (time[2] != remember)
{
SCISendN(1,3,time) ;
LCDbuff[0] =time[0]/10+'0' ;
LCDbuff[1] =time[0]%10+'0' ;
LCDbuff[2] =time[1]/10+'0' ;
LCDbuff[3] =time[1]%10+'0' ;
LCDbuff[4] =time[2]/10+'0' ;
LCDbuff[5] =time[2]%10+'0' ;
LCDshow(LCDbuff) ;
remember= time[2];
}
}
}
3.1.1串行通信子程序
//-------------------------------------------------------------------------*
//文件名: SCI.c *
//说 明: SCI构件函数源文件 *
//-------------------------------------------------------------------------*
//头文件
#include "SCI.h" //该头文件包含SCI相关寄存器及标志位宏定义
//-------------------------------------------------------------------------*
//函数名: SCIInit *
//功 能: 初始化SCIx模块,x代表1、2 *
//参 数: uint8 SCINo: 第SCINo个SCI模块,其中SCINo取值为1、2 *
// 如果SCINo大于2,则认为是2 *
// uint8 sysclk:系统总线时钟,以MHz为单位 *
// uint16 baud: 波特率,如 4800、9600、19200、38400 *
//返 回: 无 *
//说 明: SCINo=1表示使用SCI1模块,依此类推 *
//-------------------------------------------------------------------------*
void SCIInit(uint8 SCINo, uint8 sysclk, uint16 baud)
{
uint16 ubgs;
ubgs=0;
if(SCINo > 2)
{
SCINo = 2; //若传进的通道号大于2,则按照2来接收
}
//计算波特率并设置:ubgs = fsys/(波特率*16)(其中fsys=sysclk*1000000)
ubgs = sysclk*(10000/(baud/100))/16; //理解参考上一行,此处便于CPU运算
AW60_SCI_BDH(SCINo) = (uint8)((ubgs & 0xFF00) >> 8);
AW60_SCI_BDL(SCINo) = (uint8)(ubgs & 0x00FF);
//无校验,正常模式(开始信号 + 8位数据(先发最低位) + 停止信号)
AW60_SCI_C1(SCINo) = 0;
//允许发送,允许接收,查询方式收发
AW60_SCI_C2(SCINo) = (0
| AW60_SCI_CTR2_TRANS_ENABLE
| AW60_SCI_CTR2_RECV_ENABLE );
}
//-------------------------------------------------------------------------*
//函数名: SCISend1 *
//功 能: 串行发送1个字节 *
//参 数: uint8 SCINo: 第SCINo个SCI模块,其中SCINo取值为1、2 *
// uint8 ch: 要发送的字节 *
//返 回: 无 *
//说 明: SCINo=1表示使用SCI1模块,依此类推 *
//-------------------------------------------------------------------------*
void SCISend1(uint8 SCINo, uint8 ch)
{
if(SCINo > 2)
{
SCINo = 2; //若传进的通道号大于2,则按照2来接收
}
while(!(AW60_SCI_S1(SCINo) & AW60_SCI_S1_TRANS_EMPTY));//判断发送缓冲区是否为空
AW60_SCI_D(SCINo) = ch;
}
//-------------------------------------------------------------------------*
//函数名: SCISendN *
//功 能: 串行发送N个字节 *
//参 数: uint8 SCINo: 第SCINo个SCI模块,其中SCINo取值为1、2 *
// uint8 n: 发送的字节数 *
// uint8 ch[]: 待发送的数据 *
//返 回: 无 *
//说 明: SCINo=1表示使用SCI1模块,依此类推 *
// 调用了SCISend1函数 *
//-------------------------------------------------------------------------*
void SCISendN(uint8 SCINo, uint8 n, uint8 ch[])
{
uint8 i;
if(SCINo > 2)
{
SCINo = 2; //若传进的通道号大于2,则按照2来接收
}
for (i = 0; i < n; i++)
SCISend1(SCINo,ch[i]);
}
//-------------------------------------------------------------------------*
//函数名: SCIRe1 *
//功 能: 从串口接收1个字节的数据 *
//参 数: uint8 SCINo: 第SCINo个SCI模块,其中SCINo取值为1、2 *
//返 回: 接收到的数(若接收失败,返回0xff) *
// uint8 *p: 接收成功标志的指针(0表示成功,1表示不成功) *
//说 明: 参数*p带回接收标志,*p = 0,收到数据;*p = 1,未收到数据 *
// SCINo=1表示使用SCI1模块,依此类推 *
//-------------------------------------------------------------------------*
uint8 SCIRe1(uint8 SCINo, uint8 *p)
{
uint16 k;
uint8 i;
if(SCINo > 2)
{
SCINo = 2; //若传进的通道号大于2,则按照2来接收
}
for (k = 0; k < 0xfbbb; k++)//有时间
if((AW60_SCI_S1(SCINo) & AW60_SCI_S1_RECV_FULL) != 0)//判断接收缓冲区是否满
{
i = AW60_SCI_D(SCINo);
*p = 0x00;
break;
}
if (k >= 0xfbbb) //接收失败
{
i = 0xff;
*p = 0x01;
}
return i;
}
//-------------------------------------------------------------------------*
//函数名: SCIReN *
//功 能: 从串口接收N个字节的数据 *
//参 数: uint8 SCINo: 第SCINo个SCI模块,其中SCINo取值为1、2 *
// uint8 n: 要接收的字节数 *
// uint8 ch[]: 存放接收数据的数组 *
//返 回: 接收标志= 0 接收成功,= 1 接收失败 *
//说 明: SCINo=1表示使用SCI1模块,依此类推 *
// 调用了SCIRe1函数 *
//-------------------------------------------------------------------------*
uint8 SCIReN(uint8 SCINo, uint8 n, uint8 ch[])
{
uint8 m;
uint8 fp; //接收标志
m = 0;
if(SCINo > 2)
{
SCINo = 2; //若传进的通道号大于2,则按照2来接收
}
while (m < n)
{
ch[m] = SCIRe1(SCINo, &fp);
if (fp == 1)
{
return 1; //接收失败
}
m++;
}
return 0; //接收成功
}
//-------------------------------------------------------------------------*
//函数名: SCISendString *
//功 能: 串口传输字符串 *
//参 数: uint8 SCINo: 第SCINo个SCI模块,其中SCINo取值为1、2 *
// char *p: 要传输的字符串的指针 *
//返 回: 无 *
//说 明: 字符串以'\\0'结束 *
// 调用了SCISend1 函数 *
//-------------------------------------------------------------------------*
void SCISendString(uint8 SCINo,char *p)
{
uint32 k;
if(SCINo > 2)
{
SCINo = 2; //若传进的通道号大于2,则按照2来接收
}
if(p == 0) return;
for(k = 0; p[k] != '\\0'; ++k)
{
SCISend1(SCINo,p[k]);
}
}
3.1.2 LCD子程序
//-------------------------------------------------------------------------*
// 文件名: LCD.c *
// 说 明: LCD驱动 *
//-------------------------------------------------------------------------*
#include "LCD.h" //该头文件包含寄存器及相关位定义
//-------------------------------------------------------------------------*
//函数名: LCDinit *
//功 能: 初始化LCD(HD44780),设置显示方式,输入方式,并清屏 *
//参 数: 无 *
//返 回: 无 *
//说 明: 调用了LCDcommand函数 *
//-------------------------------------------------------------------------*
void LCDinit(void)
{
uint16 i;
//定义数据口(PTA0-7)为输出
LCDdataD = 0b11111111;
// ||||||||
// |||||||+--------PTA0
// ||||||+---------PTA1
// |||||+----------PTA2
// ||||+-----------PTA3
// |||+------------PTA4
// ||+-------------PTA5
// |+--------------PTA6
// +---------------PTA7
//定义控制口(PTC4,PTC6)为输出
LCDctrlD1 |=(1< LCDctrlD2 |=(1< //1 功能设置 LCDcommand(0b00111000); //5*7点阵模式, 2行显示,8位数据总线 // ||| // ||+--------设置点阵模式,0-5*7点阵,1-5*10点阵 // |+---------设置显示行数,1-2行显示,0-1行显示 // +----------设置数据接口位数,1-8位数据总线,0-4位数据总线 //2 显示开关控制 LCDcommand(0b00001000); // 不闪烁, 关光标显示,关显示 // ||| // ||+-----闪烁控制,0-不闪烁,1-闪烁 // |+------光标控制,0-关光标,1-开光标 // +-------显示控制,0-关显示,1-开显示 //3 清屏 //3.1清DD RAM内容,光标回原位,清AC LCDcommand(0b00000001); //3.2等待清屏完毕,时间 > 1.6ms for(i = 0; i< 4000; i++) asm("NOP"); //4 输入方式设置 LCDcommand(0b00000110); // 显示不移动,光标左移(A = 1), 数据读写操作后,AC自动增1 // || // |+------0-显示不移动,1-显示移动 // +-------0-AC自动减1,1-AC自动增1 //5 光标或画面移位设置 LCDcommand(0b00010100);//光标右移一个字符位,AC自动加1 //6 显示开关控制 LCDcommand(0b00001100); //不闪烁, 关光标显示,开显示 // ||| // ||+------闪烁控制,1-闪烁,0-不闪烁 // |+-------光标控制,1-开光标,0-关光标 // +--------显示控制,1-开显示,0-关显示 } //-------------------------------------------------------------------------* //函数名: LCDcommand * //功 能: 执行给定的LCD命令,并延时 * //参 数: cmd:待执行的命令 * //返 回: 无 * //说 明: 无 * //-------------------------------------------------------------------------* void LCDcommand(uint8 cmd) { uint16 i; //1 等待 > 40us for(i = 0; i < 1000; i++) asm("NOP"); //2 数据送到LCD的数据线上 LCDdata = cmd; //3 给出E信号的下降沿,使数据写入LCD LCDctrl2 |=(1< asm("NOP"); asm("NOP"); LCDctrl2 &=~(1< for(i = 0; i < 1000; i++) asm("NOP"); } //-------------------------------------------------------------------------* //函数名: LCDshow * //功 能: 在LCD(HD44780)显示屏上显示32个数据 * //参 数: str 待显示数据的首地址 * //返 回: 无 * //说 明: 调用LCDinit、LCDcommand函数 * //-------------------------------------------------------------------------* void LCDshow(uint8 str[]) { uint8 i; //1 LCD初始化 LCDinit(); //2 显示第1行16个字符 //2.1 设置显示首地址 LCDctrl1 &=~(1< //2.2 写16个数据到DDRAM LCDctrl1 |=1< { LCDcommand(str[i]); } //3 显示第2行16个字符 //3.1 设置显示首地址 LCDctrl1 &=~(1< //3.2 再写16个数据到DDRAM LCDctrl1 |=1< { LCDcommand(str[i]); } } 第四章 系统测试 1、点击Timer.mcp文件,显示界面如测试图4-1所示。 图4程序主界面图 2、进行仿真编译如图4-2,发现有一个Error&warning,错误提示是:Condition always True,main.c line 45,双击查看源程序,发现是While(1)的问题,但可以理解这不是错误,只是在不人为停止的情况下,计时是不会停下来的。 图4-2 仿真编译结果图 3、开始运行,跳出对话框如图4-3所示,选择OK。 图4-3 4、点OK后,跳出运行情况图,如图4-4所示,点击绿色指向右的箭头,程序开始运行。 图4运行情况图 5、将系统时间发送给试验箱如图4-5 图4-5 6、在试验箱上的LCD显示屏如图4-6 图4-6 第五章 总结展望 5.1 总结 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。 通过此次课程设计, 让我对单片机方面的知识有了更深的认识和体会,在课程设计时,总会遇到各种问题,这需要我们一次又一次的检查、思考才能最终解决。于是,在这反复的思考过程中,也让我充分认识到自己在哪些方面有所欠缺。因而,这次可课程设计可谓很好的对书本知识温故而知新。 这次为期一周的课程设计,是一个在LCD屏上显示的电子钟。因为是对老师所给的程序的基础上进行修改整合添加,因而需要对原有的程序进行一个整体的了解和深入。在了解整个程序的前提下,争对具体要求进行具体的操作。主要添加的文件有LCD.c程序、LCD.h程序、Timer.c程序和Timer.h程序,修改的程序有主函数main.c、中断函数isr.c和总头文件Includes.h 等。在这个过程中,熟悉程序就需要一定的知识做基础,因而,这一过程就相当于讲书本上的程序进行重新系统的学习与温故,并且,也对C语言的内容进行了复习与强化。而且,也让我深入了解飞思卡尔的设计思路,这使我们能够了解到实际开发的一些步骤和思路。 所以此次课程设计让我对我所学的书本知识进行了巩固,拓展了专业知识。运用所学的知识,发现、提出、分析、解决问题,这是对我所学知识的综合考察。我用此次机会,把自己把知识在实践中的到了运用,把理论的抽象具体化,使我把知识和实践得到很好的融合。该课程设计,全面系统的理解了单片机的一般原相关知识。把死板的课本知识变得生动有趣,激发了学习的积极性。单片机涉及的知识太多,每个知识里面都有一定的深度,那么对我们在遇到实际问题时,就只能靠自己去摸索。常常是再坚持一两个小时,就能够解决你的问题。最大的成就感,就在付出了极大的心血和耐心,才取得一个艰难的小胜利,这也加强了我们、思考和我们的耐心。 在单一的书本学习中,有这么一次课程设计是放松中学习的一个不可多得的机会。通过这次课程设计,我们不但获得了知识和动手能力的提高,掌握了一些实践技能,我们还培养了思考和变通思维的能力。它还让我学到了很多课本上学不到的道理,开拓视野的同时增加知识。我在这次实践中不但收获知识,还收获了经历,这可以给我以后的学习生活带来不少的启示。对于一些辛苦,只要自己坚持,一定可以看到成功的果实。 当然,这次课程设计有收获的同时,也有许多不足之处。主要原因还是因为自己不够努力,不肯狠下心来苦下功夫去学习,许多知识很繁杂,这就使我不想去深究。因此在老师验收时,这些缺点就全部暴露出来了,因而,对于程序中自己所不知道的知识,老师都尽可能进行了讲解。 5.2 展望 这次课程设计,让我深深的知道自己的不足与缺陷之处,对书本知识不够熟悉,每每遇到什么问题还需要翻书查找。对C语言知识也渐渐的生疏了,许多程序调试之后发现错误都无从下手。这次设计是给出了大部分程序的,如果让我们自己做,肯定是错误连连甚至无从下手。以及在软硬件结合时,对硬件构件知识不够了解等等。争对这些缺陷,在以后的学习中,我要加强这些方面的学习与理解。 参考文献 [1] 王宜怀、张书奎、王林、吴瑾著.嵌入式技术基础与实践(第二版),北京:清华大学出版社,2011. [2] 田泽. 嵌入式系统开发与应用. 北京:北京航天航空大学出版社,2006. [3] 田泽. 嵌入式系统开发与应用教程. 北京:北京航天航空大学出版社,2006. [4] 王宜怀、陈建明、蒋银珍著. 基于32位ColdFire构建嵌入式系统. 北京:电子工业出版社,2006. [5] 王粉花、王志良. 嵌入式系统与单片机实践教程. 北京:清华大学出版社,2010.
