📄 zhang.c
字号:
#include<MSP430X21X1.H>
#include "zhang.h"
#include<stdio.h>
#include"math.h"
unsigned char DS18B20_READBIT(void);
void DELAY(unsigned int len);
unsigned char DS18B20_Init(void);
void INT_CLK(void);
void DS18B20_ReadTemp(void);
void Hex2Asc(unsigned long c,char* ptr);
void ce_high(void);
void ce_low(void);
void scn_high(void);
void get_tmp(void);
void scn_low(void);
void sck_high(void);
void sck_low(void);
void mo_high(void);
void mo_low(void);
void w_tx(void);
void r_rx(void);
void clr_tx(void);
void NRF_sent(void);
unsigned char *strcat(unsigned char *dest,unsigned char *src);
void w_add(unsigned char add,unsigned char *com);
void DS18B20_WriteByte(unsigned char wwe_dat);
void w_register(unsigned char add, unsigned char com);
void write_spi(unsigned char by);
unsigned char read_spi(void);
unsigned char r_register(unsigned char add);
//参数
unsigned char sent_addr[5]={0x34,0x43,0x10,0x10,0x01};
unsigned char *p;
unsigned char addr_wd=0x03;
unsigned char flag=0;
unsigned char data;
unsigned char dat1;
unsigned char temp_buff[9];
unsigned char GetScratchpad[2];
unsigned char zhang[]={1,2,2,3,3,3,3,3};
unsigned char wang[]={4,4,4,45,5,5,5,5};
unsigned int send_date[16]={0x07,0x0b,0x0d,0x0e,0x07,
0x07,0x0b,0x0d,0x0e,0x07,
0x07,0x0b,0x0d,0x0e,0x07,
0x07};
extern unsigned char ResultTemperature[16]=
{0x28,0x44,0x41,0x54,0x41,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x30,0x31,0x29};
unsigned int receive_date[16]={0} ;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
_DINT();
INT_CLK();
P1SEL &= ~BIT0;
P1SEL &= ~BIT1;
P1SEL &= ~BIT2;
P1SEL &= ~BIT3;
P2DIR |= BIT3; //CE //输出方向
P2DIR |= BIT2; //CSN
P1DIR |= BIT2; //MOSI
P1DIR |= BIT3; //SCK
P1DIR &= ~BIT0; //IRQ //输入方向
P1DIR &= ~BIT1; //MISO //输入方向
P1OUT |= BIT2; //MOSI //输出高电平
P1OUT |= BIT3; //SCK //
P2OUT |= BIT3; //CE //
P2OUT |= BIT2;
DS18B20_Init();
while(1)
{
DS18B20_ReadTemp();
_NOP();
get_tmp();
_NOP();
NRF_sent();
_NOP();
}
}
//延迟程序
void DELAY(unsigned int len)
{
unsigned int i;
for(i=0;i<len;i++)
{
_NOP();
}
}
//时钟配置
void INT_CLK(void)
{
WDTCTL = WDTPW + WDTHOLD;
DCOCTL = CALDCO_8MHZ;
BCSCTL1 = CALBC1_8MHZ;
BCSCTL2 = 0x16;
}
//18b20程序B
void DS18B20_ReadByte(void)////////////////************///////////////////读字节
{
unsigned char i,j,temp=0,result;
for(i=0;i<9;i++)
{
temp=0;
for(j=0;j<8;j++)
{
DS18B20_DIR |= DS_18B20_IOT;
_NOP();
DS18B20_OUT &= ~DS_18B20_IOT;
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
DS18B20_OUT |= DS_18B20_IOT;
_NOP();
DS18B20_DIR &= ~DS_18B20_IOT;
DELAY(4);
result = DS18B20_IN & DS_18B20_IOT;
DELAY(30);
result = result&0x01;
if(result==0x01)
{
temp |= 0x01<<j;
}
}
temp_buff[i]=temp;
}
}
void DS18B20_WriteByte(unsigned char wwe_dat)
{
unsigned i,temp;
for(i=0;i<8;i++)
{
DS18B20_DIR |= DS_18B20_IOT;
_NOP();
DS18B20_OUT &= ~DS_18B20_IOT;
_NOP();
temp = wwe_dat >> i;
temp = temp&0x01;
if(temp==1)
{
DS18B20_OUT |= DS_18B20_IOT;
DELAY(40);
}
else
{
DS18B20_OUT &= ~DS_18B20_IOT;
DELAY(40);
DS18B20_OUT |= DS_18B20_IOT;
}
DS18B20_DIR &= ~DS_18B20_IOT;
_NOP(); _NOP();_NOP();_NOP();
}
}
void DS18B20_ReadTemp(void)
{
DS18B20_Init(); //初始化
if(flag)
{
flag=0;
DS18B20_WriteByte(SkipRom); //跳过ROM匹配 0xcc
DS18B20_WriteByte(ConvertTemperature); //温度转换命令 0x44
DELAY(558); //等待温度转换750us
DS18B20_Init();
flag=0;
DS18B20_WriteByte(SkipRom); //跳过ROM匹配 0xcc
DS18B20_WriteByte(ReadScratchpad); //读温度命令 0xbe
DS18B20_ReadByte(); //读出温度数据到数组temp_buff[9]里
}
_NOP();
}
unsigned char DS18B20_Init(void)
{
unsigned char result;
unsigned int j;
_NOP();
DS18B20_DIR |= DS_18B20_IOT;
_NOP();
DS18B20_OUT &= ~DS_18B20_IOT;
DELAY(360);
DS18B20_DIR &= ~DS_18B20_IOT;
DELAY(41);
result = DS18B20_IN & DS_18B20_IOT;
result = result&0x01;
for(j=0;j<75;j++)
{
if(result==0x00)
{
flag=1;
break;
}
else
{
flag=0;
}
}
DELAY(1000); // > 480us
return(flag);
}
void get_tmp(void)
{
unsigned int i;
unsigned char* ptr;
GetScratchpad[1]=temp_buff[1];
GetScratchpad[0]=temp_buff[0];
ResultTemperature[6]=0x2B;
for (i=7;i<12;i++)
ResultTemperature[i]=0x30;
i=GetScratchpad[1];
i=(i<< 8)|GetScratchpad[0];
if (i&0xf800)
{
ResultTemperature[6]=0x2D;
i=~i+1;
}
i=i&0x07ff;
ptr=ResultTemperature+7;
Hex2Asc(i,(char*) ptr);
}
void Hex2Asc(unsigned long c,char* ptr)
{
unsigned char i,j,k,l;
c=((c*100)+8)/16;
j = c/10000;
*ptr++=j+0x30;//10000
i=(c-j*10000)/1000;
*ptr++ = i+0x30;//1000
k=(c-j*10000-i*1000)/100;
*ptr++ = k+0x30;//100
l=(c-j*10000-i*1000-k*100)/10;
*ptr++ = l+0x30;//1
*ptr=(c-j*10000-i*1000-k*100-l*10)+0x30;//1
_NOP();
}
//下面是NRF程序
void write_spi(unsigned char by)
{ char i,j;
for(i=0;i<8;i++)
{
if((by&0x80)==0x80)
{
mo_high();
}
else
{
mo_low();
}
sck_high();
for (j=10;j>0;j--);//延迟一段时间
sck_low();
by<<=1;
}
}
unsigned char read_spi(void)
{
unsigned int i;
unsigned char byte;
for(i=0;i<8;i++)
{
byte = byte <<1;
sck_high();
_NOP();_NOP();
if( NRFMISO_IN & NRFMISO_BIT)
{
byte=byte | 0x01;
}
else
{
byte=byte & 0xfe;
}
sck_low();
_NOP();_NOP();
}
return byte;
}
void w_register(unsigned char addr,unsigned char com) //写寄存器
{
scn_low();
write_spi(addr);
write_spi(com);
scn_high();
}
unsigned char r_register( unsigned char addr) //读寄存器
{
unsigned char date;
scn_low();
write_spi(addr);
date=read_spi();
scn_high();
return(date);
}
void NRF_sent(void)
{
unsigned char i;
{
ce_low();
_NOP();
DELAY(5);
w_register(0x23,0x03); //5ge wd
w_add(0x30,sent_addr); //发送地址
w_register(0x21,0x00); //EN_AA 关自动应答
w_register(0x22,0x01); //EN_RXADDR 接收数据通道0允许
w_register(0x24,0x00); //auto 10
w_register(0x31,0x10); //rx_pw_p0 32字节有效数据
w_register(0x26,0x07); //RF_SETUP 传输速率1Mbps,发射功率0dbm
w_register(0x20,0x0a); //设为发射机 //CONFIG
w_tx();
ce_high();
for(i=0;i<15;i++);
while((NRFIRQ_IN & 0x01)==0x01)
ce_low();
data= r_register(0x07);
w_register(0x27,data);
switch(data & 0xf0)
{
case 0x10:while(1);
case 0x20: r_rx();break;
case 0x40: clr_tx();break;
default: while(1);
}
}
}
void w_tx(void)
{
unsigned char i;
scn_low();
sck_low();
write_spi(0xa0);
for(i=0;i<16;i++)
{
write_spi(ResultTemperature[i]);
}
scn_high();
}
void clr_tx(void)
{
scn_low();
sck_low();
write_spi(0xe1);
scn_high();
}
void r_rx(void)
{unsigned char i;
sck_low();
scn_low();
write_spi(0x61);
for(i=0;i<16;i++)
receive_date[i]=read_spi();
scn_high();
}
void w_add(unsigned char add,unsigned char *com)
{
unsigned char i;
sck_low();
scn_low();
write_spi(add);
for(i=0;i<5;i++)
{
write_spi(com[i]);
}
scn_high();
}
void r_rxadd(unsigned char add)
{
unsigned char i;
sck_low();
scn_low();
write_spi(add);
for(i=0;i< 5;i++)
{
receive_date[i]=read_spi();
}
scn_high();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -