第8章 让开发板发出声音,蜂鸣器驱动

8让开发板发出声音,蜂鸣器驱动

心得体会

在目录下创建一个Makefile文件

先运行make clean命令清楚到编译生成的一些工程文件,执行make命令,重新编译驱动程序。将编译生成的buzzer.ko内核镜像文件拷贝出来,adb push buzzer.ko /fpga/moudles

然后插入内核镜像文件到系统中,insmod buzzer.ko,并且装载设备驱动程序,mknod  /dev/buzzer c 248 0

现在就可以在库层直接编写C/C++文件来调用这个驱动程序,这个可以在ubuntu中安装NDK编译环境,新建buzzer文件,编译生成一个库文件,那样就可以直接在应用层使用这个库提供的JNI方法,那样调用会显得更加的简单,当然这个调用方式google并不提倡,我在这里只是想展示这种调用方式而已

构建一个jni工程,新建一个buzzer.c的源文件

进行NDK编译,生成libbuzzer.so,这个库就可以直接在应用层进行调用

  1. #include <reg52.h>
  2. sbit BUZZ = P1^6; //蜂鸣器控制引脚
  3. unsigned char T0RH = 0; //T0 重载值的高字节
  4. unsigned char T0RL = 0; //T0 重载值的低字节
  5. void OpenBuzz(unsigned int frequ);
  6. void StopBuzz();
  7. void main(){
  8. unsigned int i;
  9. TMOD = 0x01; //配置 T0 工作在模式 1,但先不启动
  10. EA = 1;
  11. while (1){ //使能全局中断
  12. OpenBuzz(4000); //以 4KHz 的频率启动蜂鸣器
  13. for (i=0; i<40000; i++);
  14. StopBuzz(); //停止蜂鸣器
  15. for (i=0; i<40000; i++);
  16. OpenBuzz(1000); //以 1KHz 的频率启动蜂鸣器
  17. for (i=0; i<40000; i++);
  18. StopBuzz(); //停止蜂鸣器
  19. for (i=0; i<40000; i++);
  20. }
  21. }
  22. /* 蜂鸣器启动函数,frequ-工作频率 */
  23. void OpenBuzz(unsigned int frequ){
  24. unsigned int reload;//计算所需的定时器重载值
  25. reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值
  26. T0RH = (unsigned char)(reload >> 8); //16 位重载值分解为高低两个字节
  27. T0RL = (unsigned char)reload;
  28. TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作
  29. TL0 = 0xFE;
  30. ET0 = 1; //使能 T0 中断
  31. TR0 = 1; //启动 T0
  32. }
  33. /* 蜂鸣器停止函数 */
  34. void StopBuzz(){
  35. ET0 = 0; //禁用 T0 中断
  36. TR0 = 0; //停止 T0
  37. }
  38. /* T0 中断服务函数,用于控制蜂鸣器发声 */
  39. void InterruptTimer0() interrupt 1{
  40. TH0 = T0RH; //重新加载重载值
  41. TL0 = T0RL;
  42. BUZZ = ~BUZZ; //反转蜂鸣器控制电平
  43. }
 

posted on 2016-07-03 16:17  茵纸  阅读(559)  评论(0编辑  收藏  举报

导航