求C8051单片机温度采集控制系统的程序

求C8051单片机温度采集控制系统的程序,第1张

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit sda=P2^7;

sbit scl=P3^6;

sbit wp=P3^7;

sbit lcden=P3^5;

sbit lcdrs=P3^0;

sbit lcdrw=P3^1;

sbit modekey=P3^3;

sbit setkey=P3^4;

sbit DQ =P2^0; //定义通信端口

//延时函数

static unsigned char HT,LT,beng; //定义用于存放温度值的高位

sbit second_ge=P2^6;

sbit second_shi=P2^5;

sbit min_ge=P2^4;

sbit min_shi=P2^3;

sbit hour_ge=P2^2;

sbit hour_shi=P2^1;

uchar num,num1,num2,num3,num4,num5,num6,num7,numtemp,tt,tempbuf,a,x,dis1,dis2,dis3,dat;

uchar sbuf,mbuf,hbuf,wbuf,dbuf,mobuf,ybuf,keyV,key1buf,key2buf,miao,shi,fen,xin,ri,yue,nian;

uchar code table[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};//0123456789

uchar code table1[]="2010-01-13 WED";

uchar code table2[]="00:00:00 000 C";

uchar code table3[]="SUNMONTUEWEDTHUFRISAT";

uchar code month_day[]={0,32,30,32,31,32,31,32,32,31,32,31,32,30};

uchar code tempdottab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

void delay()

{ ;; }

void delay1(uint x)

{

uchar a,b;

for(a=x;a>0;a--)

for(b=100;b>0;b--);

}

//以下为LCD显示程序

void write_com(uchar com)

{

lcdrs=0;

P1=com;

delay1(5);

lcden=1;

delay1(5);

lcden=0;

}

void write_data(uchar date)

{

lcdrs=1;

P1=date;

delay1(5);

lcden=1;

delay1(5);

lcden=0;

}

void write_sfm(uchar add,uchar date)

{

uchar shi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);//地址自动加1

write_data(0x30+ge);

}

void write_nyr(uchar add,uchar date)

{

uchar shi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+add);

write_data(0x30+shi);//地址自动加1

write_data(0x30+ge);

}

void write_week(uchar add,uchar date)

{ uchar bai,shi,ge;

bai=table3[date3];

shi=table3[date3+1];

ge=table3[date3+2];

write_com(0x80+add);

write_data(bai);//地址自动加1

write_data(shi);

write_data(ge);

}

lcd_display()

{

miao=dis1;

fen=dis2;

shi=dis3;

//lcdrw=0;

write_sfm(4,shi);

write_sfm(7,fen);

write_sfm(10,miao);

write_week(12,num4);

write_nyr(9,num5);

write_nyr(6,num6);

write_nyr(3,num7);

//lcdrw=1;//必须置位,否则会与按键程序冲突

}

//DB18B20子程序

void delay2(unsigned int i) //

{

while(i--);

}

void delayms(unsigned int i) //延时 1MS

{ unsigned char j=0;

for (;i>0;i--)

{ for (j=0;j<125;j++)

{;}

}

}

//DB18B20初始化函数

Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay2(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay2(80); //精确延时 大于 480us

DQ = 1; //拉高总线

delay2(14);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay2(20);

}

//读一个字节

ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 给脉冲信号

dat>>=1; // 逐位右移

DQ = 1; // 给脉冲信号

if(DQ) //DQ为1 时,表示收到高电平1

dat|=0x80; // 把收到的高电平置给DAT的最高位

delay2(4);

}

return(dat); //

}

//写一个字节

WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01; //把要发送的高电平或者低电平给DQ 发送出去

delay2(5);

DQ = 1;

dat>>=1; //逐位右移

}

delay2(4);

}

//读取温度

void ReadTemperature()

{

unsigned char a=0;

unsigned char b=0;

Init_DS18B20(); //调用初始化函数

WriteOneChar(0xCC); // 跳过读序号列号的 *** 作

//不需要验证序列号。

WriteOneChar(0x44); // 发送温度转换命令 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0xBE); //

a=ReadOneChar(); //读取温度值低位

b=ReadOneChar(); //读取温度值高位

LT=tempdottab[a&0x0f];

//LT=(a&0xF0)5:0; //这句话的意思如果问号前的语句为真(判断小数位的高位是否为1111),是的话,置小数位位5 则LT=5 如果假 LT=0

/如果a是从18B20里读来的低8位值

xiaoshu1 = (a&0x0f)10/16; //小数第一位

xiaoshu2 = (a&0x0f)100/16%10;//小数第二位

xiaoshu=xiaoshu110+xiaoshu2; //小数两位/

HT=b<<4; //

HT+=(a&0xF0)>>4; //

}

