《嵌入式课程设计》讲义
项目1 智能数字万年历
一.项目指标分析
项目指标要求如下:
1. 显示年、月、日、时、分、秒和星期。
2. 实时显示温度。
3. 可手动调整时间。
4. 采用LCD显示。
基于以上要求,核心控制芯片选用STC89C51;时钟芯片选用DS1302;温度传感器选用DS18B20;液晶屏选用LCD1602;设置按键,以便于调整时间。
二.电路原理
系统电路功能图如图1所示:
图1 智能数字万年历电路功能图
由图1可知,P2口控制LCD的数据端;P3.5、P3.6和P3.7控制着LCD的片选、读/写和寄存器选择信号;可调电阻RP2用于调节屏的显示对比度。P3.4是温度传感器DS18B20的1-wire接口,即片选、时钟和数据信号均由P3.4口控制。P0.5、P0.6和P0.7是时钟芯片DS1302的SPI接口,为使信号控制更稳定,这三个接口上都上拉了10KΩ电阻;为获得精准的时钟信号,选用频率为32.768KHz的外部晶振对DS1302提供振荡信号。P0.0-P0.3控制着四个按键,以便于调整时间。
三.程序设计
基于这个项目,程序的设计可分成各芯片驱动程序设计和控制算法程序两部分。
1.各芯片的驱动程序设计
在写驱动程序时,首先通读芯片手册,以掌握主要技术指标;然后可按照以下3个步骤进行:
(1)分清楚各芯片的通信属于哪种接口方式,例如:时钟芯片DS1302按照SPI 接口进行通信;温度传感器DS18B20按照1-wire接口进行通信;液晶屏LCD1602采用常规的并行数据传输方式。
(2)仔细分析芯片时序图,弄清楚片选信号是高电平有效还是低电平有效;数据是在时钟信号的上升沿还是下降沿时打入;数据前还是时钟前等。
(3)将功能程序函数化、驱动程序模块化。
2.控制算法程序设计
这里的算法主要集中在如何设置按键识别程序,即便于调整时间,又不影响液晶屏的显示。这里,提供两种思想以便参考。
(1)循环扫描方式流程图
图2 循环扫描方式流程图
(2
图3 状态机方式流程图
将图2和图3比较起来看,两种方式的最大差别在于“10ms消抖时间如何度过?”。在循环扫描方式下,采用延时10ms去抖,这10ms 里,单片机什么也干不了,只能空耗时等待;而在状态机方式下,将按键状态分成3种:无键等待、有键确认和等待释放,每定时10ms检查一次,在不同按键状态下执行不同功能,执行完后立即返回液晶显示程序。这样,10ms时间里有7ms以上是在执行按键判别以外的程序(这里是液晶显示程序),消抖所需的10ms也没浪费,单片机工作效率大大提高,更不用担心由于调整时间,会影响到液晶屏的显示。
四.电路制作与系统调试注意事项
1.该系统所需的I/O口较多,电路布局时,要考虑接口引插方便,最好在插针周围贴上标签。
2.焊接电阻时,需要测量引脚的通断顺序,不能主观臆断。
3. 32.768KHz的外部晶振要靠近DS1302,以便时钟脉冲更准确、稳定;DS1302的SPI接口都要有上拉电阻,时钟信号问题多半是无上拉电阻引起。
4.若调试液晶屏时,屏上没有字符显示,可调节RP2,因为若液晶的对比度太低,也会造成显示不清晰的问题。
项目2 “贪吃蛇”游戏机
一、功能说明:
蛇长为3,移动超出点阵范围或蛇头碰触到其身体则游戏结束,按reset重新开始,果子随机产生,若果子被吃掉则立即产生新的果子,蛇也会长长一截,移动速度也会相应变快,并且在果子移动、吃果子和游戏结束时蜂鸣器都会发出不同的提示音,并且在游戏结束时能够显示所得分数。
二、总体方案设计:
游戏开始时,蛇长为3,并且随机产生果子,按任意方向键蛇开始一格一格的移动,通过方向键控制蛇吃果子,若果子被吃掉则立即产生新的果子,蛇会长长一截,移动速度也会相应变快,移动过程中碰触到点阵边框或蛇头碰触到其身体则游戏结束,随即显示所得分数,然后自动回到开始界面,并且在果子移动,吃果子,游戏结束时蜂鸣器都会发出不同的提示音。整个操作过程通过4块8*8点阵组成的显示屏观看。
三、单元模块设计:
(1)程序架构
贪吃蛇的编程代码
本程序主要涉及硬件的操作:74LS154、8*8点阵,算法实现蛇的运动、吃食、死亡、放置新果子、给用户看的分数,以及不同阶段的提示音。
(2)具体实现
a.蛇的数据结构
i.蛇头标志(snake_flag),unsigned char
表3:蛇头标志
ii.蛇身长度(snake_len), unsigned char
iii.食物位置,unsigned char, 高8位为Y,低8位为X
iv.蛇身每个部分的数据(snake_body[256]), unsigned char xdata高4位为Y 位置,低4位为X位置
b.蛇行进、吃食、长大、死亡、分数显示和提示音子程序
这部分程序主要功能有:
运动:根据用户输入按键(保存在蛇头标志中)进行柔体传动。往前进一格通过去掉蛇尾巴和加长蛇头来实现。此功能用到move()函数
吃食:置没有食物标志了,蛇长大一个点阵。通过seek_food()实现。
放新食物:判断食物标志,如果没有食物,就要随机位置放食物,判断放的食物
是否和蛇身重叠,是否放到了点阵边框,若是要重放。其中随机数的产生来自时钟寄存器的数,通过C库函数rand()来实现。
死亡处理:判断是否在移动过程中碰触到点阵边框或自身,通过函数pd()和move()实现。
分数显示:通过fenshu()函数计算,蛇长长一截得一分,分数由两位数组成,最后通过调用相应预置的分数代码显示在点阵上。
提示音:当蛇在移动时、吃果子时、死亡时发出不同声音,这是通过函数buzzer()实现,主要是调节蜂鸣器的占空比,以及使用不同的延时时间。
c.键盘输入及定时器子程序
按键:此设计用到四个输入按键,控制蛇的移动方向。
定时器子程序:此设计用到两个定时器,第一个定时器设定为1ms中断方式,主要对点阵屏进行实时刷新。第二个定时器是对方向键的查询,使背景程序根据查询到的键值控制蛇的移动。两个定时器共同作用实时显示蛇的游戏的状态
d.对点阵的操作
此设计用4个8*8点阵做成一个16*16点阵显示屏,分为16行,16列,为了设计方便规定:在点亮一个点时,提供高电平的引脚为行,提供低电平的引脚为列。行由STC89C51的P1口和P3口控制,列由74LS154输出控制,而74LS154的四个输入有STC89C51的P2口的第四位控制,运行程序时,让相应的行提供高电平,相应的列提供低电平,实现特定显示。
(3)流程图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论