业余无线电论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6014|回复: 1
打印 上一主题 下一主题

采用调用定时和中断子程序的办法发出矩形波信号的探讨

[复制链接]

19

主题

20

帖子

948

积分

版主

Rank: 7Rank: 7Rank: 7

积分
948
跳转到指定楼层
1#
发表于 2016-1-1 11:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
采用调用定时和中断子程序的办法发出矩形波信号的探讨
                     
我在本版块所发表的《利用单片机发出两个时间间隔相同但是频率不同的矩形波信号》一文中曾谈到:若是采用调用定时和中断子程序的办法来发出矩形波信号容易出现一些问题。有网友问我这些问题的内容以及解决方法,本文就这些问题来进行一下探讨。
通常情况下,若是让单片机发出一个频率为f(若采用12MHz的晶振片,则f<12MHz)的矩形波信号,并且该矩形波信号由某一个引脚,例如是从P1.0引脚输出,那是很容易的事啊!例如,让单片机发出1个频率为500Hz的矩形波信号的汇编程序如下:   
                                    
此处要特别强调的是,由于是采取对P1.0引脚进行取反的方式来输出矩形波信号,那末只有在P1.0引脚由高电平变为低电平或是由低电平变为高电平时才会输出一个矩形波信号。故此,当让单片机发出1个频率为500Hz的矩形波信号时,应在汇编程序中采取1mS定时而不是2mS定时。对于初学者来说,一定要注意啊!其电路运行时的QQ截图见附件s29。在图中可以见到组合在一起的4个7段BCD数码管显示出来的16进制数为“01EF”,而16进制数1EF换算成为10进制数则为495,即单片机U2发出的矩形波信号的频率为495Hz。按照汇编程序预计单片机U2发出的矩形波的频率应为500Hz,但是实际上少了5Hz,那是由于单片机在执行每一条指令时都要耗费一定的时间(若51单片机采用12MHz的晶振,那末1个机器周期就是1uS),出现这种误差是可以允许的。
    那末能否把这个汇编程序不加改动而直接当做子程序来调用,并使单片机U2发出频率在500Hz左右的矩形波信号呢?通过对电路进行仿真实验后得出的结论是否定的。我在该汇编程序中圈出了1个椭圆形区域和1个长方形区域,在椭圆形区域里是由“LOOP:  AJMP  LOOP”构成的无限循环语句,当把这个汇编程序直接当做子程序来调用时,会出现跳不出循环的现象。所以此处要改成有限循环。其次要更改的就是长方形区域里的中断处理程序,即要采取在适当的时候禁止所有中断、禁止定时器0中断以及停止定时器0运行。
附件s30就是我采用调用定时和中断子程序的办法(注:就是把上面的那个定时和中断程序经过改动后而作为子程序来用)发出一个矩形波信号的汇编程序的QQ截图 。为了获得写入单片机中的HEX 文件,我使用了Keil uVision4软件。由于电路可以保持不变,并且单片机U1当做频率计来用,只是改变了写入单片机U2中的HEX 文件相对应的汇编程序。通过对该电路的仿真实验后,发现从单片机U2的P1.0引脚输出的矩形波信号的频率已经下降到423Hz了!究其原因,那就是由于不断的调用子程序,导致单片机U2耗费了更多的时间啊!
综上所述,我们有时需要在主程序中调用定时和中断子程序来做一些事情,诸如延时或发出矩形波信号之类的事情,那末本文所阐述的内容无疑就是一个有益的借鉴!
由于附件s30所示的汇编程序并不完整,那是由于程序较长,若有网友需要我的帮助来索取整个程序的话,最好通过QQ与我进行联系。联系方法见那篇名为<<用Proteus软件可以确定LC选频网络的各个元件的参数吗?>>的帖子。

s29.png (191.81 KB, 下载次数: 64)

s29.png

s30.jpg (36.7 KB, 下载次数: 66)

s30.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
载入中...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by 中国业余无线电

© 2001-2013 Comsenz Inc.