/*-----------------------------------------------
名称:IIC协议 PCF8591ADDA转换
论坛:www.doflye.net
编写:shifang
日期:2009.5
修改:无
内容:通过DA输出电压变化控制喇叭声音音量,P1.0用杜邦线连接J42 B1端子
J33插针OUT信号端用一根杜邦线连接到J51插针PWM/DAC Signal IN端子。本程序适用于LY-51S V2.2版本开发板
现象:喇叭声音由弱到强连续变化。
------------------------------------------------*/
#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; //取反喇叭,产生固定频率方波,驱动喇叭发声
}