单片机喇叭音量调节

2019-04-15 19:29发布

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include //包含NOP空指令函数_nop_(); #define AddWr 0x90 //写数据地址 #define AddRd 0x91 //读数据地址 sbit Sda=P2^1; //定义总线连接端口 根据此定义连接杜邦线 sbit Scl=P2^0; sbit spk=P1^2; //喇叭端口 /*------------------------------------------------ 延时程序 ------------------------------------------------*/ void mDelay(unsigned char j) { unsigned int i; for(;j>0;j--) { for(i=0;i<125;i++) {;} } } /*------------------------------------------------ 初始化定时器1 ------------------------------------------------*/ void Init_Timer1(void) { TMOD |= 0x10; TH1=(65536-500)/256; //初始化值 TL1=(65536-500)%256; //PT1=1; //优先级 EA=1; //中断使能 ET1=1; //定时器中断使能 TR1=1; //打开定时器 } /*------------------------------------------------ 启动IIC总线 ------------------------------------------------*/ void Start(void) { Sda=1; _nop_(); Scl=1; _nop_(); Sda=0; _nop_(); Scl=0; } /*------------------------------------------------ 停止IIC总线 ------------------------------------------------*/ void Stop(void) { Sda=0; _nop_(); Scl=1; _nop_(); Sda=1; _nop_(); Scl=0; } /*------------------------------------------------ 应答IIC总线 ------------------------------------------------*/ void Ack(void) { Sda=0; _nop_(); Scl=1; _nop_(); Scl=0; _nop_(); } /*------------------------------------------------ 发送一个字节 ------------------------------------------------*/ void Send(unsigned char Data) { unsigned char BitCounter=8; unsigned char temp; do { temp=Data; Scl=0; _nop_(); if((temp&0x80)==0x80) Sda=1; else Sda=0; Scl=1; temp=Data<<1; Data=temp; BitCounter--; } while(BitCounter); Scl=0; } /*------------------------------------------------ 写入DA数模转换值 ------------------------------------------------*/ void DAC(unsigned char Data) { Start(); Send(AddWr); //写入芯片地址 Ack(); Send(0x40); //写入控制位,使能DAC输出 Ack(); Send(Data); //写数据 Ack(); Stop(); } /*------------------------------------------------ 主程序 ------------------------------------------------*/ void main() { unsigned char num; //DA数模输出变量 Init_Timer1(); while(1) { DAC(num); //DA输出,可以用LED模拟电压变化 num++; //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化 mDelay(20); //延时用于清晰看出变化 } } /*------------------------------------------------ 定时器中断程序 ------------------------------------------------*/ void Timer1_isr(void) interrupt 3 using 1//定时器1 { TH1=(65536-500)/256;//重装初始化值 TL1=(65536-500)%256; spk=!spk; //取反喇叭,产生固定频率方波,驱动喇叭发声 }