完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
YSJ程序Release2.0版设计编写心得总结
第一章 显示模块 一.1. 项目概要 MCU通过专用LED驱动IC TM1629,完成饮水机LED屏(型号:KDC-XH12969A)驱动显示。关键问题是:LED不同显示部分共地址,这样导致1629刷新显示数据时会干扰到LED不需要刷新部分的显示——1629一次发送1个字节8位数据,而LED屏上8位通常是不同内容的指示灯;我们不希望同时改变8位LED,只希望改变1位、2位,甚至是任意组合位的LED亮灭。传统方案是,在刷新显示时,先查询共地址的其他LED的亮灭状态,再确认新数据,发送给1629,完成显示刷新。这样势必繁琐,且不易维护、修改,无法灵活实现不同需求的显示。 设计本显示程序的目标是:解决共地址显示混叠问题,能够灵活调用,便于移植。 file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps1.jpg 图 1 LED屏部分LED排列图 一.2. 程序流程图 file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps2.jpg 图 2 显示模块程序流程图 一.3. 设计思路一.3.1. 算法 类比AVR对寄存器的操作,通过位运算只改变特定位内容,保护不相关位不受影响。设计1629显示数据寄存器reDataTm16[16],与1629显示地址一一对应,用来存放当前地址的显示数据。收到显示数据命令后,先对数据处理,通过位运算将reDataTm16[16]与新数据data按位或,这样就保护了不相关位。 但这样还是有问题的,相关位的显示数据会出错,原因是按位或不能清零原本为1的数据,如原本寄存器内容为0x3f,想要将低4位变为0001,显然0x3f | 0x01 == 0x3f,寄存器数据没变,这就出错了。故在此之前要将寄存器相关位首先清零,在与新数据按位或。 新问题又来了,怎么能在给定显示地址的情况下,准确将相关位数据寄存器清零呢?见表 1例子。LED屏是固定的,与1629对接也是固定的,LED屏上每个LED的地址及位段、组成的图像含义也固定,故我们可以定义好LED屏上所有图像的地址,设计好数据结构即可。 一.3.2. 数据结构 表 1 数据结构说明
6个按键,要求5个短按有效,1个童锁键长按3秒有效。为了按键模块的通用性,便于移植,本设计按键有短按、长按、连发、释放4种模式,可进行不同功能设置。另外,门控开关本质也是按键:开门键值等效为按键抬起,关门键值等效为短按。 二.1. 算法 提及按键,就要注意消抖、重复响应的问题。消抖采用延时法简单实用,编程也容易,使用非常普遍;但是这个办法有些缺点:1是加上延时后,在延时期间单片机什么也没干,就在那里兜圈子耗时间,如果这时有其他事情需要处理也只好放一放,降低了运行效率。2是对一些需要较复杂按键功能的情况例如区别长按键和短按键难于实现。 那么其他的办法是有,例如中断法,不按键就不查询,直到按键触发外部中断。但是单片机通常外部中断口很少而按键较多,给应用造成不便。 状态机法: 首先了解下什么是状态机。状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。"现态"和"条件"是因,"动作"和"次态"是果。详解如下: 现态:是指当前所处的状态。 条件:当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。 次态:条件满足后要迁往的新状态。"次态"是相对于"现态"而言的,"次态"一旦被激活,就转变成新的"现态"了。 有了理论的支撑,有没有发现,状态机这种机制,其实可以运行到很多场景,不仅仅局限于按键。 本程序按键设计说明如下: 按键模式可分为短按、长按、连发、释放4种,见表 2。按键设定6种状态,见表 3。状态机图见图 2。 表 2 按键模式说明
表 3 按键状态说明
file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps3.jpg 图 3 按键状态机转移图二.2. 数据结构 按键有两个属性:①键值;②按键状态(模式)。可以将键值用8位二进制的低4位表示,可标记16个键值,一般情况已经足够;高4位编码为按键状态(模式),鉴于本程序模式只有4种,即短按、长按、连发、释放,故高四位每一位编码为一种模式,高电平表示该位模式有效。如:0x81——键值1短按;0x82——键值2短按;0x41——键值1长按。按键扫描函数设入口参数为8位指针型,做为键值传递、返回,这样方便移植,耦合性小。 二.3. 程序流程图 file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps4.png 图 4 按键状态机流程图 第三章 和弦音蜂鸣器模块和弦音蜂鸣器由MCU的两个普通I/O端口控制,一个端口PD4控制音调,另一端口PD0控制供电。开启供电一段时间t1,同时给与蜂鸣器并联的电容充电;当PD4产生周期性频率时,端口便产生了设定音调,蜂鸣器发音。音调持续时间t2不小于t1,当供电端口关闭时,蜂鸣器由电容放电提供电源,实现尾音效果。 三.1. 算法 为得到较为准确的音调,采用定时器产生频率,改变定时器计数初值,实现不同音调对应的周期中断,中断服务程序中重装初值,并翻转音调控制端口PD4电平,便实现音调的产生。音调持续时间,即节拍、供电时间用另外的定时器扫描。每10ms扫描一次,供电、节拍计数值递减,当计数值为0关闭相应端口(关供电/关定音调)。 三.2. 数据结构 和弦音涉及3个属性:音调、节拍(振荡时间)、供电时间,故定义为结构体。多个音调组合起来就构成了一段音乐,对于本程序设定有3升调、2升调等,即音调逐渐升高,时间按需设定。即要发出的一种声音是一个数组,数组元素都为上述结构体类型,事先定义好为静态常量。不同声音在头文件中定义为枚举类型,需要发声时,调用枚举型数据对应了特定声音数组,即可实现发声。此处用到枚举类型目的在于,减低程序耦合性,方便不同文件调用声音模块。 typedef enum { MONO = 0,//单音 TLOCK = 1, // 长音升和弦 END = 2, // 结束和弦 POWER_ON,// 2声调 POWER_OFF, // 2降调 } Tone_Type; //蜂鸣器声音类型 typedef struct { u8 Freq; //频率 u8 OSCtime;//振荡持续时间,最小单位为10ms u8 PWRTime;//供电持续时间,最小单位为10ms } TONE_Def; //音调结构体 const TONE_Def Tone0[] = {{FREQ_NO, 0, 0}};// 结束符 const TONE_Def mono[] = {{FREQ_2K9, 200, 10},{FREQ_NO, 0, 0}}; //单音 const TONE_Def end[] = {{FREQ_2K9, 10, 5},{FREQ_2K6, 200, 10},{FREQ_NO, 0, 0}}; //短顿 const TONE_Def poweron[] = {{FREQ_2K6, 10, 5},{FREQ_2K9, 200, 10},{FREQ_NO, 0, 0}}; const TONE_Def poweroff[] = {{FREQ_2K9, 10, 5},{FREQ_2K6, 200, 10},{FREQ_NO, 0, 0}}; const TONE_Def lock[] = {{FREQ_3K9, 200, 15},{FREQ_NO, 0, 0}}; file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps5.png 图 5 和弦音流程图第四章 PWM模块 根据ATmega8使用手册配置定时器产生PWM。利用定时器1,快速PWM模式,ICR1做为TOP值,A通道OC1A端口输出20kHzPWM波,占空比为OCR1A/TOP。定时器1初始化只需如下配置即可:设PB1端口(OC1A)为输出,通过TCCR1B设置定时器1时钟频率,设置工作模式为快速PWM,ICR1做为TOP值;写入TOP值,写入脉冲宽度OCR1A。 PWM开关控制,由定时器1的时钟输出TCCR1B即可。 第五章 定时器2 定时时基设为10ms,这样中断处理的不同功能可通过各自时间计数值自由确定周期为10*n毫秒。各个功能依据相应的时间计数值做为执行条件。流程图见 file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps6.png 图 6 定时器2中断流程图 第六章 主程序 六.1. 设计思路 主循环开始执行故障检测,之后采用状态机思想,以加热功能为主线定义状态,每个状态中处理不同事件的动作,简化冗余的判断,程序更易读。具体的状态、事件见表 4 主程序状态迁移表。 表 4 主程序状态迁移表
file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps7.png 第七章 编程遇到的问题及解决方法
附录 1. 程序框图 file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps8.png 2. 主程序待机状态键扫描流程图file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps9.png 3. 主程序加热状态键扫描流程图file:///C:UsersADMINI~1AppDataLocalTempksohtml9544wps10.png
|
|||||||||
相关推荐 |
|||||||||
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
【瑞萨RA6E2】瑞萨E2S软件安装过程,等待过程玩下97_e2 studio_ZGZZ
234 浏览 0 评论
514 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
826 浏览 0 评论
1366 浏览 2 评论
814 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16910 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 23:48 , Processed in 0.467037 second(s), Total 31, Slave 24 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2281