main.c
#include "stc15.h"
#include "stdio.h"
#include "iic.h"
#include "onewire.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
u8 code t_display[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};
u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 LEDbuf=0x00;
u8 ULNbuf=0x00;
u8 SMGtemp[20];
u8 SMGbuf[8];
#define LED 4
#define ULN 5
#define COM 6
#define ABC 7
void Delay1ms();
void delayms(u16 tms);
void se(u8 x);
void init();
void LEDout();
void LEDctrl();
void ULNout();
void ULNctrl();
void SMGconv();
void SMGnow();
void SMGdisp();
void KeyRead();
void ReadOut();
u8 LEDtime=0;
u8 ULNtime=0;
u16 SMGtime=0;
u16 Readtime=0;
u8 page=0;
float wendu=24.25;
float wenduset=25;
float dac=3.25;
u8 mode=1;
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000)
void tm1_isr() interrupt 3 using 1
{
LEDtime++;
ULNtime++;
SMGtime++;
Readtime++;
SMGdisp();
}
void main()
{
u8 i=5;
init();
read18b20();
delayms(800);
AUXR |= 0x40;
TMOD = 0x00;
TL1 = T1MS;
TH1 = T1MS >> 8;
TR1 = 1;
ET1 = 1;
EA = 1;
read18b20();
while(1)
{
if(LEDtime>100)
{
LEDtime=0;
LEDctrl();
}
if(SMGtime>300)
{
SMGtime=0;
SMGnow();
}
if(Readtime>500)
{
Readtime=0;
ReadOut();
}
KeyRead();
}
}
void KeyRead()
{
P32=0;P33=1;
P34=1;P35=1;P42=1;P44=1;
if(P44==0)
{
delayms(10);
if(P44==0)
{
if(mode==1)mode=2;
else if(mode==2)mode=1;
}
while(P44==0);
}
else if(P42==0)
{
delayms(10);
if(P42==0)
{
if(page==1)
{
wenduset=wenduset+1;
if(wenduset>99)wenduset=99;
}
}
while(P42==0);
}
P32=1;P33=0;
P34=1;P35=1;P42=1;P44=1;
if(P44==0)
{
delayms(10);
if(P44==0)
{
if(page==0)page=1;
else if(page==1)page=2;
else if(page==2)page=0;
}
while(P44==0);
}
else if(P42==0)
{
delayms(10);
if(P42==0)
{
if(page==1)
{
wenduset=wenduset-1;
if(wenduset<10)wenduset=10;
}
}
while(P42==0);
}
}
void Delay1ms()
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delayms(u16 tms)
{
u16 i;
for(i=0;i<tms;i++)
{
Delay1ms();
}
}
void se(u8 x)
{
switch(x)
{
case 0:P2=P2&0x1F;break;
case LED:P2=P2&0x1F|0x80;break;
case ULN:P2=P2&0x1F|0xA0;break;
case COM:P2=P2&0x1F|0xC0;break;
case ABC:P2=P2&0x1F|0xE0;break;
}
}
void init()
{
se(LED);LEDbuf=0x00;P0=~LEDbuf;se(0);
se(ULN);ULNbuf=0x00;P0=ULNbuf;se(0);
se(COM);P0=0xFF;se(0);
se(ABC);P0=0x00;se(0);
}
void LEDout()
{
se(LED);P0=~LEDbuf;se(0);
}
void LEDctrl()
{
if(mode==1)
{
LEDbuf =LEDbuf |0x01;
}
else if(mode==2)
{
LEDbuf =LEDbuf &(~0x01);
}
if(page==0)
{
LEDbuf =LEDbuf |0x02;
LEDbuf =LEDbuf &(~0x04);
LEDbuf =LEDbuf &(~0x08);
}
else if(page==1)
{
LEDbuf =LEDbuf |0x04;
LEDbuf =LEDbuf &(~0x02);
LEDbuf =LEDbuf &(~0x08);
}
else if(page==2)
{
LEDbuf =LEDbuf |0x08;
LEDbuf =LEDbuf &(~0x02);
LEDbuf =LEDbuf &(~0x04);
}
LEDout();
}
void ReadOut()
{
wendu=read18b20();
if(mode==1)
{
if(wendu<wenduset)
{
dac=0;
writeDAC(0);
}
else if(wendu>=wenduset)
{
dac=5;
writeDAC(255);
}
}
else if(mode==2)
{
dac=0.15*wendu-2;
writeDAC((int)(dac*51));
}
}
void ULNout()
{
se(ULN);P0=ULNbuf;se(0);
}
void ULNctrl()
{
}
void SMGconv()
{
u8 i,j,temp;
while(SMGtemp[i]!=0)
{
switch(SMGtemp[i])
{
case '0':temp=0x3F;break;
case '1':temp=0x06;break;
case '2':temp=t_display[2];break;
case '3':temp=t_display[3];break;
case '4':temp=t_display[4];break;
case '5':temp=t_display[5];break;
case '6':temp=t_display[6];break;
case '7':temp=t_display[7];break;
case '8':temp=t_display[8];break;
case '9':temp=t_display[9];break;
case 'C':temp=0x39;break;
case 'P':temp=0x73;break;
case 'A':temp=0x77;break;
default:temp=0x00;break;
}
if(SMGtemp[i+1]=='.')
{
temp =temp|0x80;
i=i+2;
}
else
{
i=i+1;
}
SMGbuf[j]=temp;
j=j+1;
}
}
void SMGnow()
{
if(page==0)
{
sprintf(SMGtemp,"Cxxx%5.2f",wendu);
}
else if(page==1)
{
sprintf(SMGtemp,"Pxxxxx%2d",(int)wenduset);
}
else if(page==2)
{
sprintf(SMGtemp,"Axxxx%3.2f",dac);
}
SMGconv();
}
void SMGdisp()
{
static u8 i=0;
se(COM);P0=0xFF;se(0);
se(ABC);P0=0x00;se(0);
se(COM);P0=T_COM[i];se(0);
se(ABC);P0=~SMGbuf[i];se(0);
i=i+1;
if(i>=8)i=0;
}
iic.c
#include "stc15.h"
#include "intrins.h"
#include "iic.h"
#define DELAY_TIME 60
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit;
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
void writeDAC(unsigned char temp)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(temp);
IIC_WaitAck();
IIC_Stop();
}
iic.h
#ifndef __IIC_H
#define __IIC_H
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
void writeDAC(unsigned char temp);
#endif
onewire.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
unsigned char rd_temperature(void);
float read18b20();
#endif
onewire.c
#include "stc15.h"
#include "onewire.h"
sbit DQ = P1^4;
void Delay_OneWire(unsigned int t)
{
t=t*12;
while(t--);
}
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
float read18b20()
{
unsigned char high,low;
unsigned int temp;
float xx;
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE);
Delay_OneWire(200);
low = Read_DS18B20();
high =Read_DS18B20();
temp= (high&0x1F) <<8 |low;
xx=temp*0.0625;
return xx;
}