寻求一个基于MSP430与DS18B20的温度采集报警C程序
答案:2 悬赏:20 手机版
解决时间 2021-11-26 15:37
- 提问者网友:嘚啵嘚啵
- 2021-11-25 22:33
寻求一个基于MSP430与DS18B20的温度采集报警C程序
最佳答案
- 五星知识达人网友:持酒劝斜阳
- 2021-11-25 22:51
采集程序我有 至于报警 自己设定吧
这个是DS18B20的程序:
#include
#define DQ1 P5OUT|=BIT0
#define DQ0 P5OUT&=~BIT0
#define DQ_out P5DIR|=BIT0
#define DQ_in P5DIR&=~BIT0
#define DQ_volt (P5IN&BIT0)
typedef unsigned char uchar;
typedef unsigned int uint;
void Delay_us(uint time)
{
CCR0=time;
TACTL|=MC_1;
while(!(TACTL&TAIFG));
TACTL&=~MC_1;
TACTL&=~TAIFG;
}
uchar Resetds18b20()
{
uchar Error;
_DINT();
DQ_out;
DQ0;
Delay_us(700);
DQ1;
Delay_us(40);
DQ_in;
_NOP();
if(DQ_in) Error=1;
else Error=0;
DQ_out;
DQ1;
_EINT();
Delay_us(400);
return(Error);
}
void Writedata(uchar temp)
{
uchar i;
_DINT();
for(i=0;i<8;i++)
{
DQ0;
Delay_us(6);
if(temp&0x01) DQ1;
else DQ0;
Delay_us(40);
temp>>=1;
DQ1; //为下次拉低做准备
Delay_us(10);
}
_EINT();
}
uchar Readdata()
{
uchar i;
uchar temp=0;
_DINT();
for(i=0;i<8;i++)
{
temp>>=1; //从低位读起
DQ0;
Delay_us(6);
DQ1;
Delay_us(8);
DQ_in;
_NOP();
if(DQ_volt)
temp|=0x80;
Delay_us(40);
DQ_out;
DQ1;
Delay_us(10);
}
_EINT();
return temp;
}
void Skip() //发送跳过读取产品ID号命令
{
Writedata(0xcc);
}
void Convert()
{
Writedata(0x44);
}
void Read_SP()
{
Writedata(0xbe);
}
uint ReadTemp(void)
{
uchar lowtemp;
uint temp;
lowtemp=Readdata();//低位
temp=Readdata(); //高位
temp=(temp<<8)|lowtemp;
return temp;
}
uint convertion() //完成一次转换
{
uint i;
do
{
i=Resetds18b20();
}
while(i);
Skip();
Convert();
for(i=20;i>0;i--)
Delay_us(60000);
do
{
i=Resetds18b20();
}
while(i);
Skip();
Read_SP();
return ReadTemp();
}
这个是1602显示的程序:
#include "msp430x14x.h"
#define PortDir P1DIR
#define PortData P1OUT
#define CtrlDir P2DIR
#define PortCtrl P2OUT
#define SET_RS P2OUT|=BIT1
#define CLR_RS P2OUT&=~BIT1
#define SET_RW P2OUT|=BIT2
#define CLR_RW P2OUT&=~BIT2
#define SET_EN P2OUT|=BIT3
#define CLR_EN P2OUT&=~BIT3
typedef unsigned int uint ;
typedef unsigned char uchar ;
void delay5ms()
{
uint i=4000; // 40000/8000000Hz = 0.005 s
while(i--);
}
void WriteLcdCommand(uchar cmd)
{
CLR_RS;
CLR_RW;
PortData=cmd;
_NOP();
_NOP();
SET_EN;
delay5ms();
CLR_EN;
}
void WriteLcdData(uchar data)
{
SET_RS;
CLR_RW;
PortData=data;
_NOP();
_NOP();
SET_EN;
delay5ms();
CLR_EN;
}
void LcdReset()
{
PortDir=0xff;
CtrlDir=0xff;
PortData=0x00;
PortCtrl=0x00;
CLR_EN;
WriteLcdCommand(0x38); //规定的复位操作
delay5ms();
WriteLcdCommand(0x38);
delay5ms();
WriteLcdCommand(0x38);
delay5ms();
WriteLcdCommand(0x38);
WriteLcdCommand(0x0c);
WriteLcdCommand(0x06);
WriteLcdCommand(0x01);
}
void LocateXY(uchar x,uchar y) //确定字符写入的坐标
{ uchar temp1;
temp1=x&0x0f;
y&=0x01;
if(y) temp1|=0x40;
temp1|=0x80;
WriteLcdCommand(temp1);
}
void Display1Char(uchar x,uchar y,uchar data)
{
LocateXY(x,y);
WriteLcdData(data);
}
void DisplayNChar(uchar x,uchar y,uint n,uchar *str1)
{
uint i;
for(i=0;i {
Display1Char(x++,y,48+str1[i]);
if(x==0x0f)
{
y^=1;
x=0;
}
}
}
void Display1Str(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uint n=0,i;
temp=ptr;
while(*(ptr++)!='\0')
{ n++;}
for(i=0;i {
Display1Char(x++,y,temp[i]);
delay5ms();
if(x==0x0f)
{
y^=1;
x=0;
}
}
}
这个是主函数:
#include "msp430x14x.h"
#include "1602.h"
#include "18b20.h"
typedef unsigned char uchar;
typedef unsigned int uint;
uchar i;
uint tempdata;
uchar dN[6];
uchar tishi[]={"Temperature is:"};
void Disp_Numb(uint temper)
{
uchar i;
for(i = 0;i < 6;i++) dN[i] = 0; //初始化显示变量
//数值转换
if(temper & BIT0)
{
dN[0] = 5;
dN[1] = 2;
dN[2] = 6;
}
if(temper&BIT1)
{
dN[1] += 5;
dN[2] += 2;
dN[3] += 1;
}
if(temper & BIT2)
{
dN[2] += 5;
dN[3] += 2;
if(dN[2] >= 10)
{
dN[2] -= 10;
dN[3] += 1;
}
}
if(temper&BIT3)
{
dN[3] += 5;
}
if(temper & BIT4)
{
dN[4] += 1;
}
if(temper & BIT5)
{
dN[4] += 2;
}
if(temper & BIT6)
{
dN[4] += 4;
}
if(temper & BIT7)
{
dN[4] += 8;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BIT8)
{
dN[4] += 6;
dN[5] += 1;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BIT9)
{
dN[4] += 2;
dN[5] += 3;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BITA)
{
dN[4] += 4;
dN[5] += 6;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
if(dN[5] >= 10)
{
dN[5] -= 10;
}
}
}
main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1&=~XT2OFF;
do
{
IFG1&=~OFIFG;
for(i=0;i<0xff;i++);
}
while((IFG1&=OFIFG)!=0);
BCSCTL2|=SELM_2+SELS;
TACTL|=TASSEL_2+ID_3;
_EINT();
LcdReset();
Display1Str(0,0,tishi);
while(1)
{
Disp_Numb(convertion());
Display1Char(4,1,dN[5]+0x30);
Display1Char(5,1,dN[4]+0x30);
Display1Char(6,1,'.');
Display1Char(7,1,dN[3]+0x30);
Display1Char(8,1,dN[2]+0x30);
Display1Char(9,1,dN[1]+0x30);
Display1Char(10,1,dN[0]+0x30);
}
}
看不懂再找我吧 已经实现了的
这个是DS18B20的程序:
#include
#define DQ1 P5OUT|=BIT0
#define DQ0 P5OUT&=~BIT0
#define DQ_out P5DIR|=BIT0
#define DQ_in P5DIR&=~BIT0
#define DQ_volt (P5IN&BIT0)
typedef unsigned char uchar;
typedef unsigned int uint;
void Delay_us(uint time)
{
CCR0=time;
TACTL|=MC_1;
while(!(TACTL&TAIFG));
TACTL&=~MC_1;
TACTL&=~TAIFG;
}
uchar Resetds18b20()
{
uchar Error;
_DINT();
DQ_out;
DQ0;
Delay_us(700);
DQ1;
Delay_us(40);
DQ_in;
_NOP();
if(DQ_in) Error=1;
else Error=0;
DQ_out;
DQ1;
_EINT();
Delay_us(400);
return(Error);
}
void Writedata(uchar temp)
{
uchar i;
_DINT();
for(i=0;i<8;i++)
{
DQ0;
Delay_us(6);
if(temp&0x01) DQ1;
else DQ0;
Delay_us(40);
temp>>=1;
DQ1; //为下次拉低做准备
Delay_us(10);
}
_EINT();
}
uchar Readdata()
{
uchar i;
uchar temp=0;
_DINT();
for(i=0;i<8;i++)
{
temp>>=1; //从低位读起
DQ0;
Delay_us(6);
DQ1;
Delay_us(8);
DQ_in;
_NOP();
if(DQ_volt)
temp|=0x80;
Delay_us(40);
DQ_out;
DQ1;
Delay_us(10);
}
_EINT();
return temp;
}
void Skip() //发送跳过读取产品ID号命令
{
Writedata(0xcc);
}
void Convert()
{
Writedata(0x44);
}
void Read_SP()
{
Writedata(0xbe);
}
uint ReadTemp(void)
{
uchar lowtemp;
uint temp;
lowtemp=Readdata();//低位
temp=Readdata(); //高位
temp=(temp<<8)|lowtemp;
return temp;
}
uint convertion() //完成一次转换
{
uint i;
do
{
i=Resetds18b20();
}
while(i);
Skip();
Convert();
for(i=20;i>0;i--)
Delay_us(60000);
do
{
i=Resetds18b20();
}
while(i);
Skip();
Read_SP();
return ReadTemp();
}
这个是1602显示的程序:
#include "msp430x14x.h"
#define PortDir P1DIR
#define PortData P1OUT
#define CtrlDir P2DIR
#define PortCtrl P2OUT
#define SET_RS P2OUT|=BIT1
#define CLR_RS P2OUT&=~BIT1
#define SET_RW P2OUT|=BIT2
#define CLR_RW P2OUT&=~BIT2
#define SET_EN P2OUT|=BIT3
#define CLR_EN P2OUT&=~BIT3
typedef unsigned int uint ;
typedef unsigned char uchar ;
void delay5ms()
{
uint i=4000; // 40000/8000000Hz = 0.005 s
while(i--);
}
void WriteLcdCommand(uchar cmd)
{
CLR_RS;
CLR_RW;
PortData=cmd;
_NOP();
_NOP();
SET_EN;
delay5ms();
CLR_EN;
}
void WriteLcdData(uchar data)
{
SET_RS;
CLR_RW;
PortData=data;
_NOP();
_NOP();
SET_EN;
delay5ms();
CLR_EN;
}
void LcdReset()
{
PortDir=0xff;
CtrlDir=0xff;
PortData=0x00;
PortCtrl=0x00;
CLR_EN;
WriteLcdCommand(0x38); //规定的复位操作
delay5ms();
WriteLcdCommand(0x38);
delay5ms();
WriteLcdCommand(0x38);
delay5ms();
WriteLcdCommand(0x38);
WriteLcdCommand(0x0c);
WriteLcdCommand(0x06);
WriteLcdCommand(0x01);
}
void LocateXY(uchar x,uchar y) //确定字符写入的坐标
{ uchar temp1;
temp1=x&0x0f;
y&=0x01;
if(y) temp1|=0x40;
temp1|=0x80;
WriteLcdCommand(temp1);
}
void Display1Char(uchar x,uchar y,uchar data)
{
LocateXY(x,y);
WriteLcdData(data);
}
void DisplayNChar(uchar x,uchar y,uint n,uchar *str1)
{
uint i;
for(i=0;i
Display1Char(x++,y,48+str1[i]);
if(x==0x0f)
{
y^=1;
x=0;
}
}
}
void Display1Str(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uint n=0,i;
temp=ptr;
while(*(ptr++)!='\0')
{ n++;}
for(i=0;i
Display1Char(x++,y,temp[i]);
delay5ms();
if(x==0x0f)
{
y^=1;
x=0;
}
}
}
这个是主函数:
#include "msp430x14x.h"
#include "1602.h"
#include "18b20.h"
typedef unsigned char uchar;
typedef unsigned int uint;
uchar i;
uint tempdata;
uchar dN[6];
uchar tishi[]={"Temperature is:"};
void Disp_Numb(uint temper)
{
uchar i;
for(i = 0;i < 6;i++) dN[i] = 0; //初始化显示变量
//数值转换
if(temper & BIT0)
{
dN[0] = 5;
dN[1] = 2;
dN[2] = 6;
}
if(temper&BIT1)
{
dN[1] += 5;
dN[2] += 2;
dN[3] += 1;
}
if(temper & BIT2)
{
dN[2] += 5;
dN[3] += 2;
if(dN[2] >= 10)
{
dN[2] -= 10;
dN[3] += 1;
}
}
if(temper&BIT3)
{
dN[3] += 5;
}
if(temper & BIT4)
{
dN[4] += 1;
}
if(temper & BIT5)
{
dN[4] += 2;
}
if(temper & BIT6)
{
dN[4] += 4;
}
if(temper & BIT7)
{
dN[4] += 8;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BIT8)
{
dN[4] += 6;
dN[5] += 1;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BIT9)
{
dN[4] += 2;
dN[5] += 3;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
}
if(temper & BITA)
{
dN[4] += 4;
dN[5] += 6;
if(dN[4] >= 10)
{
dN[4] -= 10;
dN[5] += 1;
}
if(dN[5] >= 10)
{
dN[5] -= 10;
}
}
}
main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1&=~XT2OFF;
do
{
IFG1&=~OFIFG;
for(i=0;i<0xff;i++);
}
while((IFG1&=OFIFG)!=0);
BCSCTL2|=SELM_2+SELS;
TACTL|=TASSEL_2+ID_3;
_EINT();
LcdReset();
Display1Str(0,0,tishi);
while(1)
{
Disp_Numb(convertion());
Display1Char(4,1,dN[5]+0x30);
Display1Char(5,1,dN[4]+0x30);
Display1Char(6,1,'.');
Display1Char(7,1,dN[3]+0x30);
Display1Char(8,1,dN[2]+0x30);
Display1Char(9,1,dN[1]+0x30);
Display1Char(10,1,dN[0]+0x30);
}
}
看不懂再找我吧 已经实现了的
全部回答
- 1楼网友:woshuo
- 2021-11-25 23:31
分再多也没用,没这个单片机,你把单片机送过来我帮你做。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