#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 #include <intrins.h> //包含NOP空指令函數(shù)_nop_(); #define AddWr 0x90 //寫數(shù)據(jù)地址 #define AddRd 0x91 //讀數(shù)據(jù)地址 sbit Sda=P2^1; //定義總線連接端口 根據(jù)此定義連接杜邦線 sbit Scl=P2^0; sbit spk=P1^2; //喇叭端口/*------------------------------------------------ 延時(shí)程序------------------------------------------------*/ void mDelay(unsigned char j) { unsigned int i; for(;j>0;j--) { for(i=0;i<125;i++) {;} } }/*------------------------------------------------ 初始化定時(shí)器1------------------------------------------------*/void Init_Timer1(void){ TMOD |= 0x10; TH1=(65536-500)/256; //初始化值 TL1=(65536-500)%256; //PT1=1; //優(yōu)先級 EA=1; //中斷使能 ET1=1; //定時(shí)器中斷使能 TR1=1; //打開定時(shí)器} /*------------------------------------------------ 啟動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; }/*------------------------------------------------ 應(yīng)答IIC總線------------------------------------------------*/ void Ack(void) { Sda=0;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------ 發(fā)送一個(gè)字節(jié)------------------------------------------------*/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數(shù)模轉(zhuǎn)換值------------------------------------------------*/ void DAC(unsigned char Data) { Start(); Send(AddWr); //寫入芯片地址 Ack(); Send(0x40); //寫入控制位,使能DAC輸出 Ack(); Send(Data); //寫數(shù)據(jù) Ack(); Stop(); }/*------------------------------------------------ 主程序------------------------------------------------*/void main(){unsigned char num; //DA數(shù)模輸出變量 Init_Timer1();while(1) { DAC(num); //DA輸出,可以用LED模擬電壓變化 num++; //累加,到256后溢出變?yōu)?,往復(fù)循環(huán)。顯示在LED上亮度逐漸變化 mDelay(20); //延時(shí)用于清晰看出變化 }}/*------------------------------------------------ 定時(shí)器中斷程序------------------------------------------------*/void Timer1_isr(void) interrupt 3 using 1//定時(shí)器1{ TH1=(65536-500)/256;//重裝初始化值 TL1=(65536-500)%256; spk=!spk; //取反喇叭,產(chǎn)生固定頻率方波,驅(qū)動喇叭發(fā)聲 }
新聞熱點(diǎn)
疑難解答