📄 msp430f2121.c
字号:
#include<stdio.h>
#include"math.h"
#include"PTR6000.H"
extern unsigned int t_cishu=0;
extern unsigned int remin_cishu=0;
extern unsigned int putong_cishu=0;
float renminwendu=0;
uchar flag=0; //判断DS18B20是否存在
uchar CRC_result=1; //CRC校验的结果,为0则正确。
unsigned int zhengshu,xiaoshu;
signed char fuhao;
uint baiwei,shiwei,gewei,xiao1,xiao2;
unsigned char temp_buff[9]; //DS18B20读出的9位数值数组
unsigned char DS18B20Temp[6];
void Delay(void);
void Delay_us(uint len);
void led_light(void);
void RF_sent(void);
void RF_recive(void);
void Init_CLK(void);
void DS18B20_ReadTemp(void);
void Measuring_voltage(void); //测电压
void Thermistor_tem(void); //热敏测温度
uchar DS18B20_Init(void); //DS18B20的初始化程序
void DS18B20_WriteByte(uchar oww_dat); //写字节
void DS18B20_ReadByte(void); //读9位数据
uchar DS18B20_CRC(void); //DS18B20的CRC校验
void get_temp(void); //将温度转换成十进制
void temp_ASCII(void); //将温度转换成ASCII码,并放在DS18B20Temp[6]里
void w_txaddr(uchar addr,uchar *com)
{
uchar i;
sck_Low();
csn_Low();
write(addr);
for(i=0;i<addr_wd+2;i++)
{
write(com[i]);
}
csn_High();
}
void r_rxaddr(uchar addr)
{
uchar i;
sck_Low();
csn_Low();
write(addr);
for(i=0;i<addr_wd+2;i++)
{
receive_date[i]=read();
}
csn_High();
}
//////////////////////////////////////////////////////////////////**/**********
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
_DINT(); //关闭中断
Init_CLK(); //时钟初始化
Init_Port();
P2DIR |= BIT1;
//TACTL = TASSEL_2+MC_1;//TACTL=0x0210,比较模式,增计数到CCR0并从0开始
// CCR0 = 50000; //50ms,0xC350
//CCTL0 |= CCIE; //0x0010
_EINT();
while(1)
{
_DINT();
seconds=0;
P2OUT |= BIT1;
Delay_us(50000); //17ms
Delay_us(50000);
Delay_us(50000);
P2OUT &= ~BIT1;
_EINT();
//TACTL &= ~MC1; //停止计数
//TACTL &= ~MC0;
//nn = TAR;
//TAR = 0;
//TACTL |= MC_2;
// RF_recive();
_NOP();
RF_sent();
_NOP();
//*Thermistor_tem(); //热敏电阻求温度
// P2SEL &= ~BIT5; //p2.5脚设置成普通的I/O口。DS18B20管脚
// P2DIR &= ~BIT5; //P2.5脚设置成输入方向
// DS18B20_ReadTemp(); //采集18b20
// CRC_result=DS18B20_CRC();
// DS18B20_ReadTemp(); //采集18b20
// CRC_result=DS18B20_CRC();
// get_temp();
// temp_ASCII();
// _NOP();
// Measuring_voltage(); //测量电压
//Init_Port(); //端口初始化
//RF_recive(); //接收
//RF_sent(); //发送 */
}
}
////////////////////////////////////////////////////////////////////**//*******
void Delay(void)
{
unsigned int i;
for (i=0; i<60000; i++);
}
void Delay_us(uint len)
{
uint i;
for(i=0;i<len;i++)
{
_NOP();
}
}
void Init_CLK(void)
{
DCOCTL = CALDCO_8MHZ;
BCSCTL1 = CALBC1_8MHZ;
BCSCTL2 = 0x16; //MCLK=4MHZ,SMCLK=1MHZ;
}
void led_light(void)
{
P1OUT |= BIT3; //点亮发光二极管
Delay();
P1OUT &= ~BIT3; //输出低电平
}
void RF_recive(void)
{
uchar read_data;
ce_Low();
w_register(0x23,addr_wd); //5ge wd
w_txaddr(0x2a,recive_addr); //接收地址
w_register(0x21,0x00); //EN_AA 关自动应答
w_register(0x22,0x01); //EN_RXADDR 接收数据通道0允许
w_register(0x24,0x00); //
w_register(0x31,0x10); //rx_pw_p0 32字节有效数据
w_register(0x26,0x07); //RF_SETUP 传输速率1Mbps,发射功率0dbm
w_register(0x20,0x0b); //设为接收机 //CONFIG
ce_High();
while((P1IN&0x01)==0x01);
ce_Low();
read_data=r_register(0x07);
w_register(0x27,read_data); //清中断
switch(read_data&0xf0) //判断中断信号屏蔽低字节
{case max_rt:while(1);
case rx_dr :r_rx();break;
case tx_ds :clr_tx();break;
default: while(1);
}
}
void RF_sent(void)
{
while(1)
{
uchar read_data=0;
ce_Low();
w_register(0x23,addr_wd); //5ge wd
w_txaddr(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,send_date_width); //rx_pw_p0 32字节有效数据
w_register(0x26,0x07); //RF_SETUP 传输速率1Mbps,发射功率0dbm
w_register(0x20,0x0a); //设为发射机 //CONFIG
w_tx();
ce_High();
while((P1IN&0x01)==0x01); //IRQ P1.0
ce_Low();
read_data=r_register(0x07);
w_register(0x27,read_data); //清中断
switch(read_data&0xf0) //判断中断信号屏蔽低字节
{case max_rt:while(1);
case rx_dr :r_rx();break;
case tx_ds :clr_tx();break;
default: while(1);
}
}
}
//***************************测量电压的程序***************/////////////////
void Measuring_voltage(void)
{
P2SEL &= ~BIT2; //P2.2设置成普通I/O口
P2SEL &= ~BIT3;
P2SEL &= ~BIT4;
P2DIR &= ~BIT3; //P2.3设置成输入方向(高阻态) 热敏电阻的管脚 50K
P2DIR &= ~BIT4; //模拟比较器的输入端
P2DIR |= BIT2; //普通电阻的连接管脚 10K
CACTL1 = CAIES+CAON+CAREF_3+CARSEL;
CACTL1 &= ~CAEX;
CACTL2 |= CAF;
CACTL2 |= P2CA0;
TACTL = TASSEL_2+TACLR+ID_1; //时钟源SMCLK,TAR清0,1/2分频 1/2MHZ
TACTL |= MC_2; //连续计数模式
TACTL &= ~TAIE; //关闭中断允许
TACTL &= ~TAIFG; //中断标志位清0
while(1)
{
P2OUT |= BIT2; //拉高
Delay_us(800); //延时
TACTL &= ~MC1; //停止计数
TACTL &= ~MC0;
TAR=0; //将TAR的内容清0
TACTL |= MC_2; //连续计数模式
P2OUT &= ~BIT2; //拉低,放电
while(1)
{
if((CACTL2&CAOUT)==0)
{
t_cishu = TAR;
TACTL &= ~MC1; //停止计数
TACTL &= ~MC0;
break;
}
}
}
}
//****************热敏电阻测量温度的程序******************////
void Thermistor_tem(void)
{
uint Rsen,duishu;
P2OUT = 0x00;
P2DIR = 0xff;
P2DIR &= ~BIT4; //模拟比较器的输入端,高阻态
CAPD |= BIT4; //输入缓冲关闭
P2SEL &= ~BIT2; //普通电阻端,普通I/O口
P2SEL &= ~BIT3; //热敏电阻端,普通I/O口
Delay_us(400); //延时放电 0.55ms
CACTL1 = CARSEL + CAREF_2+ CAON; // 0.5 Vcc = -comp, on
CACTL1 &= ~CAIE;
CACTL1 &= ~CAIFG;
CACTL1 &= ~CAEX;
CACTL1 &= ~CAIES; //上升沿使CAIFG置位
CACTL2 |= CAF;
CACTL2 |= P2CA0; //外部引脚信号连接到比较器A
TACTL = TASSEL_2+TACLR+ID_1; //时钟源SMCLK,TAR清0,1/2分频 1/2MHZ
TACTL &= ~TAIE; //关闭中断允许
TACTL &= ~TAIFG; //中断标志位清0
P2DIR &= ~BIT3; //热敏电阻端改成高阻态
TAR=0;
TACTL |= MC_2; //连续计数模式
P2OUT |= BIT2; // //普通电阻充电
while(1)
{
if((CACTL2&CAOUT)==1)
{
putong_cishu = TAR;
TACTL &= ~MC1; //停止计数
TACTL &= ~MC0;
break;
}
}
P2OUT &= ~BIT2; //放电
Delay_us(400); //延时放电
CAPD |= BIT2;
P2DIR |= BIT3;
P2OUT &= ~BIT3;
P2DIR &= ~BIT2; //普通电阻端改成高阻态,用热敏电阻充电
TAR=0; //将TAR的内容清0
TACTL |= MC_2; //连续计数模式
P2OUT |= BIT3; //充电
while(1)
{
if((CACTL2&CAOUT)==1)
{
remin_cishu = TAR;
TACTL &= ~MC1; //停止计数
TACTL &= ~MC0;
break;
}
}
P2OUT &= ~BIT3; //放电
Delay_us(200); //放电延时
Rsen = (10*remin_cishu)/putong_cishu; //求热敏电阻值
duishu = log(10/Rsen);
renminwendu =(3950*298.5)/(3950- duishu * 298.5)-273.5;
_NOP();
}
///*****************DS18B20的程序***************************/////////
void DS18B20_ReadTemp(void)
{
DS18B20_Init(); //初始化
if(flag)
{
flag=0;
DS18B20_WriteByte(SkipRom); //跳过ROM匹配 0xcc
DS18B20_WriteByte(ConvertTemperature); //温度转换命令 0x44
Delay_us(558); //等待温度转换750us
DS18B20_Init();
flag=0;
DS18B20_WriteByte(SkipRom); //跳过ROM匹配 0xcc
DS18B20_WriteByte(ReadScratchpad); //读温度命令 0xbe
DS18B20_ReadByte(); //读出温度数据到数组temp_buff[9]里
}
_NOP();
}
uchar DS18B20_Init(void)
{
unsigned char result;
uint j;
_NOP();
DS18B20_DIR |= DS18B20_DQ; // 输出方向
_NOP();
DS18B20_OUT &= ~DS18B20_DQ; // 拉低
Delay_us(360); // 持续〉480us 次数=(t-5us)*3/4
DS18B20_DIR &= ~DS18B20_DQ; // 输入方向
Delay_us(41); //等待60us
result = DS18B20_IN & DS18B20_DQ;
result = result&0x20;
for(j=0;j<75;j++)
{
if(result==0x00)
{
flag=1;
break;
}
else
{
flag=0;
}
}
Delay_us(1000); // > 480us
return(flag);
}
void DS18B20_WriteByte(uchar oww_dat)////////////********************/////写字节
{
uchar i,temp;
_NOP();
for(i = 0; i < 8; i++)
{
DS18B20_DIR |= DS18B20_DQ; //输出方向
//DS18B20_OUT |= DS18B20_DQ; // 输出高电平
_NOP();
DS18B20_OUT &= ~DS18B20_DQ; // ;拉低,写时间隙,15us内把所写的位送到总线上
_NOP();
temp = oww_dat >> i;
temp &= 0x01;
if (temp == 1)
{
DS18B20_OUT |= DS18B20_DQ; // 输出高电平
Delay_us(41); // 60us
}
else
{
DS18B20_OUT &= ~DS18B20_DQ; // 输出低电平
Delay_us(41); // 60us
DS18B20_OUT |= DS18B20_DQ;
}
DS18B20_DIR &= ~DS18B20_DQ; // 输入方向,释放总线
}
_NOP(); _NOP();_NOP();_NOP(); // 1us
}
void DS18B20_ReadByte(void)////////////////************///////////////////读字节
{
uchar i,j,temp=0,result;
for(i=0;i<9;i++)
{
temp=0;
for(j=0;j<8;j++)
{
DS18B20_DIR |= DS18B20_DQ; //输出方向
_NOP();
DS18B20_OUT &= ~DS18B20_DQ; // 输出低电平
_NOP();_NOP();_NOP();_NOP(); //2us
_NOP();_NOP();_NOP();_NOP();
DS18B20_OUT |= DS18B20_DQ; // 拉高
_NOP();
DS18B20_DIR &= ~DS18B20_DQ; // 输入方向
Delay_us(4); //12us
result = DS18B20_IN & DS18B20_DQ; //读出那一位
Delay_us(30); //45us
result = result&0x20;
if(result==0x20)
{
temp |= 0x01<<j;
}
}
temp_buff[i]=temp;
}
}
uchar DS18B20_CRC(void)
{
unsigned char i;
uchar CRC_data=0;
for(i=0;i<9;i++)
{
CRC_data=tal8[CRC_data ^ temp_buff[i]];
}
return (CRC_data);
}
void get_temp(void)
{
uchar gao,di;
gao = temp_buff[1];
di = temp_buff[0];
fuhao = gao&0xf8;
if(fuhao==0x00)
{
fuhao='+';
gao = gao<<4;
gao = gao&0xf0;
xiaoshu=di&0x0f;
di = di>>4;
di = di&0x0f;
zhengshu = gao+di;
}
else
{
fuhao='-';
di = di-0x01;
di = ~di;
gao = ~gao;
gao = gao<<4;
gao = gao&0xf0;
xiaoshu=di&0x0f;
di = di>>4;
di = di&0x0f;
zhengshu = gao+di;
}
}
void temp_ASCII(void)
{
uchar gao,di;
gao = temp_buff[1];
di = temp_buff[0];
fuhao = gao&0xf8;
if(fuhao==0x00)
{
fuhao='+';
gao = gao<<4;
gao = gao&0xf0;
xiaoshu=di&0x0f;
di = di>>4;
di = di&0x0f;
zhengshu = gao+di;
}
else
{
fuhao='-';
di = di-0x01;
di = ~di;
gao = ~gao;
gao = gao<<4;
gao = gao&0xf0;
xiaoshu=di&0x0f;
di = di>>4;
di = di&0x0f;
zhengshu = gao+di;
}
baiwei = zhengshu/100;
shiwei = (zhengshu%100)/10;
gewei = zhengshu%10;
xiao1 = xiaoshu/10;
xiao2 = xiaoshu%10;
DS18B20Temp[0]=fuhao;
DS18B20Temp[1]=baiwei+0x30;
DS18B20Temp[2]=shiwei+0x30;
DS18B20Temp[3]=gewei+0x30;
DS18B20Temp[4]=xiao1+0x30;
DS18B20Temp[5]=xiao2+0x30;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TIMERA0_INT(void) //FFF2H
{
LPM1_EXIT;
seconds++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -