您的当前位置:首页温度控制系统C语言设计

温度控制系统C语言设计

2023-01-06 来源:小侦探旅游网


#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit DS=P3^3; //定义DS18B20接口

sbit p30=P3^0; s

bit p31=P3^1;

sbit at=P3^4; //定义增温控制接口

sbit dt=P3^5; //定义减温控制接口

static int temp;

uint cout=0;

static int l_tmp;

uchar flag1;

uint i=0;

Voiddisplay(void); code

unsigned

char

table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80,0x00}; //共阴数码管 0-9空表

Unsigned char l_tmpdate[8]={0,0,0,0,0,0,0,0}; 1,2,3,4,5,6,7,8,就是本程序显示的八个数

int tmp(void);

void tmpchange(void);

oid tmpwritebyte(uchar dat);

uchar tmpread(void);

bit tmpreadbit(void);

void dsreset(void);

void delayb(uint count);

void zhuti(l_tmp);

//定义数组变量,并赋值

void delayc(unsigned int j);

void add(void);

void sub(void);

void ISR_EX0() interrupt 0

{

delayc(2000);

cout++;

}

void main() //主函数

{

at=1;

dt=1;

EA=1; //首先开启总中断

EX0=1; //开启外部中断 0

IT0=1; // 设置成下降沿触发方式

while(1)

{

tmpchange(); //温度转换

l_tmp=tmp();

zhuti(l_tmp);

display();

while(cout%2!=0)

{

display();

while((cout%2!=0) && (p31==0))

{add();}

while((cout%2!=0) && (p30==0))

{sub();}

}

}

}

void delayc(uint j)

{

while(--j>0);

}

void add(void)

{

delayc(20000);

l_tmp=l_tmp+10;

zhuti(l_tmp);

}

void sub(void)

{

delayc(20000);

l_tmp=l_tmp-10;

zhuti(l_tmp);

}

void zhuti(int l_tmp)

{

l_tmpdate[0]=l_tmp/100;

l_tmp=l_tmp%100;

l_tmpdate[1]=l_tmp/10;

l_tmp=l_tmp%10;

l_tmpdate[2]=11;

l_tmpdate[3]=l_tmp;

if(((l_tmpdate[0]>1)&&(l_tmpdate[1]>6))|((l_tmpdate[0]>2)&&(l_tmpdate[0]<6)))dt=0;

else dt=1;

if(((l_tmpdate[0]<2)&&(l_tmpdate[1]<8))|(l_tmpdate[0]<1))at=0;

else at=1;

}

void display(void) //显示

{

uchar i,temp;

P2=0;

P1=P1&0xf8;

for(i=0;i<4;

i++)

{

temp=l_tmpdate[i];

temp=table[temp];

P2=temp;

delayc(100);

if(i==7)break;

P2=0;

P1++;

}

}

void delayb(uint count) {

//delay

uint i;

while(count)

{

i=200;

while(i>0) i--;

count--;

}

}

void dsreset(void) {

uint i;

DS=0; i=103;

//DS18B20初始化

while(i>0)i--;

DS=1;

i=4;

while(i>0)i--;

}

bit tmpreadbit(void) {

uint i;

bit dat;

DS=0;i++; //小延时一下 DS=1;

i++;

i++;

// 读一位

dat=DS;

i=8;

while(i>0)i--;

return (dat);

31

}

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) {

DS=0;

i++;

i++;

DS=1;

i=8;

while(i>0)i--; }

// 写1部分

Else

{

DS=0; //写0部分

i=8;

while(i>0)i--;

DS=1;

i++;

i++;

}

}

}

void tmpchange(void) {

//发送温度转换命令

dsreset(); //初始化DS18B20

delayb(1); //延时

tmpwritebyte(0xcc); // 跳过序列号命令

tmpwritebyte(0x44); //发送温度转换命令 }

int tmp() //获得温度

{

float tt;

uchar a,b;

dsreset();

delayb(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe); //发送读取数据命令

a=tmpread(); //连续读两个字节数据

b=tmpread();

temp=b;

temp<<=8;

temp=temp|a; //两字节合成一个整型变量。

tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625 度,所以读回数据的最低位代表的是0.0625度。

temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显 示数字,同时进行一个四舍五入操作。

return temp; //返回温度值

}

void add(void)

{

delayc(20000);

l_tmp=l_tmp+10;

zhuti(l_tmp);

}

void sub(void)

{

delayc(20000);

l_tmp=l_tmp-10;

zhuti(l_tmp);

}

void zhuti(int l_tmp)

{

l_tmpdate[0]=l_tmp/100;

l_tmp=l_tmp%100;

l_tmpdate[1]=l_tmp/10;

l_tmp=l_tmp%10;

l_tmpdate[2]=11;

l_tmpdate[3]=l_tmp;

if(((l_tmpdate[0]>1)&&(l_tmpdate[1]>6))|((l_tmpdate[0]>2)&&(l_tmpdate[0]<6)))dt=0;

else dt=1;

if(((l_tmpdate[0]<2)&&(l_tmpdate[1]<8))|(l_tmpdate[0]<1))at=0;

else at=1;

}

void display(void) //显示

{

uchar i,temp;

P2=0;

P1=P1&0xf8;

for(i=0;i<4;

i++)

{

temp=l_tmpdate[i];

temp=table[temp];

P2=temp;

delayc(100);

if(i==7)break;

P2=0;

P1++;

}

}

void delayb(uint count) {

uint i;

while(count)

{

i=200;

while(i>0) i--;

count--;

}

//delay

}

void dsreset(void) //DS18B20初始化

{

uint i;

DS=0;

i=103;

while(i>0)i--;

DS=1;

i=4;

while(i>0)i--;

}

bit tmpreadbit(void) {

// 读一位

uint i;

bit dat;

DS=0;i++; //小延时一下

DS=1;

i++;

i++;

dat=DS;

i=8;

while(i>0)i--;

return (dat);

31

}

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) {

DS=0;

// 写1部分

i++;

i++;

DS=1;

i=8;

while(i>0)i--; }

Else

{

DS=0; i=8;

while(i>0)i--; DS=1;

i++;

//写0部分

i++;

}

}

}

void tmpchange(void) //发送温度转换命令

{

dsreset(); //初始化DS18B20

delayb(1); //延时

tmpwritebyte(0xcc); // 跳过序列号命令

tmpwritebyte(0x44); //发送温度转换命令 }

int tmp() //获得温度

{

float tt;

uchar a,b;

dsreset();

delayb(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe); //发送读取数据命令

a=tmpread(); //连续读两个字节数据

b=tmpread();

temp=b;

temp<<=8;

temp=temp|a; //两字节合成一个整型变量。

tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625 度,所以读回数据的最低位代表的是0.0625度。

temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显 示数字,同时进行一个四舍五入操作。

return temp; //返回温度值

因篇幅问题不能全部显示,请点此查看更多更全内容