武汉理工大学《微处理器与微控制器原理及应用第四章任务五》说明书
任务五 简单门铃设计
1 实验要求假设单片机晶振频率为12MHz,设计1个简单门铃控制系统。要求按下按键K时,蜂鸣器发出“叮咚”的声音。
2 实现过程2.1 程序的实现本次实验通过讨论最终采用了在主程序中进行中断等待,并通过按键使计数器溢出,产生中断服务程序,在中断程序中实现叮咚clock()函数的执行、计数器的置初值初始化,然后再次回到主程序中,等待下一次的按键触发中断——触发“叮咚”的门铃声。对于clock()叮咚函数,本实验采用的通过设置for循环次数的方式来控制声音的持续时间和频率高低。除此方法外还可以通过设置一个一定频率的定时器,也可使clock()实现叮咚功能,此时在计数器中断函数中只需打开定时器(对定时器初始化)。相比之下,利用for循环控制“叮咚”门铃的方案更为简便。程序代码如下:
#include<reg52.h>
#define uint unsigned int
uint i,j;
sbit clock=P2^0;
void init() //初始化子函数
{
EA=1; //打开总中断
TMOD=0x05;//设置计数器0 工作方式1
ET0=1; //打开计数器0中断
TR0=1;//启动定时器0
TH0=0xff;
TL0=0xff;//计数器赋初值
}
void Clock() //"叮咚"函数
{
for(i=200;i;i--)//持续时间
{
clock=~clock;
for(j=200;j;j--);//叮的频率
}
for(i=200;i;i--)//持续时间
{
clock=~clock;
for(j=250;j;j--);//咚的频率
} }
void int1() interrupt 1 //计数器0中断
{
Clock();//调用"叮咚"函数
TH0=0xff;
TL0=0xff;//置初值
}
void main()
{
init();//初始化
while(1);//等待按键按下
}
2.2 硬件仿真图的实现原理仿真电路图中选用的器件有80C51,一个蜂鸣器和一个button按键。电路如下图所示。我们蜂鸣器选用了无源的sounder,只需提供符合一定要求的方波或正弦波即可使之发出声音。80C51是此电路图中的核心,通过。P2口作为clock()输出一定频率方波的输出口。并通过P3.4口连接按键以触发计数器T0的中断服务程序。按下按键可听到电脑音箱发出来类似“叮咚”的声音。仿真电路图如下。
3 问题与解决
- 在第一次调试运行时,仿真中按下按键,蜂鸣器未发出声音。通过查阅资料得知,这是由于,使用了protues仿真元件库里的speaker,和其参数设置有关,默认的控制电压过大,使输出的方波信号电压无法正常驱动蜂鸣器,于是改变参数或换用sounder即可解决。
- 修改好protues仿真电路后,按下按键,蜂鸣器依旧没反映,仔细观察发现,方便输出端的P2^0的电平一直未变,检查软件代码发现,计数器的初始化里计数器中断允许位未打开致使无法进入计数器中断里面执行clock()叮咚函数,修改代码后,点击重新生成.hex文件,用protues仿真便正常运行了,蜂鸣器发出了声音。
(3)未成功使蜂鸣器发出“叮咚”。由于软件中设置的发音频率即方波频率不合适,通过不断调整控制频率的for循环的循环次数,并通过protues仿真测试蜂鸣器,最后找到了合适的参数使之发出了叮咚声。
4 小组成员分工及心得体会小组每个人都独立完成了程序的编写、仿真、和调试程序,并一起讨论最优化方案。我们在遇到问题时一起讨论解决,最后成功在仿真软件中实现叮咚门铃控制功能。在调试过程中也意识到了调试先软件后硬件的重要性。
我们的论文是通过小组分工协作的形式合作完成的, 我们最后选择了卢笛同学的运行程序和仿真图。在编写论文的过程中,具体的分工情况如下:卢笛同学负责描述论文实现过程和结果的程序实现模块;李敏竹负责描述论文中的仿真图的仿真过程和仿真结果模块;玉敏同学编写论文的具体分工部分和心得体会部分,及论文的整体汇总与整理;许小青同学则协助修改程序和仿真图,并负责整理并编写论文中的实验中遇到的问题模块。在合作过程中,每个成员都对出现的问题发表了不同的见解,互相开阔了思维,打开了分析问题更全面的思路并在查阅资料过程中对自己的知识和想法进行了检验和验证,收获了更多的知识。