找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4440|回复: 6
收起左侧

学习很久的单片机汇编,遇到蜂鸣器驱动不了,今天终于驱动蜂鸣器响了!

[复制链接]
ID:218360 发表于 2018-10-25 22:47 | 显示全部楼层 |阅读模式
    一直下学习单片机A51汇编语音,流水灯,数码管,独立按键基本上都可以写出来,而学习蜂鸣器,死活驱动不了无源蜂鸣器,今天在论坛看了admin的C语音,用他的C语言下载进去蜂鸣器响了,自己照他的程序写汇编,很多方式不太会用,汇编与C应用不是很懂(开始学习过一点C),不会写的去掉了,只留下自己会写的,下载程序,有点响了,改变定时器的时间,蜂鸣器响了,感觉很高兴,附上版主的程序和我的汇编程序,请各位指点一二

单片机源码:
  1. #include<reg52.h>

  2. sbit BUZZ = P1^0;  //蜂鸣器控制引脚
  3. unsigned char T0LoadH = 0;  //T0重载值的高字节
  4. unsigned char T0LoadL = 0;  //T0重载值的低字节



  5. void OpenBuzz(unsigned int frequ);

  6. void StopBuzz();



  7. void main()

  8. {

  9.     unsigned int i=0;



  10.     TMOD = 0x01; //配置T0工作在模式1,暂不启动

  11.     EA = 1;       //使能全局中断



  12.     while (1)

  13.     {

  14.         OpenBuzz(2000); //以4KHz的频率启动蜂鸣器

  15.         for (i=0; i<30000; i++);

  16.         StopBuzz();

  17.         for (i=0; i<30000; i++);

  18.         OpenBuzz(2000); //以1KHz的频率启动蜂鸣器

  19.         for (i=0; i<30000; i++);

  20.         StopBuzz();

  21.         for (i=0; i<30000; i++);

  22.     }

  23. }



  24. void OpenBuzz(unsigned int frequ)

  25. {

  26.     unsigned int reload;



  27.     reload = 65536 - (11059200/12) / (frequ*2);  //由给定频率值计算定时器重载值

  28.     T0LoadH = reload >> 8;  //16位重载值分解为高低两个字节

  29.     T0LoadL = reload;

  30.     TH0 = 0xFF;   //设定一个接近溢出的初值,以使定时器马上投入工作

  31.     TL0 = 0xFE;

  32.     ET0 = 1;   //使能T0中断

  33.     TR0 = 1;   //启动T0

  34. }

  35. void StopBuzz()

  36. {

  37.     ET0 = 0;   //禁用T0中断

  38.     TR0 = 0;   //停止T0

  39. }



  40. void InterruptTimer0() interrupt 1

  41. {

  42.     TH0 = T0LoadH;  //溢出后进入中断重新赋值

  43.     TL0 = T0LoadL;

  44.     BUZZ = ~BUZZ; //反转蜂鸣器控制电平

  45. }
复制代码

这个为版主的C,下面为我写的汇编,已下载HEX文件到开发板可以正常发声了(驱动无源蜂鸣器,蜂鸣器为P1.0)
  1. BUZZ           BIT   P1.0
  2. ORG   0000H
  3. LJMP  START
  4. ORG   000BH  ;定时器0入口
  5. LJMP  ZHONGDUAN;跳转到定时中断

  6. START:
  7.         MOV  TMOD ,#01H ; 使用定时器T0
  8.         SETB  EA        ;开启总中断

  9.                
  10. MAIN:      
  11.         LCALL OPENBUZZ   ;调用开启无源蜂鸣器
  12.         LCALL YS1         ;延时下
  13.         LCALL STOPBUZZ  ;关闭蜂鸣器
  14.         LCALL YS1   ;延时下
  15.         LCALL OPENBUZZ ;再开启蜂鸣器
  16.         LCALL YS1     ;延时下
  17.         LCALL STOPBUZZ ;关闭蜂鸣器
  18.         LCALL YS1            ;再延时
  19.         LJMP  MAIN   ;如此循环
  20. OPENBUZZ:
  21.         MOV   TH0,#0FFH        ;定时时间在65536-65350=186US
  22.         MOV   TL0,#046H  ;根据你蜂鸣器的频率不同,调节定时时间
  23.         SETB  ET0 ;开启定时器中断
  24.         SETB  TR0 ;开启定时器
  25.         RET
  26. STOPBUZZ:        CLR        ET0  ;关闭定时器中断和关闭定时器,蜂鸣器将不会鸣叫
  27.                 CLR        TR0
  28.                 RET
  29. ZHONGDUAN:        MOV TH0,#0FFH  ;给T0的重现赋初值
  30.                 MOV TL0,#046H
  31.                 CPL  BUZZ        ;对蜂鸣器进行取反
  32.                 RETI   
  33.                
  34. YS1:        MOV  R7,#20                     ;延时子程序,时间长可以更改R6或R5的值。
  35. D1:        MOV  R6,#200
  36. D2:        MOV  R5,#100
  37. D3:        DJNZ R5,D3
  38.         DJNZ R6,D2
  39.         DJNZ R7,D1
  40.         RET
  41.         END
复制代码

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:101808 发表于 2018-10-26 10:14 | 显示全部楼层
佩服现在还用汇编的大仙!了不起啊
回复

使用道具 举报

ID:276663 发表于 2018-10-26 12:25 | 显示全部楼层
首先要恭喜了,看了你之前的帖子,很用心的去学习单片机。

有个疑问:
为什么学习单片机,你选择了汇编语言入门?
相对于汇编,C语言更适合单片机入门使用。因此,网上入门的各种代码大部分都是C语言写的,如果用C,一个你可以参考的例程更多,一个易于和其他人交流讨论(毕竟别人不能懂你的汇编也没法讨论)。
回复

使用道具 举报

ID:73182 发表于 2018-10-26 16:26 | 显示全部楼层
同意楼上,汇编发个声音确实都好麻烦,自学的还是C比较方便,汇编没那条件
回复

使用道具 举报

ID:218360 发表于 2018-10-26 17:49 | 显示全部楼层
IdeaMing 发表于 2018-10-26 12:25
首先要恭喜了,看了你之前的帖子,很用心的去学习单片机。

有个疑问:

因我们公司的软件工程师是汇编,想看协助他,必须看的懂汇编语言,或者理解汇编的使用,原本就是学C,我们软件工程师说,我是写汇编,你学汇编,不懂可以问我
回复

使用道具 举报

ID:218360 发表于 2018-10-26 17:50 | 显示全部楼层
zhaozonghui 发表于 2018-10-26 10:14
佩服现在还用汇编的大仙!了不起啊

领导用的就是汇编,用C他看不懂,也教不了我,他的软件我也没有办法协助他,所以就还是汇编了
回复

使用道具 举报

ID:276663 发表于 2018-10-29 09:20 | 显示全部楼层
打杂的 发表于 2018-10-26 17:49
因我们公司的软件工程师是汇编,想看协助他,必须看的懂汇编语言,或者理解汇编的使用,原本就是学C,我 ...

这么说,你遇到的这些基本问题,问他吧,如果他有耐心教教你,学的也很快,可是看你所有的帖子,从去年7月吧,到现在感觉还是没起步。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表