基于单片机msp430和温度传感器ds18b20的水温度控制系统的c语言源程序(不是测量,要有加热跟制冷)

基于单片机msp430和温度传感器ds18b20的水温度控制系统的c语言源程序

我这是用STC做的,应该很容易移植到MPS430上的给你参考一下。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit scl=P1^3;
sbit sda=P1^4;

sbit key1=P1^6;
sbit key2=P1^7;
sbit key3=P2^0;
sbit key4=P2^1;

sbit lcrs=P3^7;//数据/命令
sbit lcwr=P3^5;//读/写
sbit lcden=P3^4;//使能

sbit DS=P2^2;

/*sbit lcrs=P3^4;//数据/命令
sbit lcwr=P3^7;//读/写
sbit lcden=P3^5;//使能
*/
sbit jrk=P2^2;
sbit cyk=P2^3;
sbit xhk=P2^4;
bit flag=0,rsg=0,not=0,he=0,in=0;
int acon=0,bcon=0,dcon=0,econ=0,
temp=0,y=0,j=0,l=0,cfj=0,ec=0,dc=0,at;
uchar code table[]={48,49,50,51,52,53,54,55,56,57};
uchar code ta1[]={"Temperature UP"};
uchar code ta2[]={"Temperature DN"};
uchar code ta3[]={"Inflator Cycle"};
uchar code ta4[]={"Inflator Time "};
uchar code ta5[]={" Heating UP "};
uchar code ta6[]={" Inflator "};
uchar code table7[]={"Temperature"};
uchar table1[]={0,0,0,'.',0};
uchar table3[]={"AptitudeAquarium"};
uchar table4[]={0,0,0,0,0};
uchar n,c=0;
void delay(uchar);
void wen_kong();
void xh();
void rso();
void weno();

void Init_Com(void)
{
TMOD = 0x11;
PCON = 0x00;
TH1=0x61;
TL1=0x99;
EA=1;
ET1=1;
TR1=1;
}
void delay(uchar count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
////初始化18B20/////////
bit init18b20(void)
{
uint i;
bit no;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
no=DS;
if(no==0)
{
DS=1;
i=100;
while(i>0)i--;
no=DS;
if(no==1)
not=0;
else
not=1;
}
else
not=1;
return (not);
}

bit tmpreadbit(void) //读一位
{
uint i;
bit dat;
DS=0;
i++;
DS=1;
i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}

uchar tmpread(void) //读一个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}

void tmpwritebyte(uchar dat) //写一个字节到 ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;
while(i>0)i--;
DS=1;
i++;i++;
}
}
}

int tmp() //DS18B20温度读取
{
float tt;
int a,b;
if(init18b20()==0)
{
WDT_CONTR=0x36; /////喂狗
EA=0;
delay(1);
tmpwritebyte(0xcc); // 跳过读ROM操作
tmpwritebyte(0x44); // 启动温度转换
delay(10);
init18b20();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //将高字节温度数据与低字节温度数据整合
temp=temp|a;
c=b>>4;
tt=temp*0.0625;
temp=tt*10+0.5; //放大10倍输出并四舍五入
EA=1;
return temp;
}
else
not=1;
}

//////1062/////////
void ydelay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
void write_com(uchar com)
{
P0=com;
lcwr=0;
lcrs=0;
lcden=0;
ydelay(10);
lcden=1;
ydelay(10);
lcden=0;
lcwr=1;
}

void write_date(uchar date)//写数据
{
P0=date;
lcwr=0;
lcrs=1;
lcden=0;
ydelay(10);
lcden=1;
ydelay(10);
lcden=0;
lcwr=1;
}

void init1602()//初始化
{
write_com(0x38);//设置显示模式
ydelay(20);
write_com(0x0c);//开显示
ydelay(20);
write_com(0x06);//指针和光标自动加一
ydelay(20);
write_com(0x01);//清屏指令
ydelay(20);
}

///////显示程序//////
void display(int num)
{
uint i,A1,A2;
WDT_CONTR=0x35; /////喂狗
if(c!=0)
num=~num+1;
A1=num/1000;
A2=num%1000/100;
if(not==0)
{
if(c!=0)
{
c=0;
table1[0]='-';
}
else if(A1==0)
table1[0]=' ';
else
table1[0]=table[A1];
if(A1==0)
if(A2==0)
table1[1]=' ';
else
table1[1]=table[A2];
table1[2]=table[num%1000%100/10];
table1[4]=table[num%1000%100%10];
}
else
{
table1[0]='?';
table1[1]='?';
table1[2]='?';
table1[4]='?';
}
write_com(0x80);
for(i=0;i<11;i++)
{write_date(table7[i]);
delay(2);}
write_com(0x8b);
for(i=0;i<5;i++)
{write_date(table1[i]);
delay(2);}
write_com(0xc0);
for(i=0;i<16;i++)
{
if(he==1)
write_date(ta5[i]);
else if(in==1)
write_date(ta6[i]);
else
write_date(table3[i]);
}
c=0;
WDT_CONTR=0x35; /////喂狗
}
////显示2////////////////////
display2(uchar bh,int dat)
{
uchar a,A,B;
WDT_CONTR=0x35; /////喂狗
//write_com(0x01);//清屏指令
y=dat;
y=y&0x8000;
if(y!=0)
dat=~dat+1;
A=dat/1000;
B=dat%1000/100;
if((bh!=4)&&(bh!=5))
{
if(A!=0)
table4[0]=table[dat/1000];
else if((c!=0)||(y!=0))
{
c=0;y=0;
table4[0]='-';
}
else
table4[0]=' ';
if(B!=0)
table4[1]=table[B];
else
table4[1]=' ';
table4[2]=table[dat%1000%100/10];
table4[3]='.';
table4[4]=table[dat%1000%100%10];
}
else
{
table4[0]=' ';
if((c!=0)||(y!=0))
{
c=0;y=0;
table4[1]='-';
}
else
table4[1]=' ';
table4[2]=' ';
table4[3]=table[dat%1000%100/10];
table4[4]=table[dat%1000%100%10];
}

write_com(0xc4);
delay(2);
for(a=0;a<5;a++)
write_date(table4[a]);
delay(2);
write_com(0x80);
switch(bh)
{
case 1:for(a=0;a<14;a++)write_date(ta1[a]);break;
case 2:for(a=0;a<14;a++)write_date(ta2[a]);break;
case 3:for(a=0;a<14;a++)write_date(ta3[a]);break;
case 4:for(a=0;a<14;a++)write_date(ta4[a]);break;
default:break;
}
}

///////////x24c02//////////////////
void delay24()
{ ;; }

void init24c02() //初始化
{
sda=1;
delay24();
scl=1;
delay24();
}

void start() //开始信号
{
sda=1;
delay24();
scl=1;
delay24();
sda=0;
delay24();
}

void stop() //停止
{
sda=0;
delay24();
scl=1;
delay24();
sda=1;
delay24();
}

void respons() //应答
{
uchar i;
scl=1;
delay24();
while((sda==1)&&(i<250))i++;
scl=0;
delay24();
}

void write_byte(uchar date) // 写数据子函数
{
uchar i,temp;
temp=date;

for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay24();
sda=CY;
delay24();
scl=1;
delay24();
}
scl=0;
delay24();
sda=1;
delay24();
}

uchar read_byte() // 读数据子函数
{
uchar i,k;
scl=0;
delay24();
sda=1;
delay24();
for(i=0;i<8;i++)
{
scl=1;
delay24();
k=(k<<1)|sda;
scl=0;
delay24();
}
return k;
}
///////写数据函数///////////////////
void write_add(uchar address,uint date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date/256);
respons();
write_byte(date%256);
respons();
stop();
}
uchar read_add(uchar address) //读数据函数
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}

