main.c
#include <STC15F2K60S2.H>
#include <intrins.h>
#include <seg.h>
#include <ds18b20.h>
#include <key.h>
#include <pcf8591.h>
#include <led.h>
unsigned int seg_slow_down;//0-65535
unsigned char key_slow_down;
unsigned char key_down,key_old,key_val;
unsigned char segmode=0;
unsigned char ucled[8]={0,0,0,0,0,0,0,0};
unsigned char seg_pos;
unsigned char seg_buf[8]={10,10,10,10,10,10,10,10};
unsigned char seg_point[8]={0,0,0,0,0,0,0,0};
float temperature;
unsigned char seg_wen=25;//0-255
unsigned char sta_wen=25;
float seg_v=0;
bit mode;
void system_init(void)
{
P0=0xff;
P2=P2&0x1f|0x80;
P2&=0x1f;
P0=0x00;
P2=P2&0x1f|0xa0;
P2&=0x1f;
}
void key_proc()
{
if(key_slow_down<10)return;
key_slow_down=0;
key_val= key_read();
key_down=key_val&(key_old^key_val);
key_old=key_val;
switch(key_down)
{
case 4:
if(++segmode==3)segmode=0;
if(segmode==1)seg_wen=sta_wen;
if(segmode==2)sta_wen=seg_wen;
break;
case 8:
if(segmode==1)
{
if(--seg_wen==255)seg_wen=0;
}
break;
case 9:
if(segmode==1)
{
if(++seg_wen==100)seg_wen=99;
}
break;
case 5:
mode^=1;
break;
}
}
void working()
{
if(mode==0)//模式1
{
if(temperature<sta_wen)seg_v=0;
else seg_v=5;
}
else//模式2
{
if(temperature<20)seg_v=1;
else if(temperature>40)seg_v=4;
else
seg_v=0.15*temperature-2;
}
DA_zhuanhua(seg_v*51);
if(mode==0)ucled[0]=1;
else ucled[0]=0;
if(segmode==0)ucled[1]=1;
else ucled[1]=0;
if(segmode==1)ucled[2]=1;
else ucled[2]=0;
if(segmode==2)ucled[3]=1;
else ucled[3]=0;
}
void seg_proc()
{
if(seg_slow_down<500)return;
seg_slow_down=0;
temperature=rd_temperature();
switch(segmode)
{
case 0:
seg_buf[0]=11;
seg_point[5]=1;
seg_buf[4]=(unsigned char)temperature/10;
seg_buf[5]=(unsigned char)temperature%10;
seg_buf[6]=(unsigned int)(temperature*100)%100/10;
seg_buf[7]=(unsigned int)(temperature*100)%10;
break;
case 1:
seg_buf[0]=12;
seg_point[5]=0;
seg_buf[4]=10;
seg_buf[5]=10;
seg_buf[6]=seg_wen/10;
seg_buf[7]=seg_wen%10;
break;
case 2:
seg_buf[0]=13;
seg_point[5]=1;
seg_buf[4]=10;
seg_buf[5]=(unsigned char)seg_v;
seg_buf[6]=(unsigned int)(seg_v*100)%100/10;
seg_buf[7]=(unsigned int)(seg_v*100)%10;
break;
}
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
void ServiceT0() interrupt 1
{
seg_slow_down++;
key_slow_down++;
if(++seg_pos==8)seg_pos=0;
seg_disp(seg_pos,seg_buf[seg_pos],seg_point[seg_pos]);
led_disp(seg_pos,ucled[seg_pos]);
}
void Delay750ms() //@12.000MHz
{
unsigned char i, j, k;
nop();
nop();
i = 35;
j = 51;
k = 182;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
Delay750ms();
rd_temperature();
Timer0Init();
system_init();
while(1)
{
seg_proc();
key_proc();
working();
}
}
seg.c
#include <seg.h>
unsigned char seg_wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char seg_duan[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 ,0xff,
0xc6,0x8c,0x88};
void seg_disp(unsigned char wei,duan,point)
{
P0=0xff;
P2=P2&0x1f|0xe0;
P2&=0x1f;
P0=seg_wei[wei];
P2=P2&0X1f|0xc0;
P2&=0x1f;
P0=seg_duan[duan];
if(point==1)P0&=0x7f;
P2=P2&0X1f|0xe0;
P2&=0x1f;
}
ds18b20.c
#include <ds18b20.h>
sbit DQ=P1^4;
void Delay_OneWire(unsigned int t)
{
unsigned char i;
while(t--){
for(i=0;i<12;i++);
}
}
//
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 rd_temperature(void)
{
unsigned char high;
unsigned char low;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
return ((high<<8)|low)/16.0;
}
key.c
#include <key.h>
unsigned char key_read(void)
{
unsigned char temp=0;
P44=0;P42=1;P35=1;P34=1;
if(P30==0)temp=7;
if(P31==0)temp=6;
if(P32==0)temp=5;
if(P33==0)temp=4;
P44=1;P42=0;P35=1;P34=1;
if(P30==0)temp=11;
if(P31==0)temp=10;
if(P32==0)temp=9;
if(P33==0)temp=8;
P44=1;P42=1;P35=0;P34=1;
if(P30==0)temp=15;
if(P31==0)temp=14;
if(P32==0)temp=13;
if(P33==0)temp=12;
P44=1;P42=1;P35=1;P34=0;
if(P30==0)temp=19;
if(P31==0)temp=18;
if(P32==0)temp=17;
if(P33==0)temp=16;
return temp;
}
pcf8591.c
#include <pcf8591.h>
#include <intrins.h>
#define DELAY_TIME 5
sbit scl=P2^0;
sbit sda=P2^1;
//
static void I2C_Delay(unsigned char n)
{
do
{
nop();nop();nop();nop();nop();
nop();nop();nop();nop();nop();
nop();nop();nop();nop();nop();
}
while(n--);
}
//
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
//
void I2CStop(void)
{
sda = 0;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 1;
I2C_Delay(DELAY_TIME);
}
//
void I2CSendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++){
scl = 0;
I2C_Delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
I2C_Delay(DELAY_TIME);
scl = 1;
byt <<= 1;
I2C_Delay(DELAY_TIME);
}
scl = 0;
}
//
//unsigned char I2CReceiveByte(void)
//{
// unsigned char da;
// unsigned char i;
// for(i=0;i<8;i++){
// scl = 1;
// I2C_Delay(DELAY_TIME);
// da <<= 1;
// if(sda)
// da |= 0x01;
// scl = 0;
// I2C_Delay(DELAY_TIME);
// }
// return da;
//}
//
unsigned char I2CWaitAck(void)
{
unsigned char ackbit;
scl = 1;
I2C_Delay(DELAY_TIME);
ackbit = sda;
scl = 0;
I2C_Delay(DELAY_TIME);
return ackbit;
}
//
//void I2CSendAck(unsigned char ackbit)
//{
// scl = 0;
// sda = ackbit;
// I2C_Delay(DELAY_TIME);
// scl = 1;
// I2C_Delay(DELAY_TIME);
// scl = 0;
// sda = 1;
// I2C_Delay(DELAY_TIME);
//}
void DA_zhuanhua(unsigned char dat)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x41);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
led.c
#include <led.h>
void led_disp(unsigned char pos,enable)
{
static unsigned char temp=0x00;
static unsigned char temp_old=0xff;
if(enable==1)
{
temp |=(0x01<<pos);
}
else
{
temp &=~(0x01<<pos);
}
if(temp!=temp_old)
{
P0=~temp;
P2=P2&0X1F|0X80;
P2&=0X1F;
temp_old=temp;
}
}