当前位置:   article > 正文

51蜂鸣器_51单片机蜂鸣器代码

51单片机蜂鸣器代码

1.蜂鸣器产生声音

main.c

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "Key.h"
  4. #include "Nixie.h"
  5. sbit Buzzer=P2^5;//看原理图找引脚
  6. unsigned int i;
  7. unsigned char KeyNum;
  8. void main()
  9. {
  10. Nixie(1,0);
  11. while(1)
  12. {
  13. KeyNum=Key();
  14. if(KeyNum)
  15. {
  16. for(i=0;i<100;i++)
  17. {
  18. Buzzer=!Buzzer;//蜂鸣器产生振动声音;只是产生一次,循环让它持续产生;
  19. Delay(1);//取反就是产生声音;
  20. }
  21. Nixie(1,KeyNum);
  22. }
  23. }
  24. }

Nixie.c  数码管显示

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. //数码管段码表
  4. unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  5. /**
  6. * @brief 数码管显示
  7. * @param Location 要显示的位置,范围:1~8
  8. * @param Number 要显示的数字,范围:段码表索引范围
  9. * @retval 无
  10. */
  11. void Nixie(unsigned char Location,Number)
  12. {
  13. switch(Location) //位码输出
  14. {
  15. case 1:P2_4=1;P2_3=1;P2_2=1;break;
  16. case 2:P2_4=1;P2_3=1;P2_2=0;break;
  17. case 3:P2_4=1;P2_3=0;P2_2=1;break;
  18. case 4:P2_4=1;P2_3=0;P2_2=0;break;
  19. case 5:P2_4=0;P2_3=1;P2_2=1;break;
  20. case 6:P2_4=0;P2_3=1;P2_2=0;break;
  21. case 7:P2_4=0;P2_3=0;P2_2=1;break;
  22. case 8:P2_4=0;P2_3=0;P2_2=0;break;
  23. }
  24. P0=NixieTable[Number]; //段码输出
  25. // Delay(1); //显示一段时间
  26. // P0=0x00; //段码清0,消影
  27. }

Nixie.h

  1. #ifndef __NIXIE_H__
  2. #define __NIXIE_H__
  3. void Nixie(unsigned char Location,Number);
  4. #endif

形成一个连续的音乐:主要依托定时器来完成;

main.c

思路:定义一个音乐的数组,再定义一个新的变量,让变量在while(1)中进行++,保证数组中进行递进,简单来说就是第一个音符发出声音以后,能够++  来到下一个音符,Delay进行延迟,如果需要不同音符之间产生间隙,需要TR0=0然后再置1,;

最后插入定时器中断函数,定时器的作用就是保证每过一秒中断就启动一次;将新定义的变量放进数组中,保证每次中断都能调用数组中的音符;

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "Timer0.h"
  4. sbit Buzzer=P2^5;
  5. unsigned int FreqTable[]={
  6. 63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
  7. 64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
  8. 65058,65085,65110,65134,65157,65178,65198,65217};
  9. unsigned char FreqSelect;
  10. void main()
  11. {
  12. Timer0_Init();
  13. while(1)
  14. {
  15. FreqSelect++;
  16. Delay(500);
  17. TR0=0;//每发出一个声音以后,关闭-延迟-打开,保证音符与音符之间停顿;
  18. Delay(5);
  19. TR0=1;
  20. }
  21. }
  22. void Timer0_Routine() interrupt 1 //定时器设置的是1毫秒,表示每一毫秒就会过来一次中断;
  23. {
  24. TL0=FreqTable[FreqSelect]%256; //设置定时初值
  25. TH0=FreqTable[FreqSelect]/256; //设置定时初值
  26. Buzzer=!Buzzer;
  27. }

2.AT24C02--数据存储芯片(I2C总线)

AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息;简单来说就是实现断电以后保存数据的功能,保证下次开机后可以直接使用;通讯接口:I2C总线;容量:256字节;

存储器分易失性存储器RAM和非易失性存储器ROM;通常用于较快的存储功能时,我们会使用RAM,需要永久保存时,我们会使用ROM;

SRAM:静态RAM;DRAM:动态RAM;

MaskROM:掩膜ROM;PROM:可编程ROM;EPROM:可擦除可编程ROM;E2PROM:电可擦除可编程ROM;Flash:闪存;硬盘、软盘、光盘;        

I2C总线是一种通用数据总线;类似于一种通讯协议;包含两根通讯线:SCL和SDA;实现多个设备进行通讯;

I2C时序结构:

起始条件:SCL高电平期间,SDA从高电平切换到低电平;

终止条件:SCL高电平期间,SDA从低电平切换到高电平;

发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上,然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节;

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上,然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节;主机在接收之前,需要释放SDA;

发送应答:数据在接收以后会有一个发送应答;简单来说就是接收完成一个字节后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答;

接收应答:数据在发送完成以后会有一个接收应答;简单来说就是发送完成一个字节以后,主机在下一个时钟接收一位数据,数据0表示应答,数据1表示非应答;(主机在接收之前,需要释放SDA);

字节写:在WORD ADDRESS处写入数据DATE;

随机读:读出WORD ADDRESS处的数据DATE;

数据存储功能:

