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

📄 5382.c

📁 基于ATMEL的ATMEGA8单片机对5382--DA转换芯片的DRIVER编程。
💻 C
字号:
#include <avr/io.h>
#include <OwnTwi.h>

#define fosc 4000000 //晶振4HZ
#define baud 9600    //波特率

uchar i;
void Wait(void)
{     
    unsigned int us;

   for(us=0;us<2;us++);
}	

/*				微秒级延时程序	  		*/
void delay_us(int time)
{     
  	  do
	  	{
		 time--;
		}	
  	  while (time>1);
}	  

/*	  		    毫秒级延时程序			*/	 
void delay_ms(unsigned int time)
{
	  while(time!=0)
	  	  {		
		   delay_us(30);
		   time--;
		  }
}

uchar Device_Write(uchar slv_addw,uchar Wdata) 
{
  delay_ms(10);  	
  Start();//I2C启动	
  Wait();
  if(TestAck()!=START) return 1;//ACK
   
  Write8Bit(slv_addw);//写I2C从器件地址和写方式
  Wait();
  if(TestAck()!=MT_SLA_ACK) return 1;//ACK
	  
  Write8Bit(Wdata);//写DATA
  Wait();
  if(TestAck()!=MT_DATA_ACK) return 1;//ACK
	   
  delay_ms(10);//延时等Device 写完
  return 0;
}


uchar TMP100_Write(uchar slv_addw,uchar sub_suba,uchar Wdata) 
{
  delay_ms(10);  	
  Start();//I2C启动	
  Wait();
  if(TestAck()!=START) return 1;//ACK
   
  Write8Bit(slv_addw);//写I2C从器件地址和写方式
  Wait();
  if(TestAck()!=MT_SLA_ACK) return 1;//ACK
	  
  Write8Bit(sub_suba);//写地址
  Wait();
  if(TestAck()!=MT_DATA_ACK) return 1;//ACK

  Write8Bit(Wdata);//写DATA
  Wait();
  if(TestAck()!=MT_DATA_ACK) return 1;//ACK
	   
  delay_ms(10);//延时等Device 写完
  return 0;
}

void port_init(void)
{
 PORTB = 0xFF;
 DDRB  = 0xff; //输出口
 PORTC = 0xFF; //m103 output only
 DDRC  = 0xFF; //输出口
 PORTD = 0xF;
 DDRD  = 0xF0;//输出口
}
	
 //init TWI:
void init_twi(void)
{
 //DDRC  = 0x0; //输出口
 //PORTC = 0xFF; //m103 output only
 TWCR=0x0; //disable twi
 TWBR=52;  //TWBR=((F_CPU/(fSCL*(4^TWPS))-16)/2  = (12000000/100000-16)/2=52
 TWSR=00;  //预分频澹:即4^TWPS=1
 TWAR=0;   //set slave address
 TWCR=0x04;//enable twi
}
	
//字符输入函数 	 
unsigned char getchar(void)
{
   while(!(UCSRA& (1<<RXC)));
   return UDR;
}	

//字符输出函数 		  
void putchar(unsigned char c)
{	 
   while (!(UCSRA&(1<<UDRE)));
   UDR=c;    
}
	
//不含回车换行的字符串输出函数 	  
void putstr(char *s)
{
   while (*s)
   {
	putchar(*s);
	s++;
   }	
}
	
//字符串输出函数	   	  
int puts(char *s)
{
   while (*s)
   {
	putchar(*s);
	s++;
   }	
   putchar(0x0a);//回车换行
   putchar(0x0d);
   return 1;
}
	
//UART初始化			 
void uart_init(void)
{
 UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
 UBRRL=(fosc/16/(baud+1))%256;
 UBRRH=(fosc/16/(baud+1))/256;//设置波特率寄存器,以获得波特率为9600
 UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位(无校验)
}


void delay(unsigned char n)
{   

  static unsigned int j;
  for(i=0;i<n;i++)
  for(j=0;j<10000;j++);
}


void DecodeBCD(unsigned int temp)
{
  unsigned char num_bit[3];

  for(i=0;i<3;i++)
  {
   num_bit[2-i]=temp%10;
   temp=temp/10;
  }
  
  /**********将转换结果发送到串行口***********/
  putchar(48+num_bit[0]);   	
  putchar(48+num_bit[1]);	
  putchar(48+num_bit[2]);	 	 

}

void Display_Voltage(uchar data)
{
  float voltage;
  uchar int_digit;  
  voltage=(0.9*3.3*data)/255;
  int_digit=(uchar)voltage;
  voltage-=int_digit;
  //
  DecodeBCD(int_digit);
  putchar('.'); 
  DecodeBCD(voltage*1000);
  
}


// RS232通信及显示结果main函数 //
int main(void)
{
  uchar BufferArry[2];
  uint temperature;
  uchar DAC_Result;
  
  port_init();
  uart_init();
  init_twi();
  DAC_Result=0x0;
  
  puts("Pls Input char 'a' to Add digit to Convert:");
  //putchar(0x0d); putchar(0x0a);//回车换行
  while(1)
  {	 
	  
	  if(getchar()=='a'){	 
	      putchar(0x0d); putchar(0x0a);//回车换行
          DAC_Result+=10;
		  if(DAC_Result>255) DAC_Result=0;
		  puts("The Digit to Convert Is:"); DecodeBCD(DAC_Result);
		  putchar(0x0d); putchar(0x0a);//回车换行
		  ACK_flagr=Device_Write(DEVICE_ADD_WRITE,DAC_Result);//															 
		  puts("Convertion Result Is:"); Display_Voltage(DAC_Result);
		  putchar(0x0d); putchar(0x0a);//回车换行
		  puts("You Can check Right or Error!");
		  putchar(0x0d); putchar(0x0a);//回车换行
	  }
	  else{
		  putchar(0x0d); putchar(0x0a);//回车换行
		  ACK_flagr=Device_Write(DEVICE_ADD_WRITE,DAC_Result);//
		  putchar(0x0d); putchar(0x0a);//回车换行
		  puts("The Digit to Convert Is:"); DecodeBCD(DAC_Result);
		  putchar(0x0d); putchar(0x0a);//回车换行
		  puts("Convertion Result Is:"); Display_Voltage(DAC_Result);
		  putchar(0x0d); putchar(0x0a);//回车换行
		  puts("You Can check Right or Error!");
		  putchar(0x0d); putchar(0x0a);//回车换行
	  }
	  
   }
 
   return 1;
}

⌨️ 快捷键说明

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