void delay1ms(uchar ms)
{
uchar i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

int keyf(int *num,int up,int dn)
{
uint i;
uchar z;
for(i=0;i<600;i++)
{
display2(n,*num);
if(key1==0)
{
delay1ms(30);
if(key1==0)
{
i=0;
n++;
if(n>=9)
n=0;
while(!key1)
display2(n,*num);
break;
}
}
if(key2==0)
{
delay1ms(10);
if(key2==0)
{
i=0;
if(*num>=up)
*num=up;
else if(n!=4)
*num=*num+1;
else if(*num<100)
*num=*num+5;
else
*num=*num+10;
for(z=0;z<65;z++)
{
display2(n,*num);
if(key2!=0)
break;
}
while(!key2)
{
for(z=0;z<2;z++)
display2(n,*num);
if(*num>=up)
*num=up;
else if(n!=4)
*num=*num+1;
else if(*num<100)
*num=*num+5;
else
*num=*num+10;
}
}
}
if(key3==0)
{
delay1ms(10);
if(key3==0)
{
i=0;
if(*num<=dn)
*num=dn;
else if(n!=4)
*num=*num-1;
else if(*num<100)
*num=*num-5;
else
*num=*num-10;
for(z=0;z<65;z++)
{
display2(n,*num);
if(key3!=0)
break;
}
while(!key3)
{
for(z=0;z<2;z++)
display2(n,*num);
if(*num<=dn)
*num=dn;
else if(n!=4)
*num=*num-1;
else if(*num<100)
*num=*num-5;
else
*num=*num-10;
}
}
}
}
return(*num);
}
void keyjc()
{
uchar i=0;
if(key1==0)
{
delay1ms(10);
if(key1==0)
{
EA=0;
for(i=0;i<20;i++)
{
display(tmp());
}
if(key1==0)
{
write_com(0x01);//清屏指令
n++;
if(n>=5)
n=0;
while(!key1)
{
switch(n)
{
case 1:display2(n,acon);break;
case 0:break;
}
}
if(n==1)
{
keyf(&acon,1250,-530);
if((acon-bcon)<3)
bcon=acon-3;
}
if(n==2)
{
keyf(&bcon,1240,-550);
if((acon-bcon)<3)
acon=bcon+3;
}
write_add(1,acon);//A
delay1ms(15);
write_add(3,bcon);//B
n=0;
write_com(0x01);//清屏指令
}
EA=1;
}
}
}

key()
{
uint i;
if(key4==0)
delay1ms(50);
if(key4==0)
{
write_com(0x01);//清屏指令
for(i=0;i<500;i++)
{
if(key4==0)
{
delay1ms(15);
if(key4==0)
{
i=0;
n++;
if(n>=5)
n=0;
while(!key4)
{
switch(n)
{
case 1: display2(1,acon);break;
case 2: display2(2,bcon);break;
default: break;
}
}
}
}
switch(n)
{
case 1: display2(1,acon);break;
case 2: display2(2,bcon);break;
default: break;
}
}
n=0;
}
}

///////滤波////////
int filter()
{
int tm,buf[6];
uchar i,j;
EA=0;
for(i=0;i<6;i++)
{
buf[i]=tmp();
delay1ms(20);
WDT_CONTR=0x35; /////喂狗
}

for(j=0;j<5;j++)
for(i=0;i<5-j;i++)
if(buf[i]>buf[i+1])
{
tm=buf[i];
buf[i]=buf[i+1];
buf[i+1]=tm;
}
tm=((buf[2]+buf[3])/2);
EA=1;
return (tm);
}

void main()
{
uchar b,c;
Init_Com();
init1602();
init24c02();

b=read_add(1);
delay1ms(15);
c=read_add(2);
delay1ms(15);
acon=b*256+c;
b=read_add(3);
delay1ms(15);
c=read_add(4);
delay1ms(15);
bcon=b*256+c;
AUXR=0x01;// 禁止ALE输出
WDT_CONTR=0x35; //启动看门狗
write_com(0x01);//清屏指令

while(1)
{
at=filter();
display(at);
keyjc();
key();
wen_kong();
weno();
}
}

//////温度控制//////////////

void wen_kong()
{
if((flag==0)&&(not==0))
{
at=filter();
if(at<=bcon)

{
flag=1;
jrk=0;
xhk=0;
he=1;
}
}
}

void weno()
{
if(flag)
{
at=filter();
if(at>=acon)
{
flag=0;
jrk=1;
if(rsg)
xhk=0;
else
xhk=1;
he=0;
}
}
if(not==1)
{
flag=0;
jrk=1;
if(rsg)
xhk=0;
else
xhk=1;
he=0;
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-16
在百度知道你问纯技术问题很可笑

基于单片机的多点温度测量系统的设计如何实现温度的采集
DS18B20是单总线数字温度传感器,可以直接采集温度,并把采集到的数据通过单总线的方式,送入单片机,单片机处理数据,送入4路数码管显示就行了,测量的精度,可以通过软件控制。一条线上是可以挂多个DS18B20了,所以可以实现多点温度采集,但是一条线上最多能连接8个18B20。18B20内部光刻ROM中的有64位序列...

单片机工作总结
刚开始学习是总觉得指令语句太过复杂,怎么也记不住,这时只能多练、多记,刚开始连一个最简单的控制一盏小灯的亮灭的程序都不会写,只能抄写别人做成功的程序,一遍一遍的写,直到能熟练的独自将程序写出来,从简单的入手,逐步的积累,对单片机就会有新的认识,能够自己独立的写一些小的程序,能够将小的程序结合到一起,...

六位数码管时钟
12.51单片机交通灯控制 13.单片机温度控制系统 14.CDMA通信系统中的接入信道部分进行仿真与分析 15.仓库温湿度的监测系统 16.基于单片机的电子密码锁 17.单片机控制交通灯系统设计 18.基于DSP的IIR数字低通滤波器的设计与实现 19.智能抢答器设计 20.基于LabVIEW的PC机与单片机串口通信 21.DSP设计的IIR数字...

求《单片机温度测量系统设计》的相关资料!
单片机温度控制系统是以MSP430单片机为控制核心。整个系统硬件部分包括温度检测系统、信号放大系统、A\/D转换、单片机、I\/O设备、控制执行系统等。单片机温度控制系统控制框图如下所示:温度传感器将温度信息变换为模拟电压信号后,将电压信号放大到单片机可以处理的范围内,经过低通滤波,滤掉干扰信号送入单片机。...

microcontroller智能锅炉温度控制器的时间怎么调整
电源采用三端集成稳压器W7800 (W7900)系列元件7805,交流220 v电压转换为单片机所需要的5V电压;利用AT89S51作为控制器的核心器件;利用集成电路温度传感器DS18B20测量锅炉水温;将测量的水温与设定值比较,单片机另外使用LCD 液晶显示器显示水位的上下限值、当前水位、预先设定的温度报警值和当前采集的温度值。...

求大一电气及其自动化概论课结课论文
基于单片机的频率计设计 72. 基于DIMM嵌入式模块在智能设备开发中的应用 73. 基于DS18B20的多点温度巡回检测系统的设计 74. 计数及数码显示电路的设计制作 75. 矿井提升机装置的设计 76. 中频电源的设计 77. 数字PWM直流调速系统的设计 78. 开关电源的设计 79. 基于ARM的嵌入式温度控制系统的设计 ...

沈阳安歇水边科技有限公司怎么样?
简介:沈阳安歇水边科技有限公司于2017.5.23成立,注册资金3万元,地址位于辽宁省沈阳市皇姑区崇山东路5-5号,公司秉承设计客户满意产品理念,研制管线机产品。基于单片机技术,通过DS18B20温度传感器来进行水温测量,将数据显示在1602液晶显示屏上.使用户使用起来方便快捷公司从事管线机设计、研发、组装、销售、...

51单片机该怎么学?
3、熟练使用C语言,多学习别人的程序;4、对操作系统原理有一定的了解; 5、Protel至少要有点基础;6、要实际动手调试电路的能力。学习单片机的步骤 当前的单片机种类很多,但是 51 是最基础的,因此单片机的学习最好也是从 51 开始,不仅容易上手,而且相当实用。然而 51 单片机毕竟过于基础,后来的很多单片机在功能上都...

我是电子信息工程专业的,马上就要选毕业设计的题目了,不知道选什么好...
要看你对自己如何要求。不过建议尽量选设计类的,因为如果要求要实物实现会比较麻烦,比如 基于RFID车辆管理系统实现。虽然硬件的设计可能看上去很简单,但真的去做了会出现很多意想不到的麻烦。实验阶段的硬件是极其不可靠的。而如果购买比较成熟的硬件产品,相对而言你能做的可扩展的东西就很少,倒答辩的...

本科毕业论文能抄袭么?
80.多传感器障碍物检测系统的软件设计 81.基于单片机的电器遥控器设计 82.基于单片机的数码录音与播放系统 83.单片机控制的霓虹灯控制器 84.电阻炉温度控制系统 85.智能温度巡检仪的研制 86.保险箱遥控密码锁 毕业设计 87.10KV变电所的电气部分及继电保护 88.年产26000吨乙醇精馏装置设计 89.卷扬机自动控制限位...

相似回答