📄 温测b.c
字号:
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char discode[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf,0xc6,0x89,0x9e};
unsigned char discode1[]={0x40,0x79,0x24,0x30,0x19,012,0x02,0x78,0x00,0x10};
unsigned char displaybuf[]={0,0,0,0,0};
unsigned char readdata[2]={0};
unsigned char k,timecount,n=0,count=0,second=0,minite=0,hour=1;
uint addr=0x00,addup,result,judgecount=0;
bit a=0;tmr1=0,d=0,dealen=0,sflag,b,judge=0,judgechange=0;
unsigned char i=0;
sbit DQ=P0^0;
sbit sda=P3^7;
sbit scl=P3^6;
sbit P05=P0^5;
//MCU初始化部分*************
void MCU_init();
//DS820************************
void DS1820_delay(unsigned int x);
void writecommandtods18b20( uchar command );
uchar readdatafromds18b20();
void resetpulse();
//IIC部分***************
void IIC_delay(uchar x);
void flash();
void x24c02_init();
void start();
void stop();
void writex(uchar j);
uchar readx();
void clock();
uchar x24c02_read(uchar address);
void x24c02_write(uchar address,uchar info);
void delay10ms(void);
//键盘处理函数
void keytr0_deal(uchar x)
{
while((P3&0x3f)!=0x3f);
switch(x)
{
case 0x3e: judgechange=1;b=1;displaybuf[0]=12;break;
case 0x3d: judgechange=0;displaybuf[0]=13;break;
case 0x3b: {
if(judgechange)
{
x24c02_write(2*addr,readdata[0]);
x24c02_write(2*addr+1,readdata[1]);
addr++;addup=addr;
}
break;
}
case 0x37:{ judgechange=0;
if(addr==0) break;
if(addup==addr)
{if(addr>10) displaybuf[0]=10;
else displaybuf[0]=addr;
k=displaybuf[0];}
if((addr-addup)<k)
{
addup--;
readdata[1]=x24c02_read(2*addup+1);
readdata[0]=x24c02_read(2*addup);
dealen=1;
displaybuf[0]--;
}
break;
}
case 0x2f:{
judgechange=0;
if(addr==0) break;
if(addup==(addr-1)) {break;}
if(addup<addr-1)
{
addup++;
displaybuf[0]++;
readdata[0]=x24c02_read(2*addup);
readdata[1]=x24c02_read(2*addup+1);
dealen=1;
}
break;
}
case 0x1f: tmr1=1;judgechange=1;b=1;judgecount=0;addr=0;displaybuf[0]=14;break;
default: break;
}
}
void change_deal(void)
{
if(judgechange&&(!b))
{
timecount++;
if(timecount==50)
{
b=1;
timecount=0;
resetpulse();
writecommandtods18b20(0xcc);
writecommandtods18b20(0xbe);
readdata[0]=readdatafromds18b20();
readdata[1]=readdatafromds18b20();
dealen=1;
}
}
if(dealen==1)
{
sflag=1;
if((readdata[1] & 0xf8)!=0x00)
{
sflag=0;
readdata[1]=~readdata[1];
readdata[0]=~readdata[0];
result=readdata[0]+1;
readdata[0]=result;
if(result>255)
{
readdata[1]+=1;
}
}
if(sflag) displaybuf[1]=10;
else displaybuf[1]=11;
result=((readdata[1]*256+readdata[0])*0.0625)*10;
dealen=0;
}
displaybuf[2]=result/100;
displaybuf[3]=result/10%10;
displaybuf[4]=result%10;
}
void keytr1_deal(uchar x)
{
while((P3&0x3f)!=0x3f);
switch(x)
{
case 0x3d: judgechange=0;displaybuf[0]=13;tmr1=0;break;
default: break;
}
}
void display(void)
{
P1=(0x08<<n);
P2=discode[displaybuf[n]];
n++;
if(n==6) n=0;
}
void main(void)
{
MCU_init();
x24c02_init();
while(1)
{
if(tmr1) {TR0=0;TR1=1;}
else {TR0=1;TR1=0;}
if(judgechange&&b)
{
resetpulse();
writecommandtods18b20(0xcc);
writecommandtods18b20(0x44);
b=0;
}
}
}
void t0(void) interrupt 1
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
display();
if((P3&0x3f)!=0x3f) judgecount++;
if((judgecount==25))
{
judgecount=0;
keytr0_deal(P3&0x3f);
}
change_deal();
}
void t1(void) interrupt 3
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
display();
count++;
if(count==250) /*{second++;count=0;}
if(second==1) {minite++;second=0;}
if(minite==1) {hour++;minite=0;}
if(hour==1)*/
{ x24c02_write(2*addr,readdata[0]);
x24c02_write(2*addr+1,readdata[1]);
addr++;addup=addr;
hour=0;
}
if((P3&0x3f)!=0x3f) judgecount++;
if((judgecount==25))
{
judgecount=0;
keytr1_deal(P3&0x3f);
}
change_deal();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DS1820_delay( unsigned int x )
{
while( x-- );
}
void writecommandtods18b20( uchar command )
{
uchar a;
for( a=8; a>0; a-- )
{
DQ = 0;
_nop_(); // dalay 5us;
_nop_();
_nop_();
DQ = command&0x01;
DS1820_delay(5); //dalay 60us;
command >>= 1;
DQ = 1;
_nop_(); // dalay 5us;
_nop_();
_nop_();
}
}
uchar readdatafromds18b20()
{
uchar i;
uchar da;
for( i=8; i>0; i-- )
{
DQ = 0;
_nop_();
da >>= 1; //delay 1us;
DQ = 1;
if (DQ)
da |= 0x80;
DS1820_delay(4); // dalay 50us;
_nop_(); // dalay 5us;
_nop_();
}
return da;
}
void resetpulse()
{
loop:
DQ = 1;
_nop_(); // dalay 5us;
_nop_();
_nop_();
_nop_();
_nop_();
DQ = 0;
DS1820_delay(80); //delay >480us;
DQ = 1;
DS1820_delay(10); //delay = 100us;
if( DQ )
goto loop;
DS1820_delay(20);
DQ = 1;
_nop_(); // dalay 5us;
_nop_();
_nop_();
_nop_();
_nop_();
}
void IIC_delay(uchar x)
{
uint i;
for(i=0;i<x;i++);
}
void flash()
{ ; ; }
void x24c02_init() //24c02初始化子程序
{
scl=1;
flash();
sda=1;
flash();
}
void start() //启动I2C总线
{
sda=1;
flash();
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
void stop() //停止I2C总线
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
void writex(uchar j) //写一个字节
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
flash();
sda=CY;
flash();
scl=1;
flash();
}
scl=0;
flash();
sda=1;
flash();
}
uchar readx() //读一个字节
{
uchar i,j,k=0;
scl=0;
flash();
sda=1;
for (i=0;i<8;i++)
{
flash();
scl=1;
flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j;
scl=0;
}
flash();
return(k);
}
void clock() //I2C总线时钟
{
uchar i=0;
scl=1;
flash();
while ((sda==1)&&(i<255))i++;
scl=0;
flash();
}
////////从24c02的地址address中读取一个字节数据/////
uchar x24c02_read(uchar address)
{
uchar i;
start();
writex(0xa0);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i=readx();
stop();
IIC_delay(10);
return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c02_write(uchar address,uchar info)
{
EA=0;
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
EA=1;
IIC_delay(100);
}
void MCU_init()
{
TMOD=0x11;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
ET0=1;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
ET1=1;
TR1=0;
EA=1;
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -