基于51单片机和CPLD试验开发板的设计.doc

上传人:啊飒飒 文档编号:11083244 上传时间:2021-06-28 格式:DOC 页数:28 大小:633.50KB
返回 下载 相关 举报
基于51单片机和CPLD试验开发板的设计.doc_第1页
第1页 / 共28页
基于51单片机和CPLD试验开发板的设计.doc_第2页
第2页 / 共28页
基于51单片机和CPLD试验开发板的设计.doc_第3页
第3页 / 共28页
基于51单片机和CPLD试验开发板的设计.doc_第4页
第4页 / 共28页
基于51单片机和CPLD试验开发板的设计.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《基于51单片机和CPLD试验开发板的设计.doc》由会员分享,可在线阅读,更多相关《基于51单片机和CPLD试验开发板的设计.doc(28页珍藏版)》请在三一文库上搜索。

1、基于51单片机和CPLD试验开发板的设计摘 要 阐述了设计的各部分硬件的原理和用于试验的软件设计,特别给出了RTC的设计在实验板设计中的成功应用。单片机CPLD实验板将单片机与CPLD 有机结合在一起,构建以51单片机为主,CPLD 为辅的电路系统设计方案,既可以独立用于单片机实验或CPLD实验,也可以用于单片机和CPLD综合应用的实验。尤其,集成了具有ISP功能的CPLD和ISP功能的单片机,为初学者节约了昂贵的编程器成本。关键词:51单片机 CPLD ISP 编程器 实验板ABSTRACT In this paper,it was elaborated that the various p

2、arts of the design principles of hardware and software for test design, especially given the design of the RTC board in the successful application of design. The experiment of MCU and CPLD will be combined with the MCU-CPLD board,which mainly to build 51 single-chip, CPLD secondary circuit ystem des

3、ign, and both independent experiments or CPLD for the single-chip experiments can also be MCU and CPLD for the comprehensive application of the experiment. In particular, the integrated function of the CPLD and MCU with ISP for beginners saves the cost of expensive programmers.Key words: 51MCU CPLD

4、ISP programmer experiment board 目 录 引言3 1 MiniB的目的及意义3 2 MiniB的硬件设计4 2.1单片机与 CPLD 接口电路4 2.2 USB及串行接口电路 6 2.3最小系统及外围设备接口电路8 2.3.1电源电路8 2.3.2 单片机 P1 口扩展电路8 2.3.3显示接口电路12 3 MiniB的软件设计12 3.1由AVR单片机ATmega8实现USB转串口的驱动设计和ISP(in- system-programming)的使用12 3.2 RTC 设计实例(DS1302+LCD1602+复杂按键输入+多模式蜂鸣 器发声+多任务轮循架构)

5、13 3.2.1 任务解析及人性化设计要求13 3.2.2 多任务程序架构14 3.2.3任务调度17 3.2.4任务设计18 4 调试26 致谢27 参考文献28 引言 单片机以其控制功能强体积小价格低耗电省可靠性高等特点,嵌入式应用很广1。而单片机学习门槛较高,涉及单片机软硬件知识,同时还要掌握几种软硬件工具平台,初学者要想快速入门单片机领域,往往需要一个好的硬件平台和大量易懂的实例。随着电子技术的不断发展,大规模集成电路的运用越来越普遍,用CPLD/FPGA 来开发新产品是电子技术发展必然趋势。目前各高校逐步开设了单片机课程和可编程器件设计课程,而两门课程往往是独立开设,尤其是实验,而实

6、验是检验理论正确与否的试金石,是学好两门课程的重要手段和方法。从而,切实满足初学者需要的实验板的开发成为了现实,而目前市场上针对初学者而开发的综合实验板价格高,体积大,操作烦琐,不易学习掌握。1 MiniB的目的及意义现在市场上关于单片机和 CPLD的试验开发板很多,总体上来说设计不专业, 成本价格高,功能的单一,不能用于单片机和CPLD的 综合应用试验,操作复杂利用率不高,但对于在校学生和电子爱好者这些消费者来说需求还很大。1.1目的 为单片机和CPLD初学者提供一款经济实用型实验板,解决单片机和CPLD独立学习的问题,设计过程中个人知识能力的提升,以消费者的切实需要为原则,市场的需求明显。

7、1.2意义 此款单片机加CPLD实验板是总结单片机和CPLD学习的经验,站在初学者的角度上而开发,将单片机与CPLD 有机结合在一起,构建以单片机为主,CPLD 为辅的电路系统设计方案,既可以独立用于单片机实验或CPLD实验,也可以用于单片机和CPLD综合应用的实验,打造出袖珍单片机CPLD学习板。尤其,集成了具有ISP功能的CPLD和ISP功能的单片机,为初学者节约了昂贵的编程器成本。2 MiniB的硬件设计 系统结构如图2所示,该板采用单片机+CPLD 结构,单片机为主,CPLD 为辅。与单片机相连的模块 有:P1 口接发光二极管、蜂鸣器、继电器、AD/DA,P4 口(STC 单片机 PL

8、CC-44 封装特有)接实时时钟 DS1302、红外接收器,P3 口接 232 电平转换电路和 4 个按键,单片机 P0 口和 P2 口以及 P3.6、P3.7 作为 总线使用,CPLD 直接驱动 4 位数码管,并给 LCD 提供使能信号,单片机和 CPLD 引脚分别有扩展接口, 板上集成 5V 稳压电源,可以外接 DC9V 电源,也可以从计算机 USB 口直接取 5V 电源,JTAG接口完全符合IEEE1149.1标准,提供完全的边界扫描功能2。图2 系统结构图2.1 单片机与 CPLD 接口电路 现在所有单片机厂家都有支持 ISP 的单片机,由于 STC 公司推出的 STC 系列单片机具有

9、较强的功能和较高的性价比,本设计采用 STC89C516RD+单片机作为系统的核心。单片机选 STC89C5X,该系列单片机内部集成 MAX810/STC810 专用复位电路,内置看门狗,超强抗 干扰,轻松过 2KV/4KV 快速脉冲干扰(EFT),加密性强,STC89C52RCSTC89C58RD+系列与 Intel 8051 管脚兼容,宽电压,5.5V3.4V 给复位信号后能正常工作,PQFP-44,PLCC-44 封装有 P4 口。STC89C51RC 有 3 个定时器/计数器,1280 字节大容量内部数据 RAM ,特别是该系列单片机支持 ISP 编程,开发无需高价的编程器,可实现远程

10、升级,在 ISP下载编程时可设置6或12 时钟/机器周期模式,在 6 时钟模式,比普通 51 速度快一倍。 CPLD 有两种型号可选,ALTERA 的 EPM7064 和 ATMEL 的 ATF1504。 器件的参数特性可参阅相关资料。单片机和 CPLD 都选 择 PLCC-44 脚封装,占用 PCB 面积小,更换容易。图2.1(a) 单片机与 CPLD 接口电路 Mini51 板的 CPLD 选择 Altera 公司的 EPM7064。单片机与CPLD总线接口如图2.1(a) 所示。数据总 线既单片机 P0 口同CPLD一般 IO 口相连,完成数据和低 8 位地址传送;控制总线包括单片机读写

11、控制信号 Rd(P3.7)和 Wr(P3.6),以及地址锁存信号 ALE(Address Lock Enable)和高位地址线 A15(P2.7)通过 CPLD 的全局信号引脚输入,包括全局时钟输入:INPUT/GCLK1,全局清零输入 INPUT/GCLRn,全局使能输入 INPUT/OE1,INPUT/OE2,这几个信号有专用连线与 CPLD 中每个 宏单元相连,保证信号到每个宏单元的延时相同并且延时最短。 单片机与CPLD之间可以根据需要,采用多种不同的接口方式,这里提出一种总线接口方案,采用三总线(数据、 控制、地址)结构,如图2.1(b)所示,双向数据总线完成数据传 输,单向控制总线

12、和地址总线通过 CPLD对外围对象控制。图2.1(b) 单片机与 CPLD 接口电路框图2.2 USB及串行接口电路 由AVR单片机ATmega8实现USB转串口且实现ISP(in-system-programming)功能的接口电路,如图2.2。 USB接口使用方便,逐渐成为主流,计算机经典接口串口,并口慢慢消失,于是出现USB转串口,转并口,专用IC很多,一般都很昂贵,USB方案成为最佳选择。ATmega8是AVR高档单片机中内部接口丰富、功能齐全、性能价格比最好的品种2。通过烧写USBASP固件和AVR-CDC固件分别实现两种功能:一是实现AVR和S51 ISP编程,二是实现USB转串口

13、。这里串口输出(图中为uRxD和uTxD)为TTL电平,可以直接接单片机。图2.2 由AVR单片机ATmega8实现USB转串口且实现ISP(in-system-programming)功能的接口电路ISP(in-system-programming)指系统在线可编程,是最先由 Lattice 公司提出的一种技术,是通过同步 串行方式实现对同步串行方式实现对其可编程逻辑 器件的重配置。ISP 的实现比较简单,通用做法是内 部的存储器可以由上位机的软件通过串口来进行改 写,对于单片机来讲可以通过 SPI 或其他的串行接口 接收上位机传来的数据并写入存储器中。采用 ISP 技术,ISP 技术的优势

14、是不需要编程器就可以进行单片机的实验和开发, 按照 STC 公司提供 ISP下载线的接口标准,只要在 单片机与 PC 机之间加一个电平转换电路,就可以实 现程序的在线下载,免去了调试时由于频繁地拔插对 芯片和电路板带来的损坏,这对于学生的实验教学而 言显得尤为重要。由于 ISP 技术具有的上述特点,本设计采用了 ISP 技术,其转换电路如上图。2.3 最小系统及外围设备接口电路2.3.1电源电路 该板提供两种供电方式如图2.3.1,一种从接口输入 DC 9V 电源,板上集成 7805 稳压 IC,采用贴片封 装,也可以从接口通过计算机 USB 接口取电。图中按钮为常闭开关,用来 断开电源实现冷

15、启动用。其中 D3 用来防止电源极性接反,R4 为 4.7 欧电阻,这里起保护作用,防止实验 板短路,损坏计算机 USB 接口。图2.3.1 电源电路2.3.2 单片机 P1 口扩展电路 STC89C5X 系列单片机有 P4 口,因此将 P4.0P4.2 分配给 DS1302,P4.3端口,用于连接温度传感器DS18B20 电路如图2.3.2(a)所示。DS1302是 DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和 31 字节静态 RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰 年的天数可自动调整时钟操作可通过 AM/P

16、M 指示决定采用 24 或 12 小时格式 DS1302 与单片机之间能 简单地采用同步串行的方式进行通信仅需用到三个口线 1 RES 复位 2 I/O 数据线 3 SCLK 串行时钟时钟/RAM 的读/写数据以一个字节或多达 31 个字节的字符组方式通信 DS1302 工作时功耗很低保持数据和时 钟信息时功率小于 1mW。DS1302 和处理器接口一般为 3 线制,RST(CE)复位脚,读写操作时同步时序同步用,I/O 串行数据 输入输出脚,SCLK 串行时钟输入脚。图2.3.2(a) DS18B20和DS1302接口电路单片机 P1 口带锁存功能,编程容易。Mini51 板上 P1 口被

17、LED、蜂鸣器、继电器、串行 AD/DA 复用, 除 LED 直接与 P1 相连外,其它都可以断开,只在需要用时连接。LED 电路如图2.3.2(b)所示,低电平点亮, 因为 51 系列单片机 P1 口靠内部上拉电阻输出高电平,所以一般不用 P1 口输出高电平驱动 LED,外部限 流电阻 RP 不宜太小,否则会影响到 P1 口状态,为以后 P1 口扩展留下隐患,如果用贴片发光二极管, RP甚至可以为 4.7k。图2.3.2(b) LED接口电路 该板还设计了继电器电路,通过继电器容易实现弱电到强电的开关控制,电路如图2.3.2(c) 所示,通过跳线P12控制,不用时请断开,图 中 IN4148

18、 为继电器线圈续流用二极管,特别重要。Relay为直流 5V 驱动双联动继电器,用螺栓接线柱扩展接口。图2.3.2(c) 双联动继电器接口电路 蜂鸣器电路如图 3.3.2(d)所示,通过跳线与 P10 相连,不用时可以断开。Bell为有源蜂鸣器, 接通 5V 电就会发声,单片机 P10 做开关控制,低电平开启。图 3.3.2(d) 蜂鸣器接口电路 此外P1口可以实现AD/DA电路的转换,接口电路如图 3.3.2(e)。其中,TLC1549为串行接口10位单通道A_D转换器,TLC5615为串行接口10位单通道D_A转换器,都只能实现单输单出,而未使用ADC0809和DAC0832是为了缩小PC

19、B的面积,能达到试验效果是本设计的初衷。图 3.3.2(e) AD/DA接口电路2.3.3显示接口电路 本设计有三个显示模块,分别是:LCD1602、LCD12864和 4位7段LED数码管。点阵字符型液晶显示器是专门用于显示数字、字母、图形符号及少量自定义符号的显示器3 。2.3.3 显示接口电路3 软件设计3.1 由AVR单片机ATmega8实现USB转串口的驱动设计和ISP(in-system-programming)的使用 在给ATmega8烧写固件及驱动文件时,要注意熔丝位的设置,如果设置不对,则单片机不 能正常工作。熔丝位设置如图3.1:图3.1 熔丝位设置3.2 RTC 设计实例

20、(DS1302+LCD1602+复杂按键输入+多模式蜂鸣器发声+多任务轮循架构) “实时时钟”是很多任务执行的关键参数,例如家居智能控制,室外信息发布,路灯控制等,因此熟 悉一种实时时钟芯片以及精通编程控制将是一件非常有意义的事情。这里结合 Mini51 板硬件资源,开发 出一款实用的实时时钟万年历,特别是程序设计采用了定时中断多任务轮询思想,对初学者程序设计具有 重要的参考价值。这里使用C语言编程,那么Keil应该是首选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境,强大的软件仿真调试工具也会令编程事半功倍5。3.2.1 任务解析及人性化设计要求 Mini51 板上可用硬件资源有

21、实时时钟芯片 DS1302 和备用电池,还有 LCD1602 显示屏、按键和蜂鸣。 整合这些硬件资源,设计一个具有调时、闹钟功能,还要显示美观,易使用的电子万年历。 LCD 显示要根据 LCD 每行 16 字符的特点设计,如上,可以显示年、月、日、星期、时间,还有闹钟 设定功能。显示效果设计如下:第一行显示:【2008-06-16 Week1】 第二行显示:【14:52:35 AL07:00】 三键输入:模式设定 set,加一 up,减一 down。 按键操作:长按 set 键进入时间设定模式,在进入设定模式以前,随意短按任意键,不产生任何作用, 保证时间不被随便修改;同一键短按键选择设定对象

22、;加减键长按直接退出设定模式。进入设定模式后, 长时间 10s 不按键,自动退出按键模式;以上所有的操作时钟正常走钟。声音提示:所有按键操作伴随声音提示,长短按键有不同的提示声,按键手感好。 闹钟设置:闹钟设置信息写入 DS1302 芯片的暂存 RAM,保证主电源掉电数据不丢失;闹钟精确到分钟;闹钟可禁用,并有显示提示;闹钟闹铃时,任意按键结束闹铃。3.2.2 多任务程序架构 为了程序移植性好,维护性好,易裁剪,我们有必要引入多任务编程思想,就是一个系统由多个任务 构成,各任务之间相对独立。我在这里提出一种基于定时器中断的多任务轮循程序架构,如图 3.2.2(a)所示。在 主程序中,根据任务延

23、时量判断任务是否就绪,各任务轮循占用 CPU,由任务延时量控制任务执行频度及 CPU 关照度,而任务延时量又由定时器中断控制。 关于任务实时性的理解:从人机交互角度考虑,很多任务实时性要求是相对的,例如 LCD 显示刷新, 就不需要很快的刷新频度,即使被显示的内容更新足够快,LCD 显示刷新也不需要很快,因为 LCD 显示 是给人看的,如果每秒刷新 20 次,已经足够了,这里结合数字钟显示任务,每秒 3 次就可以达到要求了; 又如按键扫描,扫描执行频度则不能太慢,太慢容易丢失有效键值,至少每秒应保持 50 次以上的执行频 度才行;同样 DS1302 实时时钟读取频度,每秒 3 次就可以了。不同

