ATMEGA8单片机同步串行接口SPI的C语言编程.zip
时间:10-30 16:31
查看:1367次
下载: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);//温度数据显示
}
}
/**********************************************************************
结束
**********************************************************************/