查看: 944|回复: 0
打印 上一主题 下一主题

018、同步串行接口SPI的C语言编程-无仿真

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-29 20:53:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/********************************************************************
                            汇诚科技
网址:http://www.ourhc.cn
产品有售淘宝店:http://shop36330473.taobao.com   
*********************************************************************/
/********************************************************************
    计算机通过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];          //送字型码
   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);//温度数据显示
}
}
/**********************************************************************
                                                 结束               
**********************************************************************/





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表