24、任务,需要不同的执行频度(CPU 关照度),如果采用传统大循环模式,各任务按一个频度运行,显然不适合本设计。这里还涉及到多种延时需要,例如按键去抖动、蜂鸣器发声等,如果采用传统 循环延时法,不仅极大浪费 CPU 资源,而且造成不同任务之间相互影响,很难找到一个平衡点,特别不利于程序维护,我们形象称这种程序为面条程序。图3.2.2(a) 定时中断的多任务轮循程序架构流程图 基于定时器中断的多任务轮循架构,各子任务必须设计成主动放弃 CPU 运行模式,子任务不能设计 成死循环流程,子任务的执行依靠主程序任务调度来实现。正因为各任务不抢占 CPU,所以程序设计不用 考虑现场保护问题,简化了程序设计。

25、本设计程序整体架构如图3.2.2(b) 所示,定时器固定节拍中断,该节拍需 满足最快任务执行频度需要,例如 50Hz,对于按键扫描程序,每秒按 50 次频度执行即可,而 LCD1602 可以按每秒 3 次频度执行,实时时钟数据读取也只需按每秒 3 次频度执行一次。图3.2.2(b) Mini51 板实时时钟流程图 任务执行频度由任务延时量 task_delayID控制,各任务延时量在定时中断中减一,直到延时量为零, 相关相关任务就绪。务调度过程就是对任务延时量检测过程,只有任务延时量为零时,CPU 从其它任务中 返回后立即执行相应的任务,由于不同任务延时量不同,从而实现不同任务具有不同的执行频

26、度而相互不受影响。这里还必须满足一个条件,就是每个任务执行一次的时间不能太长超过一次定时中断时间,否则 任务之间执行频度会有影响,对于 50Hz 的中断频率,每个任务执行时间最好不超过 20ms,既 CPU 光顾 一次任务时间要在 20ms 以内,这样就可以保证任务之间相互完全不受影响。 定时中断在这里就是心脏,依靠定时中断完成任务延时量的修改,从而实现不同任务运行频度控制。 定时器设置及初始化代码如下:#define TIME_PER_SEC 50/定义定时中断频度,由执行频度要求最快的任务确定,太高会降低CPU 运行效率,太低任务频度不好分配,一般 200Hz 以下,这里采用 50Hz。

27、#define CLOCK 22118400/定义时钟晶振,单位 Hz,与硬件一致即可void OS_Init_Timer0(void)/定时器 0 初始化uchar i;for(i=0;iMAX_TASK;i+) task_delayi=0;/任务延时量初始化TMOD = (TMOD & 0xf0) | 0x01; /定时器 0 工作在模式 1,16Bit 定时器模式TH0 = 255-CLOCK/TIME_PER_SEC/12/256; TL0 = 255-CLOCK/TIME_PER_SEC/12%256; TR0 =1;/开启定时器ET0 =1;/开启定时器中断 这里通过宏定义,把易变

28、参数在头文件中定义,这样使得程序容易修改,便于移植。void OS_Timer0(void) interrupt 1 using 2 /定时中断服务uchar i;TH0=255-CLOCK/TIME_PER_SEC/12/256; TL0=255-CLOCK/TIME_PER_SEC/12%256;/每节拍对任务延时量减 1 ,减至 0 后,任务就绪。for(i=0;i0) task_delayi-;/任务延时量减一归零,使任务就绪 在定时中断服务中,执行的任务必须很简短,重置定时器初值,把大于 0 的任务延时量减 1,该定时 中断作为心脏跳动,不断进出运行,为了节省 CPU 时间,该中断任

