⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dac.c

📁 为苏州一家公司所做的的恒温恒湿车间控制 系统
💻 C
字号:
/*-------------------------------------------------------*
*(1)TLV5608Init:TLV5608初始化
*(2)TLV5608Z:1路DA转换子程序                             *
*(3)DAC:2片TLV5608转换                                   *
*-------------------------------------------------------*/
//[包含头文件]
#include "Includes.h"
//[包含外部函数]
void Delay(void);
/*SPIInit:SPI初始化子程序-------------------------------*
*功 能:对SPI进行初始化,默认为允许SPI,主机工作方式,时钟  *
*      空闲低电平,比特率2分频,                         *
*      波特率为CGMOUT/2*BD(设CGMOUT=2*fBUS=2*2.4576MHz)*
*参 数:无                                               *
*返 回:无                                               *
*------------------------------------------------------*/
#include "Includes.h"
void DA_SPIInit(void)
 {  
	SPCR=0b00100010;   //不产生中断、主机方式、时钟空闲低电平
	SPSCR=0b00000000;  //2分频
 }
/*D/A转换子程序(DAC.c)-----------------------------------*
*功能:将TLV5608(0)-(1)片,共16通道的数字量转换为模拟量  *
*入口:value--2片5608、16路通道的数字量值                *
*调用:TLV5608Z                                          *
*-------------------------------------------------------*/
void DAC(INT16U *value)
{  
  INT8U i;
  //TLV5608初始化
  TLV5608Init();
  for(i=1;i<=16;i++)
    TLV5608Z(i,*(value+i-1));
}
/*TLV5608芯片D/A转换初始化子程序(TLV5608Init.c)-----------------*
*功  能:初始化2片TLV5608的CTRL0、CTRL1寄存器                    *
*参  数:无                                                      *
*返  回:无                                                      *
*--------------------------------------------------------------*/
void TLV5608Init(void)
{
  INT8U fs;
  for(fs=0;fs<=1;fs++)
  {
  	CS_D |=0b00001100;  //定义PTC2~3为输出
  	CS_P |=0b00001100;  //PTC2~3输出为高电平
 	//设置CTRL0寄存器  	
    CS_P &= ~(1<<(fs+2));   //相应片TLV.FS由高电平变为低电平,产生下降沿
                      //此后在每个SCLK的下降沿传送一位数据,共传输16位数据  
    Delay();          //延时20个时钟周期          
    SPIDR=0b10000000;       //发送高8位数据(CTRL0地址为1000)  
  	while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
                                             //发送完毕 
  	SPIDR=0b00000000;       //发送低8位数据
  	while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
                                             //发送完毕                                                  
    asm("nop"); 
    asm("nop");                                              
  	CS_P |= (1<<(fs+2));   //数据传输完毕,相应片TLV.FS由低电平变为高电平  
  	
  	
  	//设置CTRL1寄存器   	
  	CS_P &= ~(1<<(fs+2));   //相应片TLV.FS由高电平变为低电平,产生下降沿
                      //此后在每个SCLK的下降沿传送一位数据 
    Delay();          //延时20个时钟周期        
    SPIDR=0b10010000;       //发送高8位数据(CTRL1地址为1001)
  	while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
                                             //发送完毕 
  	SPIDR=0b00001111;       //发送低8位数据(正常电压,快速)
  	while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
                                             //发送完毕                                             
  	CS_P |= (1<<(fs+2));   //数据传输完毕,相应片TLV.FS由低电平变为高电平
  }                                    
}
/*TLV5608芯片D/A转换子程序(TLV5608Z.c)--------------------------*
*TLV5608的接线:                                                 *
*             ① SCLK(3)接MC08HC908GP32的SPSCK(18)              *
*             ② DIN(2)接MC08HC908GP32的MISO(17)                *
*             ③ LDAC(18)接MC08HC908GP32的PTC4                  *
*             ④ 0-1片FS(4作为片选信号)接分别接的PTC2~3         *
*                MODE接高电平,选择uC模式                       *
*入口:channel-通道号(1-16),buf-存放数据                        *
*--------------------------------------------------------------*/
void TLV5608Z(INT16U channel, INT16U buf)
{
  INT8U fs;//片选号
  INT16U value;
  channel=1;
  if((channel>0)&&(channel<9))
     fs=0;
  else
     fs=1; 
  //整合要发送的16位数据-(value的高4位为通道号,后12位为数据位)  
  value=((channel-fs*8-1)<<12)|buf;
  //发送16位数据
  CS_D |=0b00001100;  //定义PTC2~3为输出
  CS_P |=0b00001100;  //PTC2~3输出为高电平
  	
  //TLV5608.FS=1    
  CS_P &= ~(1<<(fs+2));   //相应片TLV.FS由高电平变为低电平,产生下降沿
                      //此后在每个SCLK的下降沿传送一位数据  
  Delay();           //延时20个时钟周期                       
  SPIDR=value>>8;       //发送高8位数据 
  while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
                                             //发送完毕 
  SPIDR=value;         //发送低8位数据
  while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1 
                                             //发送完毕
  asm("nop");
  CS_P |= (1<<(fs+2));   //数据传输完毕,相应片TLV.FS由低电平变为高电平              
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -