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

📄 spi源程序.txt

📁 AVR单片机 C语言程序设计经典实用
💻 TXT
字号:
#include <iom8v.h>
#include <macros.h>
#include <stdio.h>
#include <math.h>
void port_init(void);//端口初始化函数
void uart_init(void);//M8串口初始化函数
void init_devices(void);//整个设备初始化函数
void delay_1ms(void);//延时1ms程序
void delay(unsigned int n);//延时n毫秒程序
unsigned int p10x(unsigned int i);//自制10的N次方函数
void SPI_MasterInit(void);//SPI端口初始化函数
unsigned char SPI_TranByte(unsigned char );//SPI传送命令字以及接收转换结果的函数
void Format_tran(unsigned int data1,unsigned int data2);// 把转换结果从整型数转化为相应字                                                        // 符串并从串口发到PC的函数

void main()
{
 unsigned int addata = 0 ;//接收转换结果的变量
 unsigned char adcl = 0 ;//转换结果高字节
 unsigned char adch = 0 ;//转换结果低字节
 unsigned char CtrlByte = 0;//定义控制字
 OSCCAL = 0xA3;
 init_devices();
 UCSRA &= 0B00100000;

 PORTB |=0B00000100;//片选禁止
 PORTB &=0B11111011; //片选使能
 delay_1ms();
 while(1)
  {     addata = 0 ;
        adcl = 0 ;
	adch = 0 ;
	CtrlByte = 0B00001100;//选择外部模拟输入通道0,16位分辨率,高字节先进入
        adch =  SPI_TranByte(CtrlByte);
	adcl = SPI_TranByte(CtrlByte);
	addata |= adch;
	addata <<= 8;
	addata |= adcl ;
	Format_tran(addata,0xffff);
	CtrlByte = 0B00011100;//选择外部模拟输入通道1,16位分辨率,高字节先进入
	adch =  SPI_TranByte(CtrlByte);
	adcl = SPI_TranByte(CtrlByte);
	addata |= adch;
	addata <<= 8;
	addata |= adcl ;
	Format_tran(addata,0xffff);
  }
}
 
 
void port_init(void)
{
 PORTB = 0xFF;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0xFF;
 DDRD  = 0x00;
}

//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = 0x86;
 UBRRL = 0x33; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x08;
}

void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 uart_init();
 SPI_MasterInit();
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 //SPI_MasterInit();
 SEI(); //re-enable interrupts
 //all peripherals are now initialised
}

void delay_1ms(void)
{unsigned int i;
 for(i=1;i<(unsigned int)(8000000*143-2);i++)
  ;
}

void delay(unsigned int n)
{unsigned int  i=0;
 for(i=0;i<n;i++)
 delay_1ms();
}


unsigned int p10x(unsigned int i)
{ 
  unsigned int j=0;
  unsigned int result=1;
  for(j=0;j<i;j++)
      result = result * 10;
  return result;
}

void SPI_MasterInit(void)
{
 DDRB = 0B11101111;
 SPCR = 0x50;
}

unsigned char SPI_TranByte(unsigned char bData)
{unsigned char clear = 0;
 SPDR = bData;
 while(!(SPSR & 0x80));
 clear = SPSR;
 return SPDR;
}

void Format_tran(unsigned int data1,unsigned int data2)
{ int i=0;
  unsigned char data[5] = "785j" ;
  data1 =(unsigned int)(((unsigned long)((unsigned long)data1*5000))/data2);
    for(i=0;i<4;i++)
	  {

	   data[i] = data1 / p10x(3-i);
           data1 = data1 - (data1 / p10x(3-i)) / p10x(3-i);
	   data[i] = data[i] + '0';
	   while(!(UCSRA & (1<<UDRE)));
	   UDR = data[i];
	  }
	  
    while(!(UCSRA & (1<<UDRE)));
    UDR = ';';
    while(!(UCSRA & (1<<UDRE)));
    UDR = '\n';
    delay(10);
}

⌨️ 快捷键说明

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