《单片机实践项目》《电子DIY》基于单片机+PCF8591的PWM呼吸灯(DA输出)设计,Proteus仿真,实物制作

程序:


#include<reg52.h>    
#include <intrins.h> 

#define AddWr 0x90   
#define AddRd 0x91   

sbit RST=P2^4;   
sbit Sda=P2^0;    
sbit Scl=P2^1;
sbit Fm=P2^3;	
sbit dula=P2^6;
sbit wela=P2^7;


void mDelay(unsigned char j)
{
    
    
	unsigned int i;
	for(;j>0;j--)
	{
    
    
	for(i=0;i<125;i++)
	{
    
    ;}
	}
}

void Start(void)
{
    
    
	Sda=1;
	_nop_();
	Scl=1;
	_nop_();
	Sda=0;
	_nop_();
	Scl=0;
}

void Stop(void)
{
    
    
	Sda=0;
	_nop_();
	Scl=1;
	_nop_();
	Sda=1;
	_nop_();
	Scl=0;
}

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;
}

void DAC(unsigned char Data)
{
    
    
	Start();
	Send(AddWr); 
	Ack();
	Send(0x40);  
	Ack();
	Send(Data);  
	Ack();
	Stop();
}

void cmg(void)
{
    
    
	dula=1;
	P0=0x00;
	dula=0;
	wela=1;
	P0=0x00;
	wela=0;
	RST=0;		
}

void main(void)
{
    
    
	unsigned char i;                  
	Fm=1;
	cmg();
	while(1)
	{
    
    
		for(i=0;i<255;i++)
		{
    
        
			DAC(i);    
			mDelay(20);    
		}
		for(i=255;i>0;i--)
		{
    
        
			DAC(i);    
			mDelay(20);    
		}
	}
}
//视频讲解:B站搜素:“逗比小憨憨”


猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/107675291