单片机程序设计(共12篇)
单片机程序设计 篇1
用单片机开发出的电子产品具有低功耗、小体积、大容量、高性能、高智能和低价格等特点。
第一, 大胆买一台“带有仿真功能的编程学习机”。现在的许多编程器功能齐全种类丰富, 厂家还附带有非常详细的电路原理图和丰富的编程实例及学习资料, 为我们提供了一个学习和动手的好机会, 这样学习起来更见成效。
第二, 熟悉单片机的结构与原理, 设计好硬件电路。单片机的内部结构与原理还是比较复杂的, 很难在短时间内掌握, 但也不是每个硬件系统都将单片机的所有功能全用上, 往往只用了其中的部分功能。所以, 这里讲的熟悉单片机结构与原理是针对设计要求来讲的, 对那些在本次设计中没用上的部分结构与原理可暂且不理。只要我们不断地进行单片机程序设计与开发, 单片机的各项功能自会用上, 渐渐地就掌握了单片机的程序设计与开发。以前, 笔者在学习单片机时, 总以为要将单片机的内部结构与原理全部掌握了以后才能进行程序编写, 就弄来一本书从第一页开始一页一页地往后面看, 可越往后面看就越看不懂, 每次都是半途而费。
第三, 根据设计好的硬件电路, 分析电路原理, 画出程序流程图。分析电路原理, 是对硬件电路进行一些必要的说明和分析电路的工作步骤, 第一步做什么, 第二步做什么, 然后做什么, 最后做什么。画程序流程图, 是一种用图形来表示电路的工作原理与步骤, 是程序结构的体现, 也是程序的编写过程, 它能使我们尽快地掌握程序的编写技巧。
第四, 对画好的程序流程图用相应的指令实现, 即程序编写。这里的关键是指令系统, 刚开始编程时, 一是记不住指令二是不会用。是不是先去背指令系统呢?肯定不是的, 像MCS-51 系列就有111 条指令, 要想将它们全部记住也并非一件容易之事, 这里我们只要对着程序流程图从111 条指令表中找到相应的那些指令进行熟悉与编写。在编写程序过程中要注意的是不要自创指令, 只能是在111 条指令里面去选, 绝不能创造出112条指令来。如:要将片内RAM中R1的内容送到R2, 不能写为“MOV R2, R1”, 而要用两条指令来实现“MOV A, R1”和“MOV R2, A”。
第五, 对已编好的程序进行调试、运行、生成目标文件与程序固化。下面笔者就以设计“一个简单实用的水塔水位控制器”为例来单片机的系统设计过程。
(1) 硬件电路设计。
对于水塔水位的控制, 一是检测水塔的底部是否有水;二是检测水塔的顶部看水塔里的水是否已满, 来决定抽水电机的启动与停止。这样一来整个控制系统就只需要两个输入信号和一个输出信号, 即3 根I/O 线就可以了。由于系统比较简单, 因此, 采用了最小的51 单片机“2051”, 这样设计出的电路体积更小成本更低。当然, 读者朋友们还可以设计出更小的系统, 如:PIC 系列最小的CPU 只有8 个脚。总之, 硬件电路的设计原则是体积尽可能的小, 成本尽可能的低, 性能尽可能的稳定。
在设计硬件电路时, 先是找到2051 的基本结构图和引脚功能, 并熟悉它的结构与原理, 在这里只要求熟悉它的基本输入/ 输出功能、上电复位功能、外部时钟电路;在电路的布局上要求均匀分布, 所以CPU 两边都设计有电路。
(2) 分析电路原理。
C1 和R1 组成上电复位电路, C2和C3 以及Y1 组成外部时钟电路, R2、Q1、D1 和K1组成输出控制电路;由CPU 的P1.6 输出的电平来控制抽水电机MG 的启动与停止, 当P1.6 输出低电平“0”时启动电机, 输出高电平“1”时停止电机;水塔里的A、B 分别为下限水位检测器和上限水位检测器, 检测信号分别送到CPU 的P3.5 和P3.4, 若A、B 被水淹没则输入信号为“0”, 即为低电平, 否则为“1”, 即为高电平。电路的工作步骤为:电路接通电源后, CPU 复位, 所有端口都输出高电平“1”, 这时电机不动。然后去检查下限水位检测器A, 若水塔没水, 则启动电机开始抽水, 否则电机不启动。再检查上限水位检测器B, 若水已满, 则停止电机, 否则继续抽水。最后又去检查下限水位检测器A 不断地重复上述过程, 以保持水塔里时刻有水。
(3) 程序编写。
在根据程序流程图编写程序时一定要注意箭头方向, “指下”的箭头无须用指令来实现, CPU 能自动执行;“两边指出”的箭头用控制转移指令实现;被箭头所指应在该处指令前面加上“标号”;有箭头分支的地方须单独用一条指令来实现;“停止抽水”与“结束”之间, 须用一条指令。这样程序编写如下:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:JNB P3.5, L2 ;若水塔有水则P3.5 为0, 程序跳到L2 处去执行L1:CLR P1.6 ;使P1.6 为0, 开始抽水JB P3.4, L1 ;若P 3.4 为1, 说明水没满, 程序跳到L1 继续抽水L2:SETB P1.6 ;使P1.6 为1, 停止抽水SJMP MAIN ;水满后返回, 监视下限水位检测器。
(4) 程序调试与运行。
利用仿真软件和仿真器, 对程序进行调试和运行, 这些在专业书刊上介绍很多, 在此不再详述。
摘要:利用单片CPU2051对水塔水位的控制原理, 站在初学者的角度, 从硬件电路设计开始, 最后至程序编写等单片机系统设计与开发全过程进行独特的研究与分析, 从而走进单片机程序设计世界大门。
关键词:单片机,程序设计,流程图,水位控制
参考文献
[1]王斌.自制智能型红外学习遥控器[N].电子报, 2005.
[2]叶启明.智能型红外遥控器设计[N].电子报, 2001.
单片机程序设计 篇2
1、实验内容
用P1.0、P1.1控制流水灯的变化
P1.0、P1.1=00灯全灭
P1.0、P1.1=01单灯亮左循环
P1.0、P1.1=10单灯亮右循环
P1.0、P1.1=11双灯亮左循环
灯亮的时时为1秒。用软件延时实现。*用T0定时选作。
2、实验步骤
1)打开PV32编程序。汇编正确进入调试界面。否则修改程序重新汇编直到通过。
2)打开P0、P1窗口给
3)调试灯全灭、单灯亮左循环、单灯亮右循环、双灯亮左循环程序观察并记禄寄存器、内存的变化。判断程序是否正确。若发现问题重返编辑界面,修改、存盘、汇编。返回调试界面调试通过。
4)设断点调试主程序观察并记禄寄存器、内存的变化。判断程序是否正确。若发现问题重返编辑界面,修改、存盘、汇编。返回调试界面调试通过。
首先将P1.0、P1.1置00观察P2窗口灯是否全灭,然后改变P1.0、1.1的设置观察流水灯运行是否正确。
5)流水灯运行中改变P1.0、1.1看流灯能否随之变化。若执行正确程序通过。否则在每个流水子程序中加入读P1口散转子程序。
3.实验报告
1.写出主程序流程图、子程序流程图、程序清单
2.根据记渌数据给程序加注解
单片机电子琴设计 篇3
关键词:单片机;电子琴;音阶
本文设计的产品为简易电子琴,基本要求为能够发出中音Do、Re、Mi、Fa、So、La、Si和高音Do八个音阶皆可。
一、硬件电路
本设计要用的元器件有芯片AT89C51、音频集成功放LM386、蜂鸣器(喇叭)和按键。如图所示:
■
单片机P2口为接口,接有一组共8个按键。这8个按键是S1∽S8,通过排阻,分别按顺序与单片机的P2口P2.0∽P2.7相接,按键另一端接地,若按下S1,则发中音Do,若按下S2,则发中音Re,以此类推。
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,被广泛应用于录音机和收音机之中。电路中由P1.0口控制一个LM386功率放大器,经功率放大器控制发声器件蜂鸣器(喇叭)。当P1.0口输出为低电平时,功率放大器导通,蜂鸣器(喇叭)通电;当P1.0口输出为高电平时,功率放大器截止,蜂鸣器(喇叭)断电。通过连续不断周期性地改变P1.0口的高、低电平,就会产生一定频率的矩形波,蜂鸣器(喇叭)就能发出一定频率的声音。
单片机内部由大量的时序电路构成,没有时钟脉冲即“脉搏”的跳动,单片机的各个部分将无法工作。所以在单片机的内部集成有振荡电路,只需将晶振和电容接到单片机的18(XTAL2)、19(XTAL2)脚,一个完整的振荡器即“心脏”就构成了,只要接通电源,这个心脏的脉搏就会按固定频率开始跳动。晶振的频率决定了单片机的快慢,本次设计中晶振的频率是12MHz。
单片机9脚RST端口接入一个复位电路,当此引脚连接高电平超过2个机器周期(1个机器周期包含12个时钟脉冲),即可产生复位的动作。以12MHz的时钟脉冲为例,每个时钟脉冲为1/12μs,2个机器周期为2μs,因此,我们可在第9脚上连接一个可让该引脚上产生一个2μs以上的高电平脉冲,即可产生复位的动作。
本次设计中我们可以预留一个口作为扩展功能,如播放一段音乐。
二、音阶的产生
音阶就是人们通常唱出的Do、Re、Mi、Fa、So、La、Si,它是7个频率之间满足某种数学关系由低到高排列的自然音,一旦确定某一个音比如Do的频率,其他音的频率也就确定了。音调是指声音的高低,由声音的频率来决定,确定某一个音Do的频率,就确定了音调。通过改变单片机输出脉冲高低电平的保持时间和频率,就可以得到音阶和调节不同的音调。本次设计中单片机的晶振为12MHz,则机器周期T为1μs,选择工作方式1,利用公式(216-X)T=定时时间(X为TH0,TL0的定时初值)。例如:频率为523Hz,其周期T=1/523=1912μs,因此只要令定数器定时1912μs/2=956μs,每到定时956μs时就将I/O反相,就可得到中音DO(523Hz)。那么,可以根据不同的频率计算出应该赋给定时器的计算初值。如下表:
电子琴音符与单片机频率的关系
■
三、软件设计思路
在主程序中,首先定时器T0初始化,然后关闭定时器T0,通过扫描键盘进行按键的识别。读P2口的状态,若有按键按下,则延时10ms去抖动,再读P2口的状态判断是几号按键按下,并跳转到相应的程序,查表得相应按键的定时初值,启动定时器T0将不同按键所对应的频率信号发送到集成运放中放大,最后送给喇叭发出对应的音阶的声音。程序随后继续扫描按键,若按键保持按下状态,则定时器T0继续保持工作状态,直到按键松开,定时器T0停止工作,返回初始状态,等待下一次的扫描按键结果。当程序中断时,程序保存现场,并重装TH0、TL0的初值,然后将P1.0口取反,重新送入P1.0,最后中断返回。按照此方法将设计的电子琴做成实物,能够实现弹奏音乐的功能。
摘 要:电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。本文设计的单片机电子琴,利用单片机强大的控制和灵活的编程功能,产生不同频率,获得所需要的音阶,可演奏出美妙的音乐。
关键词:单片机;电子琴;音阶
本文设计的产品为简易电子琴,基本要求为能够发出中音Do、Re、Mi、Fa、So、La、Si和高音Do八个音阶皆可。
一、硬件电路
本设计要用的元器件有芯片AT89C51、音频集成功放LM386、蜂鸣器(喇叭)和按键。如图所示:
■
单片机P2口为接口,接有一组共8个按键。这8个按键是S1∽S8,通过排阻,分别按顺序与单片机的P2口P2.0∽P2.7相接,按键另一端接地,若按下S1,则发中音Do,若按下S2,则发中音Re,以此类推。
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,被广泛应用于录音机和收音机之中。电路中由P1.0口控制一个LM386功率放大器,经功率放大器控制发声器件蜂鸣器(喇叭)。当P1.0口输出为低电平时,功率放大器导通,蜂鸣器(喇叭)通电;当P1.0口输出为高电平时,功率放大器截止,蜂鸣器(喇叭)断电。通过连续不断周期性地改变P1.0口的高、低电平,就会产生一定频率的矩形波,蜂鸣器(喇叭)就能发出一定频率的声音。
单片机内部由大量的时序电路构成,没有时钟脉冲即“脉搏”的跳动,单片机的各个部分将无法工作。所以在单片机的内部集成有振荡电路,只需将晶振和电容接到单片机的18(XTAL2)、19(XTAL2)脚,一个完整的振荡器即“心脏”就构成了,只要接通电源,这个心脏的脉搏就会按固定频率开始跳动。晶振的频率决定了单片机的快慢,本次设计中晶振的频率是12MHz。
单片机9脚RST端口接入一个复位电路,当此引脚连接高电平超过2个机器周期(1个机器周期包含12个时钟脉冲),即可产生复位的动作。以12MHz的时钟脉冲为例,每个时钟脉冲为1/12μs,2个机器周期为2μs,因此,我们可在第9脚上连接一个可让该引脚上产生一个2μs以上的高电平脉冲,即可产生复位的动作。
本次设计中我们可以预留一个口作为扩展功能,如播放一段音乐。
二、音阶的产生
音阶就是人们通常唱出的Do、Re、Mi、Fa、So、La、Si,它是7个频率之间满足某种数学关系由低到高排列的自然音,一旦确定某一个音比如Do的频率,其他音的频率也就确定了。音调是指声音的高低,由声音的频率来决定,确定某一个音Do的频率,就确定了音调。通过改变单片机输出脉冲高低电平的保持时间和频率,就可以得到音阶和调节不同的音调。本次设计中单片机的晶振为12MHz,则机器周期T为1μs,选择工作方式1,利用公式(216-X)T=定时时间(X为TH0,TL0的定时初值)。例如:频率为523Hz,其周期T=1/523=1912μs,因此只要令定数器定时1912μs/2=956μs,每到定时956μs时就将I/O反相,就可得到中音DO(523Hz)。那么,可以根据不同的频率计算出应该赋给定时器的计算初值。如下表:
电子琴音符与单片机频率的关系
■
三、软件设计思路
在主程序中,首先定时器T0初始化,然后关闭定时器T0,通过扫描键盘进行按键的识别。读P2口的状态,若有按键按下,则延时10ms去抖动,再读P2口的状态判断是几号按键按下,并跳转到相应的程序,查表得相应按键的定时初值,启动定时器T0将不同按键所对应的频率信号发送到集成运放中放大,最后送给喇叭发出对应的音阶的声音。程序随后继续扫描按键,若按键保持按下状态,则定时器T0继续保持工作状态,直到按键松开,定时器T0停止工作,返回初始状态,等待下一次的扫描按键结果。当程序中断时,程序保存现场,并重装TH0、TL0的初值,然后将P1.0口取反,重新送入P1.0,最后中断返回。按照此方法将设计的电子琴做成实物,能够实现弹奏音乐的功能。
摘 要:电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。本文设计的单片机电子琴,利用单片机强大的控制和灵活的编程功能,产生不同频率,获得所需要的音阶,可演奏出美妙的音乐。
关键词:单片机;电子琴;音阶
本文设计的产品为简易电子琴,基本要求为能够发出中音Do、Re、Mi、Fa、So、La、Si和高音Do八个音阶皆可。
一、硬件电路
本设计要用的元器件有芯片AT89C51、音频集成功放LM386、蜂鸣器(喇叭)和按键。如图所示:
■
单片机P2口为接口,接有一组共8个按键。这8个按键是S1∽S8,通过排阻,分别按顺序与单片机的P2口P2.0∽P2.7相接,按键另一端接地,若按下S1,则发中音Do,若按下S2,则发中音Re,以此类推。
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,被广泛应用于录音机和收音机之中。电路中由P1.0口控制一个LM386功率放大器,经功率放大器控制发声器件蜂鸣器(喇叭)。当P1.0口输出为低电平时,功率放大器导通,蜂鸣器(喇叭)通电;当P1.0口输出为高电平时,功率放大器截止,蜂鸣器(喇叭)断电。通过连续不断周期性地改变P1.0口的高、低电平,就会产生一定频率的矩形波,蜂鸣器(喇叭)就能发出一定频率的声音。
单片机内部由大量的时序电路构成,没有时钟脉冲即“脉搏”的跳动,单片机的各个部分将无法工作。所以在单片机的内部集成有振荡电路,只需将晶振和电容接到单片机的18(XTAL2)、19(XTAL2)脚,一个完整的振荡器即“心脏”就构成了,只要接通电源,这个心脏的脉搏就会按固定频率开始跳动。晶振的频率决定了单片机的快慢,本次设计中晶振的频率是12MHz。
单片机9脚RST端口接入一个复位电路,当此引脚连接高电平超过2个机器周期(1个机器周期包含12个时钟脉冲),即可产生复位的动作。以12MHz的时钟脉冲为例,每个时钟脉冲为1/12μs,2个机器周期为2μs,因此,我们可在第9脚上连接一个可让该引脚上产生一个2μs以上的高电平脉冲,即可产生复位的动作。
本次设计中我们可以预留一个口作为扩展功能,如播放一段音乐。
二、音阶的产生
音阶就是人们通常唱出的Do、Re、Mi、Fa、So、La、Si,它是7个频率之间满足某种数学关系由低到高排列的自然音,一旦确定某一个音比如Do的频率,其他音的频率也就确定了。音调是指声音的高低,由声音的频率来决定,确定某一个音Do的频率,就确定了音调。通过改变单片机输出脉冲高低电平的保持时间和频率,就可以得到音阶和调节不同的音调。本次设计中单片机的晶振为12MHz,则机器周期T为1μs,选择工作方式1,利用公式(216-X)T=定时时间(X为TH0,TL0的定时初值)。例如:频率为523Hz,其周期T=1/523=1912μs,因此只要令定数器定时1912μs/2=956μs,每到定时956μs时就将I/O反相,就可得到中音DO(523Hz)。那么,可以根据不同的频率计算出应该赋给定时器的计算初值。如下表:
电子琴音符与单片机频率的关系
■
三、软件设计思路
单片机用键盘显示程序设计 篇4
电路中单片机采用的是51系列 (AT89C51) , 数码管采用四位共阴极数码管, 键盘采用的是独立式键盘[2]。
AT89C51外接晶振大小是11.059MHZ, AT89C51有四个接口P0、P1、P2、P3。P0在FIASH编程时, P0口作为原码输入口, 当FIASH进行校验时, P0输出原码, 此时P0外部必须被拉高。P1、P2、P3口均是内部提供上拉电阻的8位双向I/O口。本次设计用的是P0、P1、P2口。当P0口做为输出接口用时, 一般要接上拉电阻, 其阻值大小可以是10K。经仿真可知道AT89C51接口悬空时输出高电平, 因此仿真图中可以不接上拉电阻。本次设计中用P0.4、P0.5、P0.6、P0.7做为数码管位选, 当输出低电平时, 选中数码管;P2.3、P2.4、P2.5、P2.6、P2.7做为输入口分别与按键相连, 当按键按下时输入低电平;P0.0~P0.7做为数码管段选, 数码管是共阴极的, 因此高电平时数码管各段点亮。
独立式键盘共设计五个按键, 分别是增加键、移位键、修改键、确认键、显示键。按键可以实现的具体功能现举例说明:现有一组数值:
A、B、C、D四类参数 (或称第一级参数) , 每级参数又包含三个小类 (称为第二级参数) 。开机时默认显示第一级参数A的数值大小。若此时想要显示A2的数值, 只需按一次确认键再连续按两次右移键就可以显示A2的值。若要显示C的值, 只需按一次确认键在连续按两次增加键即可显示, 在此基础上要想显示C2的值, 需再按一次确认键在连续按两次右移键就可以显示C2的数值。
假设现在要修改参数D2的数值, D2原来为2134, 现在要修改为1456。操作:开机显示A的值, 按一次确认键再连续按三次增加键然后按两次右移键便可以显示D2的值。按一次修改键, D2的值便可以修改, 首先修改位是2000的最高位即2所在的位。按一次增加键即可加1, 当加到9时再按两次此时的值就变为1, 此时按一次右移键, 修改位为1所在位, 连续按三次增加键数值大小变改为4, 同样的道理可以将后面的两位数值分别改为5和6, 此时按确认键此值就可以保存, 再按显示键, 四位共阴极数码管就可以显示1456。
2 软件设计
上电后, 首先进行初始化, 中断和输入端口的初始化, 输入端口初始化为高电平;然后执行数码管显示, 并利用中断调用按键处理程序。
数码管显示, 主要是将要显示的数值转换为代码值。假设要显示的数值是一个四位数, 首先对最高位数查表将代码值赋给P0.7, 然后P0.7端口置低延迟1ms再置高, 以此类推, 将最低位数的代码值赋给P0.4。
P2.3-P2.7作为输入口与按键相连, 利用中断扫描键盘, 当其中某一端口为低电平时说明与该端口相连的按键按下了。不同的端口, 按键的键值不同。与P2.3-P2.7口相连的按键按下时的键值分别为1、2、3、4、5。
当键值为3时执行显示程序。显示的是哪一级参数有标志位决定。当flag3=1时显示第一级参数, 当flag4=1时显示第二级参数。
当键值为4时即确认修改时, 修改标志位置1, 参数要修改的位为参数最高位。
当键值为5时即确认时, 确认标志位置1。
当键值为1时, 有两种功能。一是类别参数选择, 二是修改参数值。执行哪种操作需要判断标志位。当前一键值为5时, 即在确认的情况下, 则在第一级参数中进行选择。若前一键值为4时, 即在修改的情况下, 则执行参数修改。在修改时, 要先判断修改的是哪一级参数, 然后判断修改的是参数的哪一位, 不同的位增加的值是不同的, 例如最高位加1000, 而最低位是加1。
当键值为2时, 有两种功能。一是同一级间参数选择, 二是确定要修改是参数的哪一位。执行哪种操作需要判断标志位。当前一键值为5时, 即在确认的情况下, 则在同一级参数中进行选择。若前一键值为4时, 即在修改的情况下, 则执行参数修改。
当修改位置1时, 默认修改位为参数的最高位, 每按一次右移键, 修改位降一级, 即从最高位将到最低位 (千位到个位) 。移位时没有左移功能, 因此当移到最右面 (数值的最低位) 时再移位会回到最左边的那一位即数值的最高位。
3 仿真
由于是仿真环境, 仿真电路图与实际的电路图有一定的区别。此次仿真是在Proteus7.4的环境中进行的, 此时AT89C51可以不接外部晶振, P0口可以直接作为输出口用, 不必接上拉电阻。但是这在实际的电路中是绝对不可行的。因此在硬件仿真图中对这些也进行了标注, 外接了11.059M的晶振, P0口接10K的上拉电阻。
4 结语
单片机课程设计电子钟设计 篇5
目录
一、摘要
二、设计任务
三、基本原理
数码管显示可以用静态显示或动态显示方法。静态显示需要数据锁存器等硬件,接口复杂,时钟显示用四个数码管。动态显示相对简单,但需动态扫描,扫描频率要大于人视觉暂留频率,信息看起来才稳定。译码方式可分为软件译码和硬件译码,软件译码通过译码程序查的显示信息的字段码;硬件译码通过硬件译码器得到显示信息的字段码,实际中通常采用软件译码。
在具体处理时,定时器计数器采用中断方式工作,对时钟的形成在中断服务程序中实现。在主程序中只需对定时器计数器初始化、调用显示子程序和控制子程序。另外,为了使用便,设计了简单的按键,可以通过按键实现时、分的调整,这样在主程序中就加入了按键设置子程序。
四、编程算法思路
五、程序流程图
六、硬件单元设计
七、软件单元设计
八、调试结果分析
九、设计总结及心得体会
十、参考文献
一设计任务
1、基本任务:利用定时器/计数器中断和静态显示或动态显示,实现电子时钟的时分秒精确走时和校准
。时间显示用四个数码管分别显示时、分、秒用点表示,在时和分的中间闪动,时间显示格式(18:49)
时间校准用2个键实现:一个键K1作移位选择(选中要修改的位,选中的位用闪烁指示),一个键K2做加1(对选中的位进行加1修改)。
2、功能增强型任务:在基本任务的基础上加上日历功能、准时报时功能和跑表功能
(1)日历功能:能实现时、分、秒和年、月、日计时,增加1个按键控制分3屏例如显开始的第1屏默认显示“时、分、秒”四位+秒点,按下K3键显示“月和日”四位,再按下课K3键显示“年份”四位,再按下K3键显示“时、分、秒”,依次类推。程序要能处理闰年、闰月功能。
(2)准点报时功能:可以在增加一个按键K4设计具有闹钟功能,实现定点报时。具体操作是:按下
K4键,进入闹钟设置功能,再通过K1、K2键来完成定点报警时间的设置。
(3)跑表功能:再增加一个按键K5设计跑表功能,实现启动毫秒计数,相当与田径运动比赛的跑
表工作。
三基本原理
软件时钟时利用单片机内部的定时器/计数器来实现的,它的过程如下:首先定单片机内部的一个定时器/计数器工作于定时方式,对机器周期形成基准时间,然后用另一个定时器/计数器或软件计数的方法对基准时间计数形成秒,秒计60次形成分,分计60次形成小时,小时计24次则计满一天。然后通过数码管把它们的内容在相应位置显示出来即可。
四编程算法思路
1、主程序的设计:串行口工作方式0,定时器/计数器1工作在方式1进行初始化,然后通过循环(调用显示子程序)等待定时中断的到来。
2、按键的控制:KEY1控制时的调节,kEY2控制分的调节,KEY3控制时、分定型
3、中断服务程序的设计:中断服务程序主要功能是实现时、分、秒的计时处理。
4、时、分、秒计时的实现:秒计时时采用中断方式进行溢出次数的累计得到的。从秒到分,从分到时可通过软件的累加和比较到位方法来实现。要求每满1秒,则“秒”单元中的内容加1;“秒”单元每满60,则“秒”单元清0,同时“分”单元中的内容加1;“分”单元每满60,则“分”单元清0,同时“时”单元加1。“时”单元每满24,则将“时”单元清0。
5、显示子程序:采用数码管静态显示来显示时钟的走动
6,延时子程序:用来实现按键操控延时和实现整点12时报时
五程序流程图
六硬件单元设计
1、电路总设计图
2、AT89C51芯片
七软件单元设计
1、资源分配:定时器T1,P1.6为调整时钟,P1.5为调整分钟,P1.4为控制调整
30H秒显示单元,31H分显示单元,32H时显示单元,08H放分调整标
志,09H放时调整标志,0AH放闪烁标志
2、程序清单(加注释)
八调试结果分析
在实验操作过程中,将所写好的程序打入计算机内,通过编译检查其是否有错误,如有错误将其改正,直至无误后下载仿真器,实现运行。观察实验箱上的数码管显示,判断其是否为所需结果,如果与所要求的有差别,需继续调试,重新修改程序,检查硬件设施不断地调试,不断地检查直至得到所要的结果。在调试过程中,开始运行时能够实现时钟的显示,但是无法实现其闪烁功能,后经不断调试修改及同学的帮助最终实现该功能,能够达到时钟显示调节的基本要求,还可以实现整点报时。但在增加其功能显示年月时又出现一定的问题,未能实现该功能,程序存在一定的不足性,需继续完善,实现更多的功能
九设计总结及心得体会
经过两天的单片机课程设计,终于完成了我的电子时钟的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,毕竟这次设计把一些基本功能都做了出来,只是一些增强型功能未能实现。
在本次设计的过程中,我发现很多的问题,虽然以前还做过一些实验但这次设计真的让我长进了很多单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,要有通篇的全局思想考虑问题。在操作的过程中,出现许多错误,都是在连接处不能够上下连贯正确运行,还需继续努力。有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在课程设计中的最大收获,同时,要把所学只是灵活应用才能真正领悟其中的意义,加深对它的理解与掌握。还有,通过此次的操作也使我的实践操作能力得到了进一步的提高。
十参考文献
【1】张毅刚,彭喜元,董继成。单片机原理及应用。北京:高等教育出版社,2003
【2】周航慈。单片机应用程序设计技术(修订版)。北京:北京航空航天大学出版社,2002
【3】万光毅等。单片机实验与实践教程。北京:北京航空航天大学出版社,2003
【4】何立民,I2C总线应用系统设计。北京:北京航空航天大学出版社,2002
基于单片机的电子时钟设计概述 篇6
前言
目前,单片机在各种领域都得到了广泛的认可和应用,尤其是在智能仪表中的应用更是家常便饭,即引起了單片机的产品变革,又在很大程度上促进了设计理念的革新。智能仪表是智能系统的重要组成部分之一,其正常工作的关键在于单片机的设计。如今,设计单片机系统逐渐成为电子设计专家和设计爱好者的关注焦点。
一、电子时钟的功能
在设计电子时钟时,对电子时钟功能的最基本要求是电子时钟必须具备运行和调整两种状态:第一,运行状态。在此种状态下,需要设计K1、K2两个有效按键,在按下K1键时,电子时钟可以进入调整状态;第二,调整状态。在这种状态下,需要设计K3、K4两个有效按键,当按K1键进入调整状态后按下K3键能够对电子时钟的数字位置进行调节,按下K4将会调节闹钟开关并分别对时分秒数字加一,继续按K3则离开调节状态而进入运行状态。
1.1电子时钟的计时方案
通过计数器中断定时或AT89C51单片机内部定时,合理结合软件延时来对时分秒进行计时。这种电子时钟的设计方案能够节省硬件成本,还能通过定时提醒读者需要做的重要事情。其设计思路不仅可以刺激计数器在程序设计、使用及中断等方面的提高,还能加深对单片机指令系统的掌握,进而实现单片机技术的使用和推广。虽然单片机相比现在的嵌入式等会略逊一筹,但其目前还是应用最广泛的设计芯片。
1.2电子时钟设计原理
电子时钟的主要构成部件是译码显示器、校时电路、时分秒计数器、报时电路与振荡器,主电路系统包括时分秒计数器、校时电路、显示器、整点报时电路、译码器和秒信号发生器。其中,秒信号发生器作为整个系统时基信号,可以直接决定计时系统精确度,通常借助分频器和石英晶体振荡器的相互作用来完成。把标准秒信号输入60进制的“秒计数器”,因而每相隔60秒就会发出“分脉冲”信号,这个信号即为“分计数器”时钟脉冲。“时计数器”应该采用24进制的计时器,这样就能进行每天24小时的计时。电子时钟通常由1601液晶、89C52组成,其驱动电路为晶振电路。电路中的唯一控制键K1具有中断电路的功能,按下K1键后再按设置键K3能够对时分秒、闹钟开关和时分秒位置进行设定,继续按调节键K4可以对时分秒、闹钟开关、闹钟设定的时分秒进行加一调节[1]。
二、电子时钟的硬件与软件设计
2.1电子时钟的硬件设计
电子时钟的核心部分采用51系列单片机,硬件电路包括按键电路、AT89C51单片机、LED显示电路、音乐报时电路。其中,按键电路能够通过按键来切换电子秒表功能和电子时钟,设定电子时钟的时间对时、显示内容、闹钟定时功能,控制电子秒表计时、暂停、继续计时、清零功能。AT89C51单片机片中置有存储器为4K的E2PROM程序,不需要对程序存储器进行外扩,在单片机外侧接入上电复位电路和12MHz晶振电路。LED显示电路选择红色共阳极数码管,通过动态扫描方式显示数据,在段选控制处接限流电阻,在位选控制处利用三极管进行驱动,通过1m/s定时中断服务程序动态扫描显示各个部位。电子时钟的功能时显示按照位次依次显示星期、小时、分钟、秒、十分之一秒、百分之一秒,并且可以通过控制按键切换年月日显示[2]。音乐报时电路的设计需要选取两个不同的HL9300E音乐集成片,便于分别进行定时音乐报时和整点音乐报时。定时音乐报时和整点音乐报时需要接入不同的触发控制端,二者互相切换,进而避免两个音乐集成芯片同步放乐的干扰。在GND与5V电源的AT89C51之间设计加入470uF的电解电容,可在其旁边多并联接几个小的瓷片电容,可改善音质。音乐集成片输出端接扬声器或蜂鸣器,这样可以有效防止因继电器触点吸合而造成的系统复位,从而使由按键清除闹钟定时时间的报时音乐声。
2.2电子时钟的软件设计
把AT89C51内部定时和计数器设置为定时器工作模式是电子秒表和电子时钟的计时基准.时针定时器的中断信号为10m/s,即每经过100次中断,时钟秒位加一,秒位经60次加一后向时位进位,当时间为23时59分59秒时,秒位再加一后变为00时00分00秒。当按键切换为电子秒表功能时,秒针定时器每产生一次中断,十毫秒单元加一,其经过10次加一后,百毫秒单元加一,依次进位可实现最长为9小时59分59秒999毫秒的秒表计时,可达到分辩10m/s的计时精度。
通过K1~K4按键可对时钟加以对时,当第一次按下K1键时,显示数码管第一位闪烁,继续按键时,下一位闪烁。当某一位闪烁时,按下K2按键能够使闪烁位加一。在正常时钟显示方式下,按下K2键可以转换年、月、日的显示。按下K3键能够进入秒表状态,按下K4键能够显示闹钟定时时间[3]。
三、电子时钟的键盘设计
本设计使用单键盘的方式设计,功能较为完备,既能减少对硬盘资源的损耗,又能调节和控制时分秒,使其转换为省电模式。在按键又松开后通过屏蔽数码管显示功能达到省电目的;在按键不松开时能够累加时分秒数字,按键一次累加一分钟;在连续按键两次时,能够调节时针,同样是累加一次为一小时,在达到时间调节目的后,延缓一段时间来判断并确保按下此键,然后对键值和处理程序进行保存。
总结
综上所述,本文设计的电子时钟具有功能齐全、性价比高、电路简单、制作成本低等优点,只要接入单电源即可供电,方便于在办公室和家庭等场所使用。简单的时钟设计对增强电子专业学生的动手能力及独立设计思考能力都会有很大的提高,本片的设计思想可作为市场产品加以推广也可作为电子专业学生设计电子时钟的参考,希望本文对读者有些许帮助。
参考文献
[1]王丹丹,郑宽磊.一种新的基于层次化模式实现的SOC时钟设计方法[J].微电子学与计算机,2011,11(04):89-93.
[2]陈媛媛.基于无线网络的GPS时钟同步与信息发布系统[J].科学中国人,2014,08(23):2.
[3]牛国锋,朱苗苗.基于瑞萨微控制器的LED电子时钟设计与实现[J].常熟理工学院学报,2012,02(18):120-124.
(作者单位:西北师范大学)
作者简介
单片机程序设计 篇7
C语言提供了30多个运算符, 范围很大, 应用广。除了控制语句和输入、输出之外, 几乎所有的基本操作, 都是按照运算符来进行处理的, 可见其在C语言中的重要性。
1.C语言运算符的作用与分类
C语言的运算符可以灵活地与运算对象组合成运算表达式。按其在表达式中的作用, 运算符可分成基本运算符和其他运算符。基本运算符有8类, 即算术运算符、关系运算符、逻辑运算符、自增运算符、自减运算符、字位运算符、赋值运算符、条件运算符、逗号运算符等。而其他运算符有指针运算符和杂项运算符等。每类运算符又包含了多种运算符。
2.基本运算符
⑴算术运算符及自增、自减运算符
表4列出了加、减、乘、除、取模5种算术运算符, 以及自增、自减运算符的操作说明。其中, 除法运算符又分两种情况, 一是整除, 即两个整数相除, 所得商舍尾数, 仅取整数部分, 如5/10等于0;二是实除, 即两个实数相除, 所得商也是实数, 如5.0/10等于0.5。
自增运算符++和自减运算符--, 是C语言中最具特色的单目 (一个量) 运算符, 其操作对象必须是整型变量, 而不能为常量或表达式, 其功能分别是使变量增1或减1。自增运算符++和自减运算符--有前缀运算符和后缀运算符两种应用方式, 两者产生的效果有些不同:前缀运算符, 如++i或--i, 在使用i之前, 先使i的值+1或-1;后缀运算符i++或i--, 在使用i之后, 才使i的值加1或减1。
例如, y的原值等5, 则:
语句X=++y, 表示y先加1再运算, 得y=y+1=6, x=y=6;
语句X=y++, 表示y先运算再加1, 得x=y=5, y=y+1=6。
在《电子制作》2009年第10期, 《PIC单片机C语言程序 (1) 》的延时函数中, 我们已用过后缀运算符i++, 大家可以从中体会其用法。
⑵逻辑运算符
逻辑运算符是基本运算符中的一种。逻辑运算符有:与“&&”、或“‖”、非“!”等3三种。
逻辑运算符&&、‖为双目 (两个量) 运算符, !为单目运算符。它们要求的操作对象是非0的整型值和整型0表示的逻辑量。其运算规则如下:
1) 若两个操作对象都为非0整型值 (真) , 则相与的结果为1 (真) , 否则为0 (假) ;
2) 若两个操作对象都为整型值0 (假) , 则相或结果为0 (假) , 否则为1 (真) ;
3) 若操作对象为非0整型值 (真) , 求非的结果为0 (假) , 否则为1 (真) 。
这里补充一点, 算术运算符中的加、减和乘, 与大家熟悉的算术运算规则完全相同, 而除运算符应按上述规范使用。
C语言的运算符内容较多, 限于篇幅, 这里仅概况地加以介绍, 希望读者在学习时, 根据PIC单片机书籍, 深入学习C语言的运算符, 并通过编写C语言程序, 掌握每个运算符的意义和使用规则。
3.可预置起始时刻的时钟程序
⑴硬件电路
利用《电子制作》2010年第1期《PIC单片机C语言程序 (4) 》一文中的4位LED数码管显示电路 (图3) , 可以制成24小时或12小时循环显示的时钟电路, 且该时钟可以由人工预置起始时刻, 即电路插上电源后, 可根据当时的实时时刻, 如手机或电视屏上显示的时刻, 进行人工校时, 之后即可作时钟用;若不进行人工预置 (校时) , 该电路就自动从00.00开始, 以分为单位起始计时, 此时, 该电路可作人工守侯定时器。该时钟电路不显示秒, 而是以分钟开始的显示。
该电路仍采用PIC16F84A芯片, 当写入本文下面给出的程序后, 即可作24小时时钟用。其使用方法如下:
插上电源, LED数码管显示00.00, 按下图3中的K1键, 数码管全灭, 松开K1键, 再按下K1键, 数码管从0 (分位) 开始计数, 到达指定的分钟显示时, 放开K1键, 又按K1键, 时位显示, 到达指定的时显示时, 放开K1, 时钟即按人工预置起始时刻工作, 操作十分简单。
注意:如果预置时间的时位是从00开始而仅有分钟的有效值时, 当预置分钟指定值后, 仍要再按下K1键, 使时位从00递增又回到00, 时钟即可工作, 否则时钟电路不会工作。
⑵24小时的时钟C程序
根据图3编写的24小时时钟电路的功能, 可绘出相关流程图 (限于篇幅, 这里从略, 若需要, 可根据《PIC单片机C语言程序 (4) 》一文的图5, 0~9999的计数流程图, 加上下面的C程序中的注释, 扩展绘出) , 再由流程图编写出24小时的时钟C程序。该程序命名为pic0.5.c, 其清单如下:
说明:1) 上述C程序, 经picc编译器编译, 生成目标码.hex, 即可用编程器将.hex程序烧写到pic16F84A芯片中, 再用《PIC单片机C语言程序 (4) 》一文中图3电路即可制成24小时的时钟。该时钟与标准时间相比, 仅慢1秒/周。略增、减本程序中的d值, 可再校时。
2) 初学者仔细查看程序中的注释, 即可理解本C程序的编写原理。
单片机程序设计 篇8
在2010年第2期《PIC单片机C语言程序 (5) 》一文中, 我们介绍了可预置起始时刻的时钟的硬件电路并给出了C语言程序。下面要介绍的可预置起始时刻的倒计时程序, 是作为日常生活中对某事件的定时之用:只要某事件由人工设置的计时时间到, 倒计时电路便会发出报警声。倒计时的特点是, 计时一旦达到预定值, 其值就归零。利用归零条件, 即可实现任意倒计时达到时的报警功能, 提示人们定时已到。
本倒计时器可在0~99分钟内任意设置计时值。例如在厨房中, 蒸大米饭 (8两米) , 定时33分钟, 烧开水 (一壶) 为20分钟, 煮胡罗卜 (红色) 为30分钟等, 只要设定时间一到, 倒计时器即报警, 使用十分方便。当然, 上述倒计时值, 均是事先用普通时钟确定每个事件所要花费的时间, 列出相应定时标准, 才能用倒记时器进行定时。
(1) 硬件电路
图6是0~99分钟可预置的倒计时电路。PIC16F84A单片机 (4) 脚为手动复位端, 外接R1、D0、C6、K0 (微动开关) 组成复位电路; (3) 脚RA4外接上电阻R2和倒计时人工预置开关K1;⒄脚RAO外接R0、V3和蜂鸣器, 组成倒计时值达到 (归零) 时的自动报警信号。电路中的两位LED数码管和V1、V2组成0~99分钟可预置LED数码显示电路, 其电路原理与2009年第12期《PIC单片机C语言程序 (3) 》一文中图3的起始两位计数电路相似。
(2) 程序流程图
图7、图8、图9分别为0~99分钟可预置的倒计时程序的主程序、显示函数和键值扫描程序流程图。通过流程图, 读者可以加深对于倒计时程序设计原理和对2010年第2期《PIC单片机C语言程序 (5) 》一文中可预置时钟电路程序的理解。
(3) 倒计时的C程序
根据图7~图9编写的的倒计时C程序 (命名为pic06.c) 清单如下:
单片机程序设计 篇9
4.C程序pic07.c的SIM软件仿真调试
在《PIC单片机C语言程序设计 (8) 》和《PIC单片机C语言程序设计 (9) 》中, 我们已对C程序pic07.c进行了编辑和编译, 现在需要查看该程序能否达到预期的设计目标, 即能否完成pic07.c的0~99秒增量计时LED数码显示功能 (脉冲发生器) , 因此需要调试程序。
调试程序, 可以使用MPLAB ICD2在线调试器、MPLAB ICE2000硬件仿真器等开发工具。对于初学C语言程序, 又没有上述硬件仿真调试器的读者, 最好选用MPLAB SIM软件模拟仿真器进行程序的调试。
模拟仿真调试是检查程序是否正确, 能否实现预期功能的有效手段。有了它, 可以实现程序的“单步运行”、“单步越过”、设置“断点”、用软件跑表直接测试延时函数的准确计时等等, 对初学C语言编程者特别有用。
PTC单片机的C语言程序, 是由函数、表达式和各种运算符组成的。初学C语言程序时, 很难清楚看出程序是如何运行的, 而利用程序的模拟仿真, 则可直观看到程序运行的整个过程。
⑴模拟仿真的主要命令及功能
PIC单片机C语言程序的SIM软件的模拟仿真, 是在MPLAB IDE集成开发环境 (C语言) 中进行的。操作时, 只需利用MPLAB IDE中的有关菜单, 如Debugger (调试) 、Select Tool等命令项, 即可完成模拟仿真操作。为了方便读者查看程序或操作, 特将模拟仿真时常用的主要命令和功能汇集起来, 如表5所示。
⑵设置软件仿真调试状态窗口
前面已经讲到, 对程序进行软件仿真的先决条件, 是在MPLAB IDE环境下将所编辑的源程序编译成功后, 才能对源程序进行仿真调试。对pic07.c的源程序, 我们已成功地进行了编辑和编译, 所以现在可以直接进行软件仿真了。也就是说, 只需设置软件仿真调试状态的窗口, 便可进行调试。下面介绍具体方法。
在PC机显示桌面上, 双击MPLAB IED V7.40快捷图标, 打开MPLAB IDE的操作界面。用鼠标选择 (点击) MPLAB IDE中的Debugger (调试) (下拉) Select Tool (选择工具) (下拉) MPLAB SIM (模拟) 菜单项, 即可把项目设置成模拟仿真调试状态, 然后利用“项目树窗口” (参见《PIC单片机C语言程序设计 (9) 》图37) , 用鼠标双击pic07.c (源程序) , 即可打开pic07.c的源程序, 如图43所示。
此外, 也可采用先在MPLAB IDE窗口中, 通过相关操作把编译成功的C程序摆在MPLAB IDE窗口中, 再用鼠标选择Dedngger→Selec Tool……的方法, 把项目设置成仿真调试状态。经过上述操作后, 会在MPLAB IDE的界面工具栏上自动生成模拟调试Debug的快捷图标。该图标从左到右的功能依次为:Run、Halt、Animate、Step Into、Step over、Stepout和Reset, 共7个命令 (如图44所示) 。在进行上述操作时, 如果在工具栏上未自动生成图44所示的快捷图标, 可用鼠标点击MPLAB IDE中的菜单“Tools”, 然后在其下拉菜单中选择 (点击) “2MPLAB Macros”, 弹出图45所示的快捷图标, 此时, 只需用鼠标点击该图的三角形按钮, 在其下拉菜单中点击“Debug”命令, 同样可在MLAB IDE的工具栏上生成如图44所示的模拟调试快捷图标。完成上述操作后, 我们就可以进入程序的模拟调试运行阶段了。
说明:图43工具栏上的模拟调试快捷图标的功能, 与MPLAB IDE中的Debugger下拉菜单中的命令Run、Animate、Step Into、Step over、Step out和Reset等完全等效, 只是其操作没有图43中的快捷图标直观、方便罢了。
⑶Animate动画运行
初学C语言程序进行模拟仿真运行调试时, 直接使用图43工具栏中的快捷图标, 最为直观方便。
我们首先选择该图标中的“Animate”动画运行命令, 以直观pic07.c程序的整个运行过程。用鼠标点击Animate (参见图44中的标注) , 图43中主程序main的左边会出现一个红色箭头, 不断沿着程序的代码移动, 即表示程序正沿着main () 以下的赋值和循环语句→TRISB=0x00;→Whie (RA4) →While (1) 中display (x) →Void display (unsigned int x) …→While (d>0) →[PORTA=Ox1F;→PORTB=SEG[unit bit];…d--;]运行。程序运行时, 要在方括中运行100次 (因为d=100) , 方可跳出循环到程序末尾的X++; (X值从0+1代表LED显示的个位值从0增量到1) →if (x==99) 判断X值是否为99, 如果未达到该值, 返回display (x) →Void display (unsigned int x) …如此运行。这就是Animate命令模拟运行的功能, 即可以完全看到pic07.c程序的运行过程。
在前述的pic07.c程序沿While (a>o) 循环语句运行时, 应循环运行100次才跳出循环到X++;代码处, 程序在该循环语句运行中的耗时约33分钟。显然, 这么长的运行时间, 调试起程序来实在太费时了。所以, 单纯使用该命令, 仅适用于初学C语言时学习调试。若能在使用该命令时配合其他调试命令, 则可大大降低程序的运行时间。
⑷Step Into、step over和Step out命令配合运行调试
前面讲到, 用Animate (动画运行) 命令, 观察pic07.c程序运行, 会感到运行速度较快, 看不清楚程序经过的路径。这里介绍用工具栏快捷图标 (见图43) 中的命令Step Into、Step over和Step out, 对程序进行模拟调试的方法, 其功能见表5。
为了灵活使用上述命令, 大家还应了解C程序的不同代码在运行时所用的时间 (耗时) , 才能正确选择各种命令。为此, 笔者将模拟运行时, pic07.c中的各种赋值语句、延时函数delay (200) 、显示函数 (display) 等, 运行的时间分别进行了实测, 见表6, 以供读者选用图43中的三条调试命令Step Into、Step over和Step out时参考。
下面具体介绍使用Step Into、Step over和Step out命令对pic07.c进行调试的操作方法。
1) 设定程序调试的起点
在图43中 (假设模拟调试准备已操作完成) , 用鼠标点击Animate命令, 再以最快速度用鼠标点击Halt (停机) , 此时在主函数Void main () 以下的某条赋值语句 (如TRISA=0x10;) 的左边会出现一红色箭头, 这是模拟调试的起始运行点, 如图46所示。
2) Step Into单步运行
利用Step Into命令, 可以清楚看到pic07.c程序从主程序开始一步一步地运行。操作时, 用鼠标点击图44中快捷图标Step Into (参见图44的指示) , 每点击一次该图标, 程序运行一条代码, 可参照表6一步一步进行。当Step Into进入调用显示函数的函数体中时, Step Into还能工作, 直到unit bit=X%10时, 因该赋值语句需耗时323μs, 该单步运行因每步走时太短, 它会随鼠标点击step Into时, 在该语句原地踏步, 无法前进, 此时应换用另外的命令。
3) Step out或Step over单步运行
点击图43中的快捷图标Step out (或Step over) , 点第一次, 程序越过unit bit=X%10, 点第二次越过ten bit=X/10%10;然后再用鼠标点击Step Into (单步) , 直到dalay (200) ; (延时函数) , 由于该延时约5ms, Stap Into无法快速运行, 此时可改用Step over命令, 用鼠标点击之, 程序即可从delay (200) ;到达赋值语句RA3=1;。
4) step Into单步运行
从RA3=1;开始的三条代码的运行时间较短, 仍可用单步运行命令运行。即点击step Into三次, 直到程序运行delay (200) 为止。然后换用step over命令, 点击step over, 即可到RA2=1;, 再点击step Into两次, 运行到d--;至此, while (d>0) 循环语句执行了一次循环。再点击step Into, 红色光标回到while (d>0) , 其d=100变成d=99, 由于此时while中的d值仍>0, 程序将继续在该语句中运行。如果按上述方法继续运行该程序, 则必须重复100次 (因d=100) 才能跳出该循环语句, 显然太费时。
5) 设置断点和使用Run全速运行
为解决上述问题, 可用全速运行命令Run进行调试。由于点击一次Run命令, 程序的运行时间在2s (秒) 以上, 为了控制程序运行, 应先在需要观察程序运行情况的语句处设置断点, 这是调试程序时经常使用的方法。设置断点的作用, 是使程序运行到所设置的断点时自动停止。此后, 还可根据实际需要选用其他命令进行调试。设置断点的方法如下:双击需要设置断点所在行代码的最左端, 在该行会出现断点标志——红色“B”, 如图47中设置了两个断点。断点设置好后, 点击Run命令, 程序会立刻运行到图47中的第一个断点处, 这时再用鼠标一步一步点击step Into命令, 程序会从pic07.c的x++→if (x==99) →dispay (x) →新的循环又开始 (LED数码管从00, 变到01) , 如图48所示。
单片机程序设计 篇10
5.PIC单片机C语言程序SIM软件仿真技巧
在《PIC单片机C语言程序设计 (10) 》中, 我们以C语言程序pic07.C为例, 介绍了SIM软件仿真调试的基本手段和方法, 下面介绍SIM软件仿真的技巧, 包括用跑表直接测试C程序运行的耗时 (包括秒值) 、快速观察C程序的运行路径、显示C程序中的变量值和修改程序中的错误等等。
⑴用跑表测试程序的延时量和秒计时值
这里, 我们仍以pic07.C为例, 介绍利用MPLAB IDE提供的跑表 (又称停表—stop watch命令) , 测试C程序中所要求的各种计时值的操作步骤。该操作十分简单, 同时也是实际程序调试中经常要用到的。
pic07.C是一个0~99秒的脉冲发生器程序。其秒个位在LED显示 (电路见《PIC单片机C语言程序设计 (4) 》中的图3) 时, 从0到1、从1到2、……, 每隔1秒显示数字加1, 而秒值是由pic07.C程序显示函数中的d值 (d=100) 决定的。如果用MPLAB IDE提供的跑表测试该时间若未达到1秒的要求, 可直接改变d值 (增加或减少) , 来达到所规定的递增1秒的要求。
用跑表测试pic07.C程序中各代码功能的时间, 其操作方法如下:
1) 例行操作
按照《PIC单片机C语言程序设计 (9) 》一文介绍的方法, 在MPLAB IDE7.40集成开发环境中, 对源程序pic07.C进行编译, 只要编译成功 (此为进行软件仿真的必要和充分条件) , 便可进行下面的SIM软件仿真操作了。
点击图37 (见《PIC单片机C语言程序设计 (9) 》) 中的pic07.C, 把该程序调到MPLAB IDE7.40的桌面上。再按照《PIC单片机C语言程序设计 (10) 》中介绍的方法, 在MPLAB IDE7.40的窗口上设置软件仿真调试状态窗口, 如图49所示。注意:接下来将使用图49中的7个模拟调试快捷图标 (Debug) 。
2) 调用stop Watch (跑表)
点击图49中的Debugger命令, 并在弹出的下拉菜单中点击setting, 即可生成图50所示的Simulator Settings界面。在该界面中, 频率为20MHz, 我们将其改成实际电路 (即《PIC单片机C语言程序设计 (4) 》中的图3) ) 所用的晶振频率4MHz, 然后点击图50中的“确定”, 回到图49所示界面。在该界面中点击“Debugger”命令, 并在弹出的下拉菜单中点击“Stop watch, 即可生成图51所示的对话框。
3) 定量测试
下面我们来验证程序运行时, 各代码运行的具体时间是否如《PIC单片机C语言程序设计 (10) 》中的表6所示。具体操作如下:
a.点击图49快捷图标中的命令Animate, 之后立即点击快捷图标中的Halt (停止) , 便会出现图52所示界面。其中, 主程序TRISA=0X10赋值语句左边有一个绿色箭头, 指向的是模拟调试时程序运行的起始语句;而语句X++; (自增量) 左边有一个断点标志, 即红色的“B” (若语句X++;左边无断点标志“B”, 可通过双击X++旁的位置, 来进行断点“B”的设置) 。接下来, 便可验证《PIC单片机C语言程序设计 (10) 》中表6列出的程序各语句的耗时量了, 其操作方法如下:
b.图52“Stop watch”界面右下角的程序频率为4 (MHz) , 说明设置频率是正确的。点击图52中的命令“Zero”清0, 使Zero右边的time为0 (说明:该行最右侧显示的是执行多条语句的累积时间, 此处可不管) , 随后点击MPLAB IDE菜单行中的模拟调试快捷图标Step Into (单步) , 使程序按照《PIC单片机C语言程序设计 (10) 》表6所列, 从绿色起始箭头所指语句TRIA=0X10;开始, 只运行一步就停下来, 此时, 图52中Zero右侧time旁显示该语句运行耗时数是2μs, 与表6所列数值完全相符, 而绿色起始箭头则指向了下一条语句“PORTB=0X40”;处。
接着运行语句“PORTB=0X40”;, 方法同语句“TRIA=0X10”;。即先点击Zero, 清0, 使Zero右边的time为0, 再点击Step Into (单步) , 执行语句“PORTB=0X40”;, 可以看到绿色起始箭头又指向了其下一条语句INTCON=0X00;, 此时, 图52中Zero右侧time旁边给出的该语句运行耗时数是3μs, 与表6所列数值完全相符。
用同样的方法, 依次执行表6所列的语句, 从而确认各语句运行的时间是否与表6所列数值相同。需要注意的是, 在点击Step Into (单步) 命令运行一条语句前, 必须先点击Zero, 对time清0一次 (即不观察累计时间) 。
此外, 运行位赋值定义语句unit_bit=X%10;ten_bit=X10%10;时, 应将点击Step into命令换成点击“Step over”命令, 其余操作不变, 程序又可快速单步运行。遇到delay (200) ;延时语句时, 也用“Step over”命令, 才能顺利验证表6中的耗时量。
4) LED显示增量时间的测定
类似上述方法, 当程序运行到display (x) ;语句处时, 先点击Zero (清time的0) , 然后点击MPLAB IDE模拟调试的快捷命令“Run” (全速运行) , 使程序从display (x) ;全速运行到预先设置的断点X++;处, 此时, 图52中time的显示值为1.036104S (秒) , 说明pic07.c程序中的d=100值大了一点。
此时, 我们可将程序中的d值改为99 (或98、97) , 然后在用前述增量时间测定方法对其进行运行时间测定, 来找到最准确的0~99递增为1秒的d值。
基于单片机的转速测量系统设计 篇11
关键词:单片机转速测量系统
1.引言
转速是在工程项目中应用非常广泛的一个测量参数,其相应的测量方法比较多,模拟量的采集与模拟处理作为转速测量的常用方法[1]。伴随着大规模与超大规模集成电路硬件技术的快速发展,数字系统的测量技术已经得到十分普遍的具体应用,尤其是单片机对脉冲数字信号具有的强大处理能力,促使全数字化的测量系统应用愈来愈普遍,同时转速测量系统能够进行全数字化处理,在相应的测量范围与测量精度方面都得到较大程度的提高。所以分析各种类型测量转速的基本方法,对于各种不同的工程应用环境,使用89C51型单片机可以实现全数字化测速系统,根据提高测量精度的角度考虑分析,探讨出现误差的各方面原因,为今后阶段的实践应用提供有效的借鉴。
2.转速测量原理方法
转速测量的原理通常可以分为三种类型,第一种是使用单位时间内所测量物体的旋转角度来计算相应的速度,比如在单位时间内,累计转速传感器发出的N个脉冲,即为这单位时间的速度。这种通过测量频率参数来实现测量转速目标的方法被称测频法,即为“M”法;第二种是在给出的角位移距离范围内,通过测量这个角位移的相应时间进行测速的方法,称为测周法,即为“T”法。第三种测量方法是“M”法,结合了“N”与“T”这两种方法的具体优点,一方面会像“M”法那样在对传感器所发出的脉冲进行计数,同时可以像“T”法那样计算脉冲的时间,通过具体计算过程可以达到转速值[2]。
转速测量的具体方法分为频率法与周期法两种类型,这两种测速方法都是对脉冲进行测量的,然而测速范围都会受到一定程度的限制影响:
(1)频率法。在规定的检测时间内可以测量出计数脉冲的个数。即使检测时间是一定的,然而检测的起止时间都具有随机性的特点,如果被测转速较高或者电动机转动一圈所发出的转速脉冲信号个数比较多的时候,才可以产生较高的测量精度,同时测量准确度随着转速的减小而降低,这种方法能够适用在高速测量中。
(2)周期法。这种方法可以测量出信号所发出脉冲个数所需要消耗的时间。在被测转速较低的情况下,才可以保证较高的测量精度,其测量准确度会随着转速的增大而降低,这种方法能够适用在低速测量中。
3.转速测量系统设计
一个单片机控制应用系统的硬件电路设计主要包含有两个重要部分:
一方面是系统的扩展方式,如果单片机系统内部的具体功能单元,比如ROM、RAM、I/O口、定时/计数器以及中断系统等实际容量无法满足实际应用系统的具体要求时,应当在片外进行相应的扩展,需要选择合适的扩展芯片,同时设计出相应的硬件电路[3]。
另一方面系统的配置方式,根据系统控制功能的要求标准配置相应的外围设备,比如键盘、显示器、打印机、D/A以及A/D转换器等,同时应当设计出相应的硬件接口电路。所以系统的扩展与配置需要遵循以下几项原则:
(1)尽量选取典型的硬件电路,同时应当符合单片机系统的常用方法。
(2)系统的扩展方式和外围设备配置需要符合系统控制功能的具体要求,同时应当留有充足的余量,以便于可以进行二次开发。
(3)系统硬件结构应当和应用软件系统的方案进行充分的统一考虑,软件系统可以实现的硬件功能应当尽量使用软件系统来实现,然而应当注意的是软件系统实现占用CPU的时间,同时响应时间比硬件系统要长。
(4)單片机系统的外接电路相对比较多,应当充分考虑其相应的驱动能力,降低芯片的实际功耗,减少总线的负载量。
(5)89C51型单片机的I/0口输出特性具有比较大的灌入电流能力,其中PO口的灌电流可以达到20mA,完全能够实现数码管的驱动功能,然而只有较小的“吐”电流,所以在本系统中采用共阳型的数码管,把PO口作为数码管的段驱动,P2口的5位分别接5个PNP型的三极管实现位驱动的功能。这样可以节省显示功能的驱动芯片,有利于提升系统的性价比[4]。
本系统因为只考虑了转速的测量和显示功能,在考虑系统的配置与扩展方式时,尽量地使用单片机系统本身的各种资源,有利于提升系统的性价比,采用89C51系列的单片机作为系统的控制芯片。89C51单片机系统内部含有一个4KB的程序存储器、128字节的寄存器空间、两个16位的定时/计数器、32根I/O口线以及五个中断源。然而本转速测量系统选择“M”法的测量方法,需要一个用于对外部脉冲计数的计数器,一个用于对内部高频脉冲计数的定时器,用于调整与预定设置的定时时间。根据实际分析可以得知89C51系统可以符合系统的控制要求,不需要另外进行计数器的扩展,外部中断分别用于定时/计数同步中断与响应,定时器使用其溢出中断来预定相应的测量时间,这对时间的要求比较准确,需要根据测量高、中、低转速来进行具体的调整[5]。
4.结束语
单片机系统用于进行转速测量的类型比较多,其方法各有区别,在硬件系统设计上根据使用场合、功能与要求,使用的硬件电路各有差异,单片机系统有80C51系列的80C31、8 0C51等,同时对其进行有效的扩展,接口使用8155、8255等实现显示功能。本系统使用89C51单片机系统,充分使用单片机系统内部自带的两个16位定时/计数器进行相关设计,可以比较完整地开发单片机系统的本身功能,接口使用89C51的P0口具有较大的电流驱动能力,不需要扩展相应的驱动芯片,直接通过单片机系统进行驱动,从而可以简化系统的硬件电路,体现出一定的应用价值与较好的性价比,可以很好地应用在工业制造生产、科学技术教育、居民家用电器等各个行业领域。
参考文献:
[1]何立民.MCS-51系列单片机应用系统设计系统配置与接口技术[M].北京:北京航空航天大学出版社,1990.
[2]孙涵芳,徐爱卿.单片机原理及应用[M].北京:北京航空航天大学出版社,1996.
[3]何立民.单片机应用文集[M].北京:北京航空航天大学出版社,1992.
[4]朱家建.单片机与可编程控制器[M].北京:高等教育出版社,1998.
单片机程序设计 篇12
1 单片机程序结构设计的特征
单片机的程序编制应当从程序开发的语言入手, 并针对不同的功能选择不同的程序结构, 这样才能为程序编制打下良好的基础, 因此在实际的操作中如何选择程序的结构模式就成为了编程的要务。随着计算机技术的成熟以及单片机的技术发展, 结构化的程序设计方式被提出并应用。其主要是将程序编写纳入到模块模式下, 利用结构标准化、模块化等来实现对程序的编制, 利用模块化结构来简化编程的复杂程度。此类设计中是的是可重复利用性, 可移植的标准性。简化程序的编制过程提高模块的利用率。从而降低出错的概率, 提高单片机的应用效果。可以按照不同的单片机功能选择不同的模块, 将各个模块的功能突出应用到系统中, 并在特定的工作环境中解决特殊的问题。总是对软件结构的合理配置, 理顺模块之间的关系, 从而从宏观上完成对编程流程和结构的控制。从而实现对复杂问题的简化, 提高单片机的编程效率, 并提高对复杂问题的解决能力。
2 单片机的开发语言选择
在单片机的程序编制中C语言因为在应用上的优势而被广泛采用, 方便的应用库函数容易实现复杂数据的结构。但是C语言不能在时序控制上获得优势, 速度型算法上不易达到单片机的要求。但是随着C语言被纳入到编程范围后, 其汇编混合编程的模式已经可以帮助弥补其语言上的缺点。随着单片机的调试技术的发展, 单片机已经适应了C语言程序控制, 从而为高级语言进入到编程中带来了可能。
3 单片机编程的常用程序结构
为了方便进行单片机的程序编制, 通常可以将其程序划分为多种结构以此适应不同的功能需求。具体结构如下。
3.1 基本程序结构
其结构包括了初始化程序和工作程序两个部分, 初始化程序负责在单片机上电后的复位, 首先执行初始化程序, 程序只要在工作前执行一次即可。初始化程序运行对个各种端口和变量、定时器、ADC等进行全面的检测和初始化。如果需要可以建立不同的初始化分支, 对不同的终端进行检测和初始化, 根据不同的条件来选择不同的初始化方式, 比如冷启动和热启动的选择。主程序则是一个循环程序, 这所执行的是单片机的工作内容, 实现具体的功能, 如检测、控制、通讯、人机交互等等。各个功能都是有子程序进行控制, 主程序是控制调用这些程序的指挥者, 以此方便模块化的程序编制和应用。
3.2 模块结构
在单机片程序中主程序负责的是模块调度工作, 将实现功能的各个子程序进行合理调度, 此时被调度的程序就是模块。这样的模块中所附加的是一定的功能性, 采用模块化的程序结构可以方便程序多种功能的集成, 即在不增加主程序难度的同时添加或者减少模块可以实现系统功能的改变, 以此实现程序的优化, 方便维护与降低出错率。
3.3 模块控制机制
调度主程序时不是所有的模块都被应用, 所以模块在一段时间内应被控制, 不是所有的循环中都需要所有模块参与。或者某些模块的执行不是经常性的而是在满足某些条件后才被执行。为了解决这个问题, 可以给模块设定一个标志, 模块在执行前应判断自身的标志位, 只有标志位是可用的状态下才能执行相关的操作。如果标志位不可用则应进行返回程序, 不执行对应的模块功能。
3.4 优先调用机制
主程序在调用模块的时候应有先后之别, 因为模块运行的优先级将限制其应用, 如果没有优先限制某些重要模块不能相应或者不及时。因此在调用中主程序应可以对模块的优先级进行分析与选择, 按照不同的处理事件来区分模块的优先级。对模块功能的标志进行检测, 对优先级较高的模块进行调用, 然后查询后续功能模块并异常类推。如果出现不可用的情况则进行新一轮的检测并从优先级较高的模块开始。
3.5 前后台结构
前后台的结构是一种中断机制的引入, 即按照实时性事件与突发事件进行差异化对待, 实时性较高的事件被前置, 让其在中断中响应, 将实时性较低的事件和任务纳入到主要程序中, 如显示刷新、扫描等等。形成一个以中断为界限的前后台执行程序结构。前后台的程序应按照大多数任务需求进行功能调度。在使用中应注意前后台任务结构的时候, 尽可能减少中断服务程序的执行时间。可以在中断服务程序中设置一些标志, 然后由后台程序检测标志来进行进一步处理。这样可以很大程度上避免前台程序和后台程序互相抢夺处理器资源, 造成某些低优先级任务阻塞。目前随着单片机的发展, 有些单片机的中断资源大为丰富, 已经可以将所有的任务都可以通过中断来实现, 这样我们就可以让中断承担全部工作, 废除后台程序, 除了只保留必要的初始化程序外就进人低功耗模式等待中断来处理其他任务。
4 结语
上述对单片机的程序编制结构进行了分析, 从基础的结构类型出发分析了多种模式框架下, 单片机程序执行的差异。同时说明多种结构不是独立存在的, 而应在具体问题的解决中进行选择, 选择合理而准确的程序结构, 有利于单片机功能的实现, 也可提高调度机制的合理性, 从而有效的指挥单片机完成各种功能。
参考文献
[1]王玲.提高单片机程序设计有效性的策略探究[J].考试 (综合版) , 2012 (01) :15-16.
[2]刘杰.论单片机程序设计[J].现代商贸工业, 2011 (07) :156-157.
[3]杨打生, 李泰.基于事件机制的一种单片机程序设计方法[J].商丘职业技术学院学报, 2013 (04) :26-27.
【单片机程序设计】推荐阅读:
单片机课程设计05-11
单片机综合设计06-05
单片机系统设计09-16
单片机原理课程设计05-14
单片机课程设计学生07-07
单片机原理与系统设计07-23
51单片机课程设计作业10-06
单片机课程设计撰写说明10-25
单片机花样流水灯设计09-17
单片机的低功耗设计09-30