ATMEGA8单片机同步串行接口SPI的C语言编程.zip
        
        
           
           
                  时间:10-30 16:31
                  查看:1505次
                  下载:162次
           
           
                      
           
		          
                   简介:
本资料为ATMEGA8单片机同步串行接口SPI的C语言编程源代码。
/********************************************************************
 计算机通过RS232接口向计算机发送1,2,3,4四个数据。单片机收
到四个数据后在数码管上动态显示出来,然后单片机向计算机发送a,b,c,d,四
个字符,使用着通过“串口调试助手 ”等软件观察数据传输过程
*********************************************************************/
#include <iom16v.h>
#include <macros.h>
/********************************************************************
 数据类型定义
*********************************************************************/
#define uchar unsigned char
#define uint unsigned int
/********************************************************************
 数码管段码定义0123456789
*********************************************************************/
uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Data[4]={0,0,0,0}; 
/**********************************************************************
 MS级延时函数程序,参数i 延时时间 
**********************************************************************/ 
void DelayMs(uint i) //Ms级延时,参数i为延时时间
{uint j;
 for(;i!=0;i--)
 {for(j=8000;j!=0;j--) {;}}
}
/**********************************************************************
 显示函数 
注意:使用开发板时sel=0xef;
**********************************************************************/
void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
{uchar i,sel=0xef; 
 for(i=0;i<4;i++)
 {PORTC=sel; //选通最右边的数码管
 PORTA=~Table[p[i]]; //送字型码
 DelayMs(1); //显示延时 
 sel=sel<<1; //移位以显示前一位
 }
}
/**********************************************************************
 初始化
**********************************************************************/
void DelayNOP(uchar i)
{for(;i!=0;i--) 
 { NOP();}
} 
/**********************************************************************
 数据格式转换
**********************************************************************/
void Convert(uchar *p,uchar i)
{p[0]=0; //设实验室条件为正温度
 p[1]=i/100;
 p[2]=(i-p[1]*100)/10;
 p[3]=i-p[1]*100-p[2]*10;
}
/**********************************************************************
 写数据函数 
 功能:向DS1722指定地址Address写一字节数据Date
**********************************************************************/
void Write_Byte(uchar Address,uchar Data)
{uchar clear;
 PORTB=PORTB|0x10; //使能SPI器件
 SPDR=Address; //送地址启动SPI时钟
 while(!(SPSR&0x80)) {;}//等待数据发送完成
 clear=SPSR; //清除发送标志位 
 clear=SPDR; //清除发送标志位 
 SPDR=Data; //发送数据,启动SPI时钟
 while(!(SPSR&0x80)) {;}//等待数据发送完成
 clear=SPSR; //清除发送标志位 
 clear=SPDR; //清除发送标志位 
 PORTB=PORTB&0xef; //禁止SPI器件
}
/**********************************************************************
 读数据函数 
 功能:从DS1722指定地址Address读取一字节数据Date
**********************************************************************/
uchar Read_Byte(uchar Address)
{uchar clear;
 uchar Data;
 PORTB=PORTB|0x10; //使能SPI器件
 SPDR=Address; //送地址启动SPI时钟
 while(!(SPSR&0x80)) {;}//等待数据发送完成
 clear=SPSR; //清除发送标志位 
 clear=SPDR; //清除发送标志位
 SPDR=Address;//发空数据,启动数据发送以接收数据
 while(!(SPSR&0x80)) {;}//等待数据发送/接收完成
 clear=SPSR; //清除发送标志位 
 Data=SPDR; //接收数据
 PORTB=PORTB&0xef; //禁止SPI器件
 return(Data); //温度值返回
}
/**********************************************************************
 初始化I/O口 
**********************************************************************/
void Init_IO(void) //初始化I/O口
{DDRA=0xff; //设置A口为推挽1输出
 PORTA=0xff;
 DDRC=0xff; //设置C口为推挽1输出 
 PORTC=0xff;
 DDRC=0xbf; //设置C口为推挽1输出 
 PORTC=0xbf;
 }
/**********************************************************************
 主函数 
**********************************************************************/
void main(void)
{
uchar value;
Init_IO();
SPCR=0x5c;//使能SPC功能,
 Write_Byte(0x80,0xf0);//DS1722工作于自由转换模式,8位分辨率
 while(1)
 {
 value=Read_Byte(0x01);//读取温度数据寄存器低位数据
 value=Read_Byte(0x02);//读取温度数据寄存器高位数据
 Convert(Data,value);//温度数据格式转换
 Display(Data);//温度数据显示
 }
 }
/**********************************************************************
 结束 
**********************************************************************/