29、务越简单越好。3.2.3 任务调度 任务调度在主程序 main()中完成,系统初始化之后,在一个大循环中,对各任务的延时量是否为零 判断,当任务延时量为零时,表示该任务就绪,当前一个任务主动放弃 CPU 之后,马上启动就绪的新任 务。各任务之间不具有抢占功能,因此不用考虑堆栈与保护,初学者也能够完全掌握。 void main(void)sys_init(); /系统初始化,包含各子任务初始化 OS_Init_Timer0();/定时器初始化 INT_GLOBAL(1);/开总中断 while(1)/根据任务延时量是否为零选择执就绪任务执行,任务执行完成后返回再恢复设定的延时量if(task_d

30、elay0=0) task0();task_delay0=TIME_PER_SEC/50; if(task_delay1=0) task1();task_delay1=TIME_PER_SEC/20; if(task_delay2=0) task2();task_delay2=TIME_PER_SEC/01; if(task_delay3=0) task3();task_delay3=TIME_PER_SEC/02; if(task_delay4=0) task4();task_delay4=TIME_PER_SEC/03; if(task_delay5=0) task5();task_del

31、ay5=TIME_PER_SEC/04; if(task_delay6=0) task6();task_delay6=TIME_PER_SEC/05; if(task_delay7=0) task7();task_delay7=TIME_PER_SEC/06; 红色数字表示任务执行的频度,即每秒钟执行多少次。各个不同的任务,根据需要,设定不同的延时 量,延时量在定时中断中逐步减一归零,每个任务必须主动放弃 CPU,正因此,各任务执行时间最好不要 超过定时中断节拍时间单位,这里为 20ms,否则将影响其它任务运行。3.2.4任务设计 3.2.4.1 按键扫描 task0.C图3.2.4.1 按键

32、扫描任务流程图 按键输入需要要实现以下功能:按键去抖动,快速单次触发,长按单次触发,长按多次连续触发,同 一按键既有长按又有短按功能。流程图如图3.2.4.1所示。 由于该任务在一定的频度内执行,通过定义状态机记录该任务的历史运行状态,由于一次按键不能立 即确定键值,需要去抖动处理,我可以用状态机把首次按键记住,在二次按键时确认键值,同样,长短按 键也是用状态机和计数器控制,通过任务多次调用积累时间,从而实现长延时而又不占用 CPU 资源,这 就是此种定时器中断的多任务轮循架构程序设计的精髓所在。 以 50Hz 的频度扫描键盘,基本不会出现按键丢失现象。通过状态机计数器控制,去抖动,长短按键,

33、单次多次按键等各种复杂的控制,部分程序解读如下:#define KEY_PORTP3 /定义按键接口#define KEY_VALKEY_PORT | 0xc3 /Mini51 板 P3.2-P3.5 有效,有键按下则对应位为 0#define KEY00xfb /P3.2#define KEY10xf7 /P3.3#define KEY20xef /P3.4#define KEY30xdf /P3.5 以上对硬件接口进行定义,这样做的好处是当硬件接口改变后,程序容易修改,这种程序设计思想很 重要。#define KEY0_UP 0x15#define KEY1_UP 0x16#define

34、KEY2_UP 0x17#define KEY3_UP 0x18 以上定义按键弹起对应按键的关联状态,数据本身没有实际意义,只要不重复就行,由于在程序中多 处使用,如果使用常数,程序可读性差,容易出错。#define LONG_DN_TIME 50*2;/长按键时间设置,2s,其中 50 为本任务执行频度#define WAIT_DN_TIME 50*1;/长按键过度到连续任务执行时间间隔 1s#define CONU_DO_TIME 50*0.2;/长按键连续执行频度,时间间隔 0.2Svoid task0_init(void)/任务初始化,在主程序 sys_init()中调用KEY_POR

35、T = 0xff;/按键端口初始化 本任务开始时需要执行一次的任务初始化函数,在主程序 sys_init()中调用,仅仅执行一次。void task0(void)static uchar state_dn = 0;/有键按下状态机变量static uchar state_up = 0;/按键释放状态机变量static uchar key_ldn_cnt = 0;/长按键计数器,控制长按键时间uchar key_num;/键值变量key_num = KEY_VAL;/一次性读取键值if(key_num != 0xff)/判断是否有键按下switch (state_dn)/采用状态机记住前后按键变