main.c

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "LCD1602.h"
  4. #include "Key.h"
  5. #include "AT24C02.h"
  6. unsigned char KeyNum;
  7. unsigned int Num;
  8. void main()
  9. {
  10. LCD_Init();
  11. LCD_ShowNum(1,1,Num,5);
  12. while(1)
  13. {
  14. KeyNum=Key();
  15. if(KeyNum==1)
  16. {
  17. Num++;
  18. LCD_ShowNum(1,1,Num,5);
  19. }
  20. if(KeyNum==2)
  21. {
  22. Num--;
  23. LCD_ShowNum(1,1,Num,5);
  24. }
  25. if(KeyNum==3)//K3按键,向AT24C02写入数据
  26. {
  27. AT24C02_WriteByte(0,Num%256);//Num%256表示低四位
  28. Delay(5);
  29. AT24C02_WriteByte(1,Num/256);
  30. Delay(5);
  31. LCD_ShowString(2,1,"Write OK");
  32. Delay(1000);
  33. LCD_ShowString(2,1," ");
  34. }
  35. if(KeyNum==4)//K4按键,从AT24C02写读取数据
  36. {
  37. Num=AT24C02_ReadByte(0);
  38. Num|=AT24C02_ReadByte(1)<<8;
  39. LCD_ShowNum(1,1,Num,5);
  40. LCD_ShowString(2,1,"Read OK");
  41. Delay(1000);
  42. LCD_ShowString(2,1," ");
  43. }
  44. }
  45. }

I2C.c

  1. #include <REGX52.H>
  2. sbit I2C_SCL=P2^1;
  3. sbit I2C_SDA=P2^0;
  4. void I2C_Start(void)//起始条件
  5. {
  6. I2C_SDA=1;//保证初始条件两个都是高的
  7. I2C_SCL=1;
  8. I2C_SDA=0;
  9. I2C_SCL=0;
  10. }
  11. void I2C_Stop(void)//终止条件
  12. {
  13. I2C_SDA=0;
  14. I2C_SCL=1;
  15. I2C_SDA=1;
  16. }
  17. void I2C_SendByte(unsigned char Byte)//发送字节无返回值
  18. {
  19. unsigned char i;
  20. for(i=0;i<8;i++)
  21. {
  22. I2C_SDA=Byte&(0x80>>i);
  23. I2C_SCL=1;
  24. I2C_SCL=0;
  25. }
  26. }
  27. unsigned char I2C_ReceiveByte(void)//接收字节需要有返回值
  28. {
  29. unsigned char i,Byte=0x00;
  30. I2C_SDA=1;//主机在接收之前,需要释放一个字节;
  31. for(i=0;i<8;i++)
  32. {
  33. I2C_SCL=1;//开始读取字节;
  34. if(I2C_SDA){Byte|=(0x80>>i);}//如果SDA是1,开始读取,最高位置1,否则Byte初始化值为0;
  35. I2C_SCL=0;//|运算符的意思就是说SCL高电平开始发送,在高电平状态下进行接收,所以置1;
  36. }
  37. return Byte;
  38. }
  39. void I2C_SendACK(unsigned char Sendbit)//发送字节-bit和unsigned char意义一样,不过unsigned char是8位,bit是一位;
  40. {//发送应答
  41. I2C_SDA=Sendbit;
  42. I2C_SCL=1;
  43. I2C_SCL=0;
  44. }
  45. unsigned char I2C_ReceiveACK(void)//接收应答有返回值
  46. {
  47. unsigned char Receivebit;
  48. I2C_SDA=1;//接收时SDA先释放;
  49. I2C_SCL=1;
  50. Receivebit=I2C_SDA;
  51. I2C_SCL=0;
  52. return Receivebit;
  53. }

I2C.h

  1. #ifndef _I2C__H_
  2. #define _I2C__H_
  3. void I2C_Start(void);
  4. void I2C_Stop(void);
  5. void I2C_SendByte(unsigned char Byte);
  6. unsigned char I2C_ReceiveByte(void);
  7. void I2C_SendACK(unsigned char Sendbit);
  8. unsigned char I2C_ReceiveACK(void);
  9. #endif

AT24C02.c

  1. #include <REGX52.H>
  2. #include "I2C.h"
  3. #define AT24C02_ADDRESS 0xA0 //AT24C02的固定地址为1010,所以ADDRESS+W为0xA0,ADDRESS+R为0xA1;
  4. void AT24C02_WriteByte(unsigned char WordAddress,Date)//字节写
  5. {
  6. I2C_Start();
  7. I2C_SendByte(AT24C02_ADDRESS);
  8. I2C_ReceiveACK();
  9. I2C_SendByte(WordAddress);
  10. I2C_ReceiveACK();
  11. I2C_SendByte(Date);
  12. I2C_ReceiveACK();
  13. I2C_Stop();
  14. }
  15. unsigned char AT24C02_ReadByte(unsigned char WordAddress)//字节读
  16. {
  17. unsigned char Date;
  18. I2C_Start();
  19. I2C_SendByte(AT24C02_ADDRESS);
  20. I2C_ReceiveACK();
  21. I2C_SendByte(WordAddress);
  22. I2C_ReceiveACK();
  23. I2C_Start();
  24. I2C_SendByte(AT24C02_ADDRESS|0x01);
  25. I2C_ReceiveACK();
  26. Date=I2C_ReceiveByte();
  27. I2C_SendACK(0x01);
  28. I2C_Stop();
  29. return Date;
  30. }

AT24C02.h

  1. #ifndef _AT24C02__H_
  2. #define _AT24C02__H_
  3. void AT24C02_WriteByte(unsigned char WordAddress,Date);
  4. unsigned char AT24C02_ReadByte(unsigned char WordAddress);
  5. #endif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/554290
推荐阅读
相关标签
  

闽ICP备14008679号