基于430单片机的
关键词:RTOS 任务调度 MSP430
引 言
1 在MSP430上使用RTOS的意义
一般的观点认为,MSP430上使用RTOS是没有意义的这是可以理解的。因为MSP430的硬件资源有限(以MSP430F149为例,只有2KB RAM),任何商业操作系统都不可能移植到MSP430上。目前在MSP430上得到应用的RTOS,只有μC/OS-II,但使用μC/OS-II 必须有昂贵的C编译器,这严重地限制了其在MSP430上的使用。
正是基于以上情况,笔者在应用MSP430过程中,编写了一个基于MSP430F149的RTOS,暂定名为M430/OS。它占用RAM量少、代码短小,稍加改动就可适用于大多数其它MSP430单片机。
在MSP430单片机系统上使用M430/OS,对系统有以下意义:(本网网收集整理)
① 实现软件设计的模块化。可将不同的功能模块编制成相应的任务,由操作系统按级别调用,不必为先执行哪个功能、后执行哪个功能而费神。
② 能更合理、有效地利用CPU有限的资源。按任务的重要程度安排任务的级别,能够保证最重要的任务得以最及时执行。
③ 大大降低系统故障率。低优先级的任务发生阻塞时,高优先级任务的执行不受影响。
2 M430/OS在MSP430F149上的实现
2.1 M430/OS功能特点
M430/OS有以下特点:
① 采用占先式内核,即高优先级的任务可以从低优先级任务“抢”回CPU控制权;
② 每个任务都单独开辟一个任务栈;
③ 每个任务占十几到几百字节的任务堆栈,任务栈的大小可以根据任务中现场数据、局部变量和嵌套调用的情况估算;
④ 每个任务各分配一个优先级,不支持两个任务有相同的优先级;
⑤ 不支持信号量、邮箱功能;
⑥ 任务状态只有三种:运行(executing)、就绪(ready)、挂起(suspended);
⑦ 系统占用RAM量=((任务个数+1)×4)+6字节,不包括任务堆栈;
⑧ 代码量少,目前版本的代码共有86行汇编代码,256字节目标代码;
⑨ 理论上最多支持126个任务;
⑩ 任务锁定功能:在一段低优先级的代码中,不想让操作系统把CPU权切换到别的任务,这时可以把这代码锁定,在运行这段代码时,就不会引起任务切换;
任务唤醒功能:在一个任务中产生一个的事件来触发其它任务运行(如果被触发的任务优先级高的话,就会马上运行)。
2.2 系统函数介绍
① OS_Init:多任务初始化,进行任务栈(任务栈的结构见图1)、任务延时计数、任务状态的初始化。初始化完成后,系统直接切换到最高优先级的任务,多任务系统启动。
② OS_Time_Dly:把当前任务挂起一段指定时间让其它任务运行。
③ OS_Sched:任务调度,它先把每个任务的延时数减1,然后再找出最高优先级的就绪任务,并切换到这个就绪任务。如果无就绪任务,就切换到空闲任务。
④ OS_Free_Task:空闲任务,是一个很重要的系统任务,当所有任务都挂起时,运行此任务。它主要是对一个计数器Free_Count一直进行累加,用户可以根据这个计数器计算出CPU的利用率。
⑤ OS_Task_Lock:锁定任务调度,禁止任务调度。主要用来锁定在低优先级中的一些可重入的代码或一些重要代码。
⑥ OS_Task_Unlock:解锁任务调度,和上面的子程序功能相反。
⑦ OS_Task_Wakeup:唤醒指定优先级的任务,并产生一次任务调度,如果被唤醒任务的优先级比当前运行的任务的优先级高,任务就会切换到被唤醒的任务中,否则等待下一个调度时机。
2.3 主要功能的实现
(1)任务初始化
系统加电运行后,首先对硬件资源进行初始化,接着就要对多任务进行初始化了。主要是初始化每个任务的任务栈、每个任务的时钟滴答数和堆栈指针位置。我们把每个任务栈都初始化成图1形式。
任务栈的初始化如下程序(r11是用来初始任务堆栈的一个指针,r10是一个循环计数器):
mov.w #(栈底 + 2) , r11
clr.w Task_Tick(r10) ;清0时钟滴答数
mov.w #任务首地址 , 0(r11) ;把任务地址压入堆栈
mov.w SR , -2(r11) ;把标志寄存器放入任务栈
mov.w r11 , Task_SP(r10)
sub.w #现场所占的字节数 , Task_SP(r10) ;SP位置放
;入堆栈
初始化完任务栈之后,就把堆栈指针指向最高任务优先级任务栈的任务首地址处,再执行ret返回。这样,多任务就启动开了,程序如下:
mov.w #09feh , sp ;最高优先级的任务栈任务首地
;址位置
ret ;返回到最高优先级的任务
任务初始化的流程如图2所示。
(2)时钟节拍
时钟节拍由MSP430F149的TimerA产生。TimerA工作于上升模式,CCR0中是TimerA计数最大值。TimerA初始化代码如下:
bis.w #(TASSEL1+TACLR+MC_1),&TACTL
mov.w 2(sp),&CCR0 ;计数最大值,此值决定时钟节拍
bis.w #CCIE,&CCTL0
(3)任务调度
应用程序调用OS_init进行初始化后,直接切换到最高优先级的任务。
每个任务在运行一个循环后执行OS_ Time_Dly挂起。这是通过把该任务的延时数填到该任务的Task_ Tick中,然后再执行任务调度程序实现。
任务调度就是在定时中断时对所有任务的Task_ Tick减1,然后再按优先级高低的顺序查找Task_Tick减到0的任务,并直接跳到任务切换程序。
下面是任务切换程序(r10的内容是就绪任务的标志,由调度程序找出):
pushALL ;把当前任务现场入栈
mov.b Now_Task,r11 ;当前任务标志放r11
mov.w sp,Task_SP(r11) ;保存当前任务堆栈指针
mov.b r10,Now_Task ;就绪任务标志变为当前任务标志
mov.w Task_SP(r10),sp ;就绪任务的任务栈指针放入SP
;此时再进行堆栈操作就是对就绪任务的任务栈操作了。
popALL ;把就绪任务的`现场出栈
reti ;中断返回,返回到就绪任务
任务调度的调度时机有两种:一种是在任务挂起时,一种是定时中断。任务挂起时的任务调度一定会引起任务切换,定时中断就不一定引起任务切换了。因为,如果就绪任务是当前正在运行的任务时不会引起切换。正是如此,任务调度是RTOS中执行得最频繁的一个功能,也是最重要的一个功能,所以必须尽量缩减其代码量,尽量用可靠的调度算法来减少任务调度所占的时间。这个子程序的流程如图3所示。
(4)任务锁和其它功能的实现
任务的加锁与解锁,是为了使一些在低优先级任务的不可重入代码,或对实时性要求较高的I/O操作在执行中不产生任务切换。这项功能是通过设置一个标志位实现的。当调度程序检查到任务被锁定时,就算有就绪任务也必须等开锁之后才能切换。
如果系统突然产生一个事件要某个挂起的任务来处理,可以在事件产生的程序中调用任务唤醒。它的原理是把Task_Tick清0,然后执行一次任务调度。如果这个任务优先级较高,就直接切换到这个任务里执行。
3 总 结
拥有强大处理能力的MSP430系列单片机是一个16位的单片机,共有11种寻址方式:7种源操作数寻址、4种目的操作数寻址。它采用精简指令集结构,拥有27条内核指令、大量的模拟指令、大量的寄存器以及片内数据存储器,可以用来参加多种运算。另外,还有高效率的查表指令,在8 MHz晶体的驱动下指令周期为125 ns,处理速度较高,这些特点都保证了MSP430单片机能够编制出高效率的源程序。
目前,单片机正向CMOS化、低功耗、小体积、大容量、高性能、多品种等方向发展。其应用的意义在于,它从根本上改变了传统的控制系统设计思想,以前必须由模拟电路和数字电路实现的大部分功能,现在都可以用单片机通过软件的方法来实现,软件代替硬件逐渐成为一种潮流和趋势。数字时钟在单片机模块里比较常见,它是一种用0数字电路技术来实现时、分、秒计时的装置,与传统的机械时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命。数字时钟广泛应用于个人家庭、办公室、车站等公共场所,是人们日常生活的必需品,在数字集成电路迅速发展和石英振荡器广泛应用的背景下,其精度已经远远超过了老式的钟表,并在原来的基础上扩大了功能,比如自动报警、按时自动打铃、通断动力设备以及各种定时电器的自动启用等。因此,研究MSP430单片机的数字时钟系统有着重要的现实意义。
2 系统硬件设计
2.1 电路设计图
MSP430单片机的电路通过键盘来设置,并调节数码管上显示的日期和时间,数据通过模块的整理和传送来控制其他各个模块的正常运行,时间通过LED数码管显示器显示。系统结构如图1所示。
2.2 复位电路设计
MSP430单片机系统复位电路的功能模块一共有2个复位信号,一个是上电复位信号POR,另一个是上电清除信号PUC。如果器件上带电或者将RST/NMI引脚配置为复位模式(即RST/NMI引脚产生低电平时),器件会产生上电复位信号;当起动看门狗,向看门狗及片内FLASH写入错误的安全参数值时,会产生上电清除信号。当产生上电复位信号时,就一定会产生上电清除信号;而当产生上电清除信号时,却不会产生上电复位信号。复位电路如图2所示。
2.3 晶振电路设计
MSP430型号的芯片所有晶振接口上的旁路电容值大概都是2 p F。我们可以把旁路电容看成是晶振和单片机之间的负载电容,但是旁路电容因晶振和单片机的距离以及单片机的种类在电机焊接时方法的不同而不同。我们选择负载能力较强的晶振,是为了让晶体更好地起振。由于MSP430系列芯片是低功耗单片机,所以其I/O流过的电流比较小,在这种情况下就必须要求晶振的谐振电阻要小,如果太大,I/O便不能供应足够的电流让晶振正常工作。MSP430系列型号的芯片对晶振输出的正弦波震荡幅度也有要求,规定是必须要有0.2Vcc的输出电压。影响晶体起振的原因有以下几种:晶振ESR的大小、晶振起动后负载电容的大小、单片机电压电源的范围、PCB布线和电气隔离、电路的外部环境因素等。
在振荡回路中,晶体既不能过激励,要低于高次谐波,同时也不能欠激励,否则不易起振。晶体的选择要考虑到以下几点:谐振频点、负载电容、激励功率、温度的特性和长期稳定性。晶振电路如图3所示。
2.4 时钟模块设计
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟和31 B静态RAM,通过简单的串行接口与单片机进行通信。实时时钟电路提供年、月、日、星期、时、分、秒的信息,每个月的天数和闰年的天数可以自动调整,时钟操作可通过AM/PM指示采用12/24小时格式。DS1302与单片机之间能够采用同步串行的方式进行通信,但是需要用到3个口线:RES复位、I/O数据线、SCLK串行时钟。RST是复位/片选线,可通过输入RST来驱动高电平起动所有的数据传送。输入RST可实现有2种功能:(1)RST要接通控制逻辑,允许地址序列送入移位寄存器;(2)RST提供终止单字节或多字节数据的传输手段。当RST为高电平时,会终止此次数据的传送,同时I/O的引脚会变为高阻态。当上电运行时,在Vcc超过2.5 V之前,RST一定要保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入、输出端,而SCLK始终为输入端。图4为DS1302时钟模块电路图。
2.5 键盘模块设计
本次设计采用的是独立式键盘电路,使用单片机的I/O口线直接连接,每个按键对应一个口线,每根按键上的按键工作状态不会影响到其他I/O口线的状态。键盘的工作方式分为2种,即编程控制方式和中断控制方式。首先设置各个口线为输入模式,通过中断方式或软件查询方式获取信息,从而得知各个口线是否有键按下,如果有键按下,则口线端口为高电平,否则为低电平。在按下设置键对时间进行调整之前,可以通过“+、-”按键进行调节,如果想调整多个时间点,在对其中一个时间点设置完成后,系统可以自动跳到下一个时间点上,从而可实现对所有时间点的调整。调整结束后,返回到调整之后的时间,并显示出来。图5为按键模块电路图。
2.6 显示模块电路
我们知道,LED数码管里有8只发光二极管,分别记做a、b、c、d、e、f、g、和dp。其中,dp为小数点。每一只发光二极管都有一根电极引到外部引脚上,我们把这点叫做共阴极LED的公共端(COM)。只要在某段二极管加上高电平,该段即点亮,否则为暗。共阴极LED显示器的控制采用接地的方式,通过控制LED的“GND”引脚电平的高低来达到选通的目的,该引脚就是我们通常说的位选线。共阳极的工作原理恰好相反。
在使用LED显示器时,每段工作电流一般为2~10 m A。这样,当LED处于全亮状态时,工作电流约为15~80 m A。LED显示器的亮度除与工作的电流有关外,也与LED的具体型号有关,根据显示亮度的不同,分为普通亮度、高亮度和超高亮度。正常情况下,LED的亮度是普通亮度的10倍,在电流为1~2 m A时即可点亮。图6为显示模块电路。
3 系统软件设计
3.1 DS1302时钟流程图
程序在运行时要对DS1302进行设置,开始调整之前要先对DS1302系统进行初始化,看看当前系统的时间是否为0,确认无误后,对时间进行上传,将有效的信息存储在EPROM中,然后上传给信息管理层,信息管理层收到命令后对相应的时间进行修改,然后显示出具体的时间。其具体流程如图7所示。
3.2 LED数码管显示流程图
LED数码管在显示之前,要对串口的工作方式进行设置,并设置对应的地址指针,然后选择数段码,通过传送过来的脉冲来显示,最后显示段位的时间,接着再次选择段位,通过下一次传送显示这个段位的时间,以此类推,当所有的段位都显示出来后,取段码结束,显示时间成功,具体流程如图8所示。
4 系统调试与仿真
系统调试与仿真用到的是IAR Systems公司开发的IAR EW430软件,它是全球领先的嵌入式系统开发工具,包含带有C/C++编译器和调试器的集成开发环境、实时操作系统等许多建模工具。
首先要创建工作站,打开IAR Embedded Workbench。单击“开始”、“程序”、“IAR Systems”、“IAR Embedded Workbench for MSP430 V3”,自动创建一个新的工作站。创建并保存工程,选择工程类型和保存路径,同时输入文件名,单击“保存”按钮。创建或加载源文件,创建源程序,首先单击“FILE”、“NEW”、“FILE”,之后按下快捷键出现所需要的源程序编辑界面,编程界面标点应为英文。加载源文件,单击菜单“Project”、“Add File Test”出现需要的加载源文件界面,选择相应的界面类型,出现相应的文件,选中需要加载的文件,单击“打开”按钮,源文件加载完成后,在工程Test下出现430P1.s43和Output子目录。保存工作贴,单击“FILE”、“Save Workspace”,输入文件名Test Workspace,单击“保存”按钮,保存工作站工作完成。编译环境设置,选择需要调试的单片机型号,即目标芯片设置,再设置软件模拟仿真或FET在线仿真调试,这是仿真方式设置。仿真器接口类型设置,设置并口FET,并连接到单片机的JTAG接口。接下来是工程的编译和调试,选中源文件后双击鼠标左键,进入源程序编辑状态,连接生成目标代码。最后是调试,在程序通过连接生成目标代码后,将连接生成的目标代码通过单击“Project-Debugger”进入调试集成环境。
5 结语
通过此次研究设计,笔者学到了关于MSP430的一些基本应用,加深了对数字时钟的了解及认识。由于单片机技术已经发展成熟,我们更多的是借鉴前人的工作来完善设计,当然我们在前人的基础上前进了一小步,无论是元器件的选择还是程序的设计,都比他们做得复杂,这不是简单意义的重复,而是消化、吸收和创新。
摘要:简要介绍了MSP430单片机及利用这种单片机进行时钟系统设计的意义,进一步详细探讨了MSP430单片机时钟系统的设计原理和设计方法,包括系统的硬件设计和软件设计,最后概述了系统的调试与仿真设计。
关键词:数字时钟,MSP430单片机,数码管,调试与仿真
参考文献
[1]张毅刚.单片机原理及应用[M].高等教育出版社,2004
[2]胡大可.MSP430系列16位超低功耗单片机原理与应用[M].北京航空航天大学出版社,2000
[3]李智奇,向小平,陈晓龙,等.MSP430系列超低功耗单片机原理与系统设计[M].西安电子科技大学出版社,2008
关键词:MSP430单片机;烟雾;传感器;报警器
中图分类号:TP277 文献标识码:A 文章编号:1674-7712 (2012) 14-0009-01
一、烟雾报警器系统总体设计方案
烟雾报警器的主要功能是分析环境中的烟雾浓度并报警。它由烟雾检测模块、单片机控制电路、报警电路、LED显示器和电源五部分组成。烟雾检测模块选用MQ-2型烟雾传感器,它能将烟雾信号转化为模拟的电信号,该信号经过放大以后传递给MSP430单片机片内A/D转换器转换成数字信号,单片机对数字信号进行分析处理,看结果是否大于设定的门限值,若大于预设值则启动报警装置,发出警报信息,否则为正常状态。
二、硬件电路设计
信号采集系统采用的是MQ-2型烟雾传感器。它是一种技术先进、工作可靠度高的离子式烟雾传感器,其性能优于其它气敏电阻传感器。具有抗腐蚀能力强、高灵敏度、结构简单、功耗小、成本低、维护简便等特点。对火灾初期各类燃烧物质引燃阶段产生的不可见及可见烟雾,检测稳定可靠,且能有效地防止粉尘干扰所引起的非火灾误报。其检测电路如图1所示
MQ-2型烟雾传感器的工作原理:当火灾场所发生的烟雾进入到监测电离室,位于电离室中的检测源镅241放射a射线,使电离室内的空气电离生成正负离子。在正常的情况下,内外电离室的电流、电压都是稳定的,离子处于平衡状态;火灾发生初期释放的气溶胶亚微粒子及可见烟雾大量进入外电离室,吸附并中和正负离子,使电离电流急剧减少,破坏电离平衡状态,输出检测电信号,经后级电路处理识别后,发出报警,并向配套监控系统输出报警开关信号。
结构特征:整机电路由稳压、信号检测、信号处理、比较触发、信号输出等电路组成。
主要技术指标:工作电压:5.0±0.2V(DC);报警即时;采用声光报警方式;自动解除报警接触方式;电压信号输出;无烟时对应低电平,有烟时对应高电平的信号输出方式。
信号处理系统采用MSP430F2272型单片机。
MSP430系列单片机是由美国德州仪器公司1996年开始向市场推出的一种16位混合信号信号处理器。将多个不同功能的模拟电路、数字电路、微处理器集中在一个芯片上,使它更加符合工程设计的要求。
MSP430系列单片机具有以下特点:
(一)超低的功耗。其电源电压在1.5-6V之间,待机模式时电流小于0.1μA,适合电池供电。它具有两种不同的时钟系统,五种低功耗模式,可嵌套中断,内部模块可以关闭。
(二)强大的处理能力。采用RISC结构的16位单片机,具有硬件乘法器,DMA模块,可实现FFT、DTMF等算法。
(三)丰富的片内片外模块。这包括时钟模块由高速晶体振荡器、低速晶体振荡器、数字控制振荡器DCO及锁频环FFL、多通道高精度的ADC和DAC、电源电压监控模块SVS、片内模拟比较器、多个具有PWM功能的定时器、片内USART、液晶驱动器、硬件乘法器、看门狗定时器(WDT)、基本定时器、定时器A、定时器B、大量的I/O端口以及大容量的片内存储器等。MSP430系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。
(四)方便高效的开发环境。Flash型具有片内JTAG接口,由JTAG接口读取片内信息供设计者调试使用的方法进行开发。这种方式只需要一台PC机和一个JTAG调试器,而不需要仿真器和编程器。开发语言有汇编语言和C语言。
(五)系统工作稳定。主时钟出现故障,内部时钟会自动开启。本设计采用MSP430F2272型单片机,其主要参数如下:32KB的Flash ROM、512B片内RAM、32个I/O口、12通道10位的ADC、3个16位定时器A和3个16位定时器B。
三、系统软件的设计与实现
系统软件包括主程序、中断唤醒子程序、烟雾信号检测子程序和电池电压检测子程序。采用C语言编程,便于系统维护和功能扩展主程序流程图如图2所示,在烟雾信号检测子程序流程图如图3所示。
初始化时,MCU工作在低功耗模式LPM3。TA0每8s中断一次,MCU退出LPM3模式,调用烟雾信号检测子程序。为了避免误报警,系统只有连续3次探测到烟雾信号,才启动报警电路报警。
软件设计中应注意的问题:初始化程序时,单片机中未使用的引脚应设置为输出状态,以减小功耗;由于光电传感器及信号放大电路的上电和稳定需要一定时间,因此在采样程序中,开启A/D转换器之前要要有一段时延;灵活利用MSP430单片机的低功耗模式,以降低系统功耗。
参考文献:
[1]叶启明.实用的火灾烟雾报警器[J].家庭电子,2004,2.
[2]胡昊.基于烟雾报警器的火灾自动报警系统[J].传感器世界,2004,12.
学生姓名 学 号 所在学院 专业名称 班 级 指导教师 成 绩
四川师范大学成都学院 二O一五年十二月
基于AT89C52的电子时钟设计
摘要:
单片机在电子产品中的应用越来越广泛,特别是51系列的单片机,由于其使用方便、价格 低廉等优势,在市场上占有很大的份额。AT89C52就是51系列中的一个比较成熟的型号。本设计是一个多功能的实时时钟,带秒表、整点报时、闹铃、调整时间等功能。可按键直接设置闹铃时间。由AT89C51单片机、DS1302、LCD1602等模块组成。现代社会,时间就是金钱,时钟是每个人的必备品。本设计实现了所需功能,给大家带来方便,整体性好、人性化强、可靠性高,实现了时钟的多功能应用。
关键词:电子时钟;DS1302;LCD1602;
Abstract: Single-chip computer is finding wider and wider application in the electronic products, especially the 51 series microcontroller, due to its convenience, price is low wait for an advantage, holds a large share in the market.AT89C52 is 51 series of a more mature model.This design is a multi-function real-time clock, stopwatch, adjusting time of the hour, alarm, etc.Can be directly set alarm time button.Composed of AT89C51, DS1302 and LCD1602 module.Modern society, time is money, the clock is an essential for everyone.This design can realize the function needed, bring convenience, integral sex is good, human nature is strong, high reliability, realize the multifunctional application of clock.Keywords: electronic;clock;DS1302
II
目录
引言:..............................................................1 1.设计要求与方案....................................................1 1.1 设计要求:....................................................1 1.2 系统基本方案选择..............................................1
1.2.1单片机芯片的选择方案和论证.............................1 1.2.2 显示模块选择方案和论证.................................2 1.2.3时钟芯片的选择方案和论证...............................2
2.设计方案的选择....................................................3 2.1计时方案.....................................错误!未定义书签。2.2 单片机的基本结构.............................错误!未定义书签。2.3数字钟的构成..................................................4 2.4数字钟组成框图................................................4
2.4.1晶体振荡器电路.........................................4 2.4.2 整点报时电路...........................................4
3.系统的软件设计...................................................4 3.1程序流程图....................................................4 3.2程序的设计....................................................6 4.实验箱调试结果....................................................8 5.总结心得体会:....................................................9
III
引言:
随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子时钟采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该设计以AT89C51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
综上所述,此电子时钟具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
1.设计要求与方案
1.1 设计要求:
(1)启动时显示制作的年、月、日、制作者的学号等信息。(2)24小时计时功能(精确到秒)(3)整点报时功能。(4)秒表功能
(5)省电功能模式(未设计)1.2 系统基本方案选择
1.2.1单片机芯片的选择方案和论证 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二:
采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时 也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具
有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增
功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。相比之下,我们在实验箱实际仿真时选择采用AT89S52作为主控制系统,由于proteus库中没有AT89S52,在原理图仿真时采用了AT89C51 1.2.2 显示模块选择方案和论证 方案一:
采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高所以也不用此种作为显示.方案二:
采用LCD液晶显示屏,液晶显示屏的显示功能强大,显示多样,清晰可见 本设计采用LCD1602 1.2.3时钟芯片的选择方案和论证 方案一:
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、时、分、秒计
数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。
方案二:
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对
秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM 做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.综上各方案所述,对此次作品的方案选定: 采用AT89C52作为主控制系统,DS1302提供时钟计时,LCD1602屏幕显示.2 2为一个分频器来使用。对于芯片的使用,我们应该在了解它的各项功能的前提条件下,灵活巧妙地运用。具体的芯片资料和图片我们通过查阅相关的书籍,在网上能够很方便的查找。
经过这次电子钟作品设计与制作让我收获很多:
一、让我明白了“三个臭皮匠顶一个诸葛亮”和“团结就是力量”等名言名句的道理,让我明白只要我们团结协作没有什么困难是战胜不了的,团结让我们成功,团结让我们胜利,团结让我们的力量更大;
二、增进我和老师同学之间的友谊情感,在与老师互动学习的过程中使我体会了老师解决问题的方法与思路,让我领会了解决问题精髓,使我们学习更有活力更有信心更有自信,培养了我们的协助合作能力;
三、培养了我们的动手能力和独立解决问题的能力;
四、培养了我们的自主学习能力和利用网上这个广阔平台的学习能力;
五、使我学会了用专用的画图工具和画图软件Protel99SE画电路图的能力,通过这次作品的制作使我对Protel99SE原来的不熟悉到现在的比较熟练,画的图也比原来更合理,速度更快了;
六、锻炼了我们的焊接技术和焊接工艺,使我的焊接能力上了一个台阶;
七、培养了我管理和协调各项工作的能力,在制作的过程中也有不协调的一面但我都能一一克服了,这也使我在管理等方面能力的提高。2.3数字钟的构成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。通常使用石英晶体振荡器电路构成数字钟。2.4数字钟组成框图 2.4.1晶体振荡器电路
晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。一般输出为方波的数字式晶体振荡器电路通常有两类,一类是用TTL门电路构成;另一类是通过CMOS非门构成的电路,本次设计采用了后一种。如图(b)所示,由CMOS非门U1与晶体、电容和电阻构成晶体振荡器电路,U2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波。输出反馈电阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器。电容C1、C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能。由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。(f)带有消抖电路的校正电路
2.4.2 整点报时电路
电路应在整点前10秒钟内开始整点报时,即当时间在59分50秒到59分59秒期间时,报时电路报时控制信号。
当时间在59分50秒到59分59秒期间时,分十位、分个位和秒十位均保持不变,分别为5、9和5,因此可将分计数器十位的QC和QA、个位的QD和QA及秒计数器十位的QC和QA相与,从而产生报时控制信号。报时电路可选74HC30来构成。74HC30为8输入与非门。
3.系统的软件设计
3.1程序流程图
图-A 主程序流程图
图-B 整程序流程图
间调
时 3.2程序的设计 程序
#include
#define uchar unsigned char #define uint unsigned int #define TIME(0X10000-50000)#define FLAG 0xf4 //闹钟标志
sbit rst=P1^2;//DS sbit clk=P1^0;sbit dat=P1^1;sbit rs=P2^0;//LCD sbit rw=P2^1;sbit e=P2^2;sbit beep=P1^3;sbit mbkey=P1^4;
uchar k;uchar flag;uchar i=20,j,time1[16];uchar alarm[2],time2[15],time[3];time5[3];uchar code Day[]={31,28,31,30,31,30,31,31,30,31,30,31};//12个月的最大日期(非闰年)uchar //ms秒表进数,mbmiao.mbfe秒表的秒.分,key2num是key5的计数
key2num,ms=0,mbmiao=0,mbfen=0,mbkeynum,num;uchar code table[]=“ 32210324 GYY”;uchar code table1[]=“ 32210326 GLQ”;uchar code table4[]=“ 00:00:00 MB ”;
void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}
delay1ms(uchar time)//延时1ms { uchar i,j;for(i=0;i