#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程序及电路图、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)