#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define sled_dm_port P0
unsigned long int M;
sbit LED =P1^3;
sbit SSN =P1^4;
sbit SCK =P1^7;
sbit SI =P1^5;
sbit SO =P1^6;
sbit INT =P2^3;//中断标志
sbit EN_START=P2^0;
sbit EN_STOP1=P2^1;
sbit EN_STOP2=P2^2;
sbit RST =P2^7;
sbit START =P3^4;
sbit STOP =P2^6;
uchar data0;data1;data2;data3;
uchar code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff}; /*数码管0~9*/
uchar code sw[]={0x00,0x20,0x40,0x60}; //位选数组
void delay(void) //延时子函数
{
uchar a,b;
for(b=1;b>0;b--)
for(a=97;a>0;a--);
}
void display() //数码管显示
{
P0=smg[data0];P3=sw[0];delay();
P0=smg[data1];P3=sw[1];delay();
P0=smg[data2];P3=sw[2];delay();
P0=smg[data3];P3=sw[3];delay();
}
void spi_enable(void) //开启spi 通信,将ssn 置低
{
SSN=0;//ssn 置低
_nop_();
}
void spi_disable(void) //关闭spi 通信,将ssn 置高
{
SSN=1;//ssn 置高
_nop_();
}
void send_zero(void) //发送0
{
SCK=1;//SCK 高电平
_nop_();
SI=0;//SI-输出一个低平
_nop_();
SCK=0;//SCK 低平
_nop_();
}
void send_one(void) //发送1
{
SCK=1;//SCK 高电平
_nop_();
SI=1;//SI-输出一个高平
_nop_();
SCK=0;//SCK 低平
_nop_();
}
//=====================SPI 写数据=====================//
void spi_write8(uchar wbuf8) // spi 写入8 位数据
{
uchar cnt,tmp=0x80;
spi_enable();
for(cnt=8;cnt>0;cnt--)
{
if((wbuf8&tmp)!=0)
send_one();//发送1
else
send_zero();//发送0
tmp /=2; //tmp 右移一位
} //没有spi 关闭命令,测试程序中代码关闭!
}
//void spi_write16(uint wbuf16) // spi 写16 位数据
//{
//uchar cnt;
//uint tmp=0x8000;
//spi_enable();
//for(cnt=16;cnt>0;cnt--)
//{
//if((wbuf16&tmp)>0)
//send_one();//发送1
//else
//send_zero();//发送0
//tmp /=2; //tmp 右移一位
//}
//_nop_();
//spi_disable();
//}
void spi_write32(unsigned long wbuf32) // spi 写32 位数据
{
uchar cnt;
unsigned long tmp=0x80000000;
spi_enable();
for(cnt=32;cnt>0;cnt--)
{
if((wbuf32&tmp)!=0)
send_one();//送1
else
send_zero();//发送0
tmp /=2; //tmp 右移一位
}
_nop_();
spi_disable();
}
//=====================SPI 读数据=====================//
unsigned long spi_read32()
{
uchar cnt;
unsigned long tmp=0x80000000;
unsigned long int rbuf32=0x00000000;
spi_enable();
for(cnt=32;cnt>0;cnt--)
{
SCK=0;//SCK
_nop_();
if(SO==1)//P6.2 SO
rbuf32 |=tmp;
tmp /=2;
SCK=1;// SCK
_nop_();
}
_nop_();
spi_disable();
return(rbuf32);
}
//===========GP2 上电复位程序==================//
void GP2_RESET(void)
{
RST=1; //输出高平
_nop_();
RST=0; //输出低平
_nop_();
RST=1; //输出高平
_nop_();
}//给gp2RSTN 管脚一个Reset 的方波
//===========GP2 寄存器配置程序====================//
void GP2_init(void)
{
unsigned long REG0,REG1,REG2, REG3, REG4,REG5;
uchar PU=0x50;
uchar init=0x70;
REG0=0x800c3000;//校准陶瓷晶振时间为8 个32k 周期,244.14us. 0x80008420
//设置高速晶振上电后一直起振.设置测量范围1,自动校准,上升沿敏感
REG1=0x81014100;//预期stop1 脉冲数1 个.计算第一个stop1-start
REG2=0x82E00000;//开启所有中断源
REG3=0x83080000;//
REG4=0x84200000;//
REG5=0x85080000;//
spi_write8(PU);//上电复位
_nop_();
spi_disable();
spi_write32(REG0);
_nop_();
spi_write32(REG1);
_nop_();
spi_write32(REG2);
_nop_();
spi_write32(REG3);
_nop_();
spi_write32(REG4);
_nop_();
spi_write32(REG5);
_nop_();
}
//===========GP2 时钟校准程序===================//
void GP2_cal(void)
{
uchar cal_start=0x03;
uchar read_reg0=0xb0;
unsigned long int CAL;
//float CAL_f;
EN_START=1;//EN_START
spi_write8(cal_start);//启动校准
_nop_();
spi_disable();
while(INT==1)//判断中断置位否
_nop_();
spi_write8(read_reg0); //读校准的时间数据
_nop_();
CAL=spi_read32();//通过计算校准系数为244.146/(float(CAL)/65536*0.250))
_nop_();
}
//=============用单片机口产生START 信号==========//
void GP2_START(void)
{
START=0;//START
_nop_();
START=1;
_nop_();
START=0;
_nop_();
}
//============通讯测试===============//
void GP2_STOP(void)
{
STOP=0;//START
_nop_();
STOP=1;
_nop_();
STOP=0;
_nop_();
}
//
void testcomunication(void)
{
unsigned long int REG1;
uchar cnt;
uchar tmp=0x80;
uchar test_reg=0xb5; //读结果寄存器5,反映寄存器1 的高8 位
uchar test_reg0=0x00;
REG1=0x81112233; //写寄存器1,随便输入,然后从结果寄存器5 读高8 位
spi_write32(REG1) ;
_nop_();
spi_write8(test_reg);
_nop_();
for(cnt=8;cnt>0;cnt--)
{
SCK=1;//SCK
_nop_();
if(SO==1)//P6.2 SO
test_reg0 |=tmp;
tmp /=2;
SCK=0;//SCK
_nop_();
}
spi_disable();
}
//==========测试fire 脉冲产生测试=============//
//======时间测量测试=========//
void timemeasurement(void)
{
uchar read_reg0=0xb0;
spi_write8(GP2_init); //初始化GP2
_nop_();
spi_disable();
EN_START=1;//EN_START
EN_STOP1=1;//EN_STOP
GP2_START();//给start 信号
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();//延迟
GP2_STOP();
_nop_();
//while(INT==1)//判断中断置位否
//{
// data0=0;
// data1=0;
// data2=0;
// data3=1;
// LED=0;
// delay();
// LED=1;
//_nop_();
// display(); //数码管显示
//}
spi_write8(read_reg0); //读时间测量数据
_nop_();
M=spi_read32();
_nop_();
}
void main(void)
{
GP2_RESET();
GP2_init();
GP2_cal();
while(1)
{
GP2_RESET();
GP2_START();
//testcomunication();
timemeasurement();
if(INT==1)
{
data0=1;
data1=1;
data2=2;
data3=3;
LED=0;
display(); //数码管显示
}
}
}