void lcd_display_tempmain( )

{

//uchar k;

if (HT>99) //

{

write_com(0x80+0x40+8);//数码管百显示"1",表示100度

write_data(1);

}

if (HT<1) // 如果温度低于1度

{

write_com(0x80+0x40+8);//数码管百显示"-",表示零下温度

write_data(0x2d);

}

write_com(0x80+0x40+12);// 显示小数位温度值

write_data(0x30+LT);

write_com(0x80+0x40+9);// 显示十位温度值

write_data(0x30+HT%100/10);

write_com(0x80+0x40+10);// 显示个位温度值

write_data(0x30+HT%10);

}

//以下为初始化程序

void init()

{

P2=0xff;

delay();

scl=1;

delay();

num=0;

num4=xin=3;

num5=ri=13;

num6=mobuf=yue=1;

num7=nian=10;

tt=0;

wp=0;

modekey=1;

setkey=1;

TMOD=0x01;//设置定时器0为工作方式1

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

//TH1=(65536-20000)/256;

//TL1=(65536-20000)%256;

EA=1;//开总中断

ET0=1;//开定时器0中断

//ET1=1;

lcdrw=0;

lcden=0;

write_com(0x38);//显示模式设置

write_com(0x0c);//显示开关及光标设置

write_com(0x06);//光标书写设置

write_com(0x01);//清屏

write_com(0x80+0x00);//首行显示地址设置

for(num=0;num<15;num++)

{

write_data(table1[num]);

delay1(5);

}

write_com(0x80+0x40);

for(num=0;num<15;num++)

{

write_data(table2[num]);

delay1(5);

}

write_com(0x80+0x40+13);

write_data(0xdf);

ReadTemperature(); //读取温度值

lcd_display_tempmain( ); //对读到的温度值进行处理

TR0=1;//启动定时器0

//TR1=1;

}

//以下为按键管理程序

uchar key()

{

if(modekey==1)

return(0);

delay1(10);

if(modekey==1)

return(0);

while(!modekey);

keyV++;

if(keyV==9)

keyV=0;

return(keyV);

}

void key1()

{

key1buf=key();

switch(key1buf)

{

case 1:

{

TR0=0;

key2buf=1;

write_com(0x80+0x40+6);

write_com(0x0f);

break;

}

case 2:

{

TR0=0;

key2buf=2;

write_com(0x80+0x40+3);

write_com(0x0f);

break;

}

case 3:

{

TR0=0;

key2buf=3;

write_com(0x80+0x40+0);

write_com(0x0f);

break;

}

case 4:

{

TR0=0;

key2buf=4;

write_com(0x80+12);

write_com(0x0f);

break;

}

case 5:

{

TR0=0;

key2buf=5;

write_com(0x80+8);

write_com(0x0f);

break;

}

case 6:

{

TR0=0;

key2buf=6;

write_com(0x80+5);

write_com(0x0f);

break;

}

case 7:

{

TR0=0;

key2buf=7;

write_com(0x80+0);

write_com(0x0f);

break;

}

case 8:

{

key2buf=0;

keyV=0;

write_com(0x0c);

TR0=1;

}

}

if(key2buf!=0)

{

if(setkey==0)

{

delay1(5);

if(setkey==0)

{

while(!setkey);

switch(key2buf)

{

case 1:

{

sbuf=miao;

sbuf++;

if(sbuf>=60)

sbuf=0;

num1=miao=sbuf;

write_sfm(6,miao);

write_com(0x80+0x40+6);

break;

}

case 2:

{

mbuf=fen;

mbuf++;

if(mbuf>=60)

mbuf=0;

num2=fen=mbuf;

write_sfm(3,fen);

write_com(0x80+0x40+3);

break;

}

case 3:

{

hbuf=shi;

hbuf++;

if(hbuf>=24)

hbuf=0;

num3=shi=hbuf;

write_sfm(0,shi);

write_com(0x80+0x40+0);

break;

}

case 4:

{

wbuf=xin;

wbuf++;

if(wbuf>=7)

wbuf=0;

num4=xin=wbuf;

write_week(12,xin);

write_com(0x80+12);

break;

}

case 5:

{

dbuf=ri;

dbuf++;

if(dbuf>=month_day[mobuf])

dbuf=1;

num5=ri=dbuf;

write_nyr(8,ri);

write_com(0x80+8);

break;

}

case 6:

{

mobuf=yue;

mobuf++;

if(mobuf>=13)

mobuf=1;

num6=yue=mobuf;

write_nyr(5,yue);

write_com(0x80+5);

break;

}

case 7:

{

ybuf=nian;

ybuf++;

if(ybuf>=100)

ybuf=0;

num7=nian=ybuf;

write_nyr(2,nian);

write_com(0x80+0);

break;

}

}

}

}

}

}

void main()

{

init();

while(1)

{

key1();

}

}

void time0() interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

tt++;

if(tt==100)

{

tt=0;

ReadTemperature(); //读取温度值

lcd_display_tempmain( ); //对读到的温度值进行处理

num1++;

if(num1>=60)

{

num1=0;

num2++;

if(num2>=60)

{

num2=0;

num3++;

if(num3>=24)

{

num3=0;

num4++;

num5++;

if(num4>=7)

num4=0;

xin=num4;

write_week(12,xin);

if(num5>=month_day[num6])

{

num5=1;

num6++;

if(num6>=13)

{

num6=1;

num7++;

if(num7>=100)

num7=0;

nian=num7;

write_nyr(2,nian);

}

yue=num6;

write_nyr(5,yue);

}

ri=num5;

write_nyr(8,ri);

}

shi=num3;

write_sfm(0,shi);

}

fen=num2;

write_sfm(3,fen);

}

miao=num1;

write_sfm(6,miao);

/if(HT>37|HT<20) // 判断温度范围

{beng=0;} // 如果温度高于37度或者低于20度,则报警告示

else

beng=1;/

}

}

/ if( year%400 == 0 || year%100 != 0 && year%4 == 0 )

dayOfMonth[1] = 29; /

给你一个用ADC0809做AD转换的C程序作参考吧!希望对你有所帮助!

#include<reg52h>

unsigned char code dispbitcode[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};

unsigned char dispbuf[4];

unsigned int i;

unsigned int j;

unsigned char getdata;

unsigned int temp;

unsigned int temp1;

unsigned char count;

unsigned char d;

sbit ST=P3^0;

sbit OE=P3^1;

sbit EOC=P3^2;

sbit CLK=P3^3;

sbit P34=P3^4;

sbit P35=P3^5;

sbit P36=P3^6;

sbit P20=P2^0;

sbit P21=P2^1;

sbit P22=P2^2;

sbit P23=P2^3;

sbit P17=P1^7;

void TimeInitial();

void Delay(unsigned int i);//

void TimeInitial()

{

TMOD=0x10;

TH1=(65536-200)/256;//定时时间为2us,亦即CLK周期为04us

TL1=(65536-200)%256;

EA=1;

ET1=1;

TR1=1;

}

void Delay(unsigned int i)//延时函数

{

unsigned int j;

for(;i>0;i--)

{

for(j=0;j<125;j++)

{;}

}

}

void Display()//

{

P1=dispbitcode[dispbuf[3]];//十位

P20=0;

P21=1;

P22=1;

P23=1;

Delay(10);

P1=0x00;

P1=dispbitcode[dispbuf[2]];//个位

P17=1;//显示小数点

P20=1;

P21=0;

P22=1;

P23=1;

Delay(10);

P1=0x00;

P1=dispbitcode[dispbuf[1]];//十分位

P20=1;

P21=1;

P22=0;

P23=1;

Delay(10);

P1=0x00;

P1=dispbitcode[dispbuf[0]];//百分位

P20=1;

P21=1;

P22=1;

P23=0;

Delay(10);

P1=0x00;

}

void main()//主函数

{

TimeInitial();

while(1)

{

ST=0;//关闭转换

OE=0;//关闭输出

ST=1;//开启转换

ST=0;//关闭转换

P34=0;//选择通道0

P35=0;

P36=0;

while(EOC==0);//判断是否转换结束:是则执行以下语句,否则等待

OE=1;//开启数据输出允许

getdata=P0;//将数据取走,存放在变量getdata中

OE=0;//关闭输出

temp=getdata10/255500;//电压值转换,5V作为参考电压,分成256份

dispbuf[0]=temp%10;//百分位

dispbuf[1]=temp/10%10;//十分位

dispbuf[2]=temp/100%10;//个位

dispbuf[3]=temp/1000;//十位

Display();

}

}

void t1(void) interrupt 3 using 0//定时器中断服务函数;作用:产生CLK信号

{

TH1=(65536-200)/256;

TL1=(65536-200)%256;

CLK=~CLK;

}

以上就是关于求C8051单片机温度采集控制系统的程序全部的内容,包括:求C8051单片机温度采集控制系统的程序、急求用51单片机和热敏电阻制作温度控制器的C程序及电路图、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10047085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存