36、化情况else /按键释放触发任务执行switch (state_up)3.2.4.2 LCD 显示 task1.C图3.2.4.2 LCD 显示刷新流程图 LCD 显示刷新流程图如图 4 所示,给 LCD 分配全局变量显示缓冲区并在独立任务中周期刷新显示, 这样做的好处是程序设计思路清晰,各任务独立,程序可读性好,缺点是占用太多内存,没有更新的数据 也不断刷新,浪费了 CPU 资源。 LCD 驱动程序在头文件 lcd1602.h 中,其他任务通过全局变量 str_buff 和 fly_space 控制该模块运行效 果。闪烁控制原理是根据闪烁控制标志位,周期替换显示内容为空白字符符。部分程序解

37、读如下:#include main.h#include lcd1602.huchar str_buff32; /定义全局显示缓冲区uchar fly_space;/定义全局闪烁位置控制变量,其它任务要用该变量需要加前缀 extern 声明void task1_init(void)/本任务初始化,在主程序中调用一次unsigned char i;lcd1602_init();for(i=0;i32;i+) str_buffi= ;fly_space = 0xff;/首先关闭闪烁标志void task1(void)static uchar fly_cnt=0;/闪烁频度控制if(fly_space

38、!=0xff)fly_cnt+;if(fly_cnt 12) fly_cnt=0; lcd_put_xyns(1,1,16,str_buff); lcd_put_xyns(1,2,16,str_buff+16);3.2.4.3 实时时钟读取 task3.C图3.2.4.3 时钟读取描任务流程图 实时时钟读取任务相对简单,由于秒钟每秒更新一次,为了实现较好的显示效果,每秒至少读 3 次以 上,所以本任务的执行频度设定为 3 次,与时间相关的控制任务,如闹钟,整点报时都放在这里。3.2.4.4 蜂鸣器发声 task4.C 蜂鸣器是 IO 口驱动的简单开关控制,Mini51 板上的蜂鸣器是采用的有源

39、蜂鸣器,接通电源就发出单 音频声音,单片机的控制只是控制其发声时长和开关频度,从而产生不同的效果,看似“接通”“延时”“断 开”如此简单的控制,如果考虑多任务模式,不用常规死循环延时(那样极大的浪费 CPU 资源,不适合 多任务模式),还要实现多种发声模式可选择,这就需要我们突破传统程序设计思路,这里还是基于定时 器中断任务轮询的思路,采用状态机控制,程序流程图如图所示,这里实现了单次短发声,单次长发声, 连续短发声,连续长发声,根据需要还可以添加更多种发声模式,这样在其它需要发声处,只要给出发声模式即可。蜂鸣发声主要用在按键响应,闹钟提示,整点报时处。图3.2.4.4 蜂鸣器多模式发声任务流

40、程图部分程序解读如下: #include main.h/*蜂鸣器模式定义*/#define BM0 0x01#define BM1 0x02#define BM2 0x11#define BM3 0x22#define ON 0#define OFF 1#define BUZZR(x) BUZZR=(x)sbit BUZZR = P10;/蜂鸣器接口定义uchar beep_modle;/发声模式选择全局变量,其它任务中通过该变量启动蜂鸣器发声void task3_init(void)beep_modle = BM0;/初始蜂鸣器模式 1,系统复位启动发声一次void task3(void)s

41、tatic uchar beep_time = 0;/蜂鸣器发声时间长度控制变量switch (beep_modle)case 0:break;case BM0:/模式 0,单次短声 BUZZR(ON);/开蜂鸣器 beep_time = BM0; beep_modle = 0;break;case BM1: /模式 1,单次长声BUZZR(ON); beep_time = BM1; beep_modle = 0; break;case BM2: /模式 2,连续短声BUZZR(ON);beep_time = BM2 & 0x0f; beep_modle = BM2+0x10; break;c

42、ase BM2+0x10: /模式 2 的 2 状态if(beep_time=0) beep_modle = BM2;break;case BM3: /模式 3,连续长声BUZZR(ON);beep_time = BM3 & 0x0f; beep_modle = BM3+0x10; break;case BM3+0x10: /模式 3 的 2 状态if(beep_time=0) beep_modle = BM3;break;default:break;if(beep_time- =0) BUZZR(OFF);/时间到,关闭蜂鸣器4 调试及总结 本设计硬件电路在控制成本的情况下,尽可能的选择了集成度高功能强大的芯片。不仅使整个系统所用的元器件减少,缩小PCB面积,更重要的是减少焊接点和

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1