main.c
#include<stc15f2k60s2.h>
#include"seg.h"
#include"ds18b20.h"
#include"iic.h"
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
long tem;
unsigned char can=25;
unsigned char can1=25;
unsigned char a;
unsigned char valt;
long v;
unsigned char qie=0;
unsigned char mod=0;
void allinit()
{
P2=0X80;P0=0XFF;
P2=0XA0;P0=0X00;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
void display1()
{
SEG(0,tem%10);
SEG(1,tem/10%10);
SEG1(2,tem/100%10);
SEG(3,tem/1000);
SEG(7,10);
}
void display2()
{
SEG(0,can1%10);
SEG(1,can1/10);
SEG(7,11);
}
void display3()
{
v=valt*100/51;
SEG(0,v%10);
SEG(1,v/10%10);
SEG1(2,v/100);
SEG(7,12);
}
void DAC()
{
if(mod==0)
{
if(tem<can*100)
valt=0;
else
valt=255;
}
if(mod==1)
{
if(tem<2000)
valt=51;
if(tem>4000)
valt=204;
if(tem>=2000&&tem<=4000)
valt=(7.65*tem)/100-102;
}
}
void LED()
{
if(mod==0)
{
P2=0X80;
L1=0;
}
else
{
P2=0X80;
L1=1;
}
if(qie==0)
{
P2=0X80;
L2=0;
}
else
{
P2=0X80;
L2=1;
}
if(qie==1)
{
P2=0X80;
L3=0;
}
else
{
P2=0X80;
L3=1;
}
if(qie==2)
{
P2=0X80;
L4=0;
}
else
{
P2=0X80;
L4=1;
}
P2=0X00;
P0=0xFF;
}
void main()
{
allinit();
while(1)
{
while(1)
{
LED();
tem=tem_get();
DAC();
write_DA(valt);
if(qie==0)
display1();
if(qie==1)
display2();
if(qie==2)
display3();
P44=0;P42=1;P3=0x7f;
if(P3==0X77||P3==0X7B)//s4s5
break;
P44=1;P42=0;P3=0xbf;
if(P3==0XB7||P3==0XBB)//s8s9
break;
}
a=P3;/
switch(a)
{
case 0x77:qie++;break;//s4
case 0X7B:mod=!mod;break;//s5
case 0XB7:if(qie==1)can1--;break;//s8
case 0XBB:if(qie==1)can1++;break;//s9
};
if(qie==3)
qie=0;
while(a==P3)
{
can=can1;
tem=tem_get();
DAC();
write_DA(valt);
if(qie==0)
display1();
if(qie==1)
display2();
if(qie==2)
display3();
}
}
}
seg.c
#include<stc15f2k60s2.h>
#include"seg.h"
unsigned char wei[]={0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01};
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xc6,0x8c,0x88};
unsigned char tab1[]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
void delay(int a)
{
while(a--);
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
i = 22;
j = 190;
do
{
while (--j);
} while (--i);
}
void SEG(int a,int b)
{
P2=0xC0;P0=wei[a];
P2=0xE0;P0=tab[b];
Delay1ms();
P2=0X00;
P0 = 0xFF;
}
void SEG1(int a,int b)
{
P2=0xC0;P0=wei[a];
P2=0xE0;P0=tab1[b];
Delay1ms() ;
P2=0X00;
P0 = 0xFF;
}
seg.h
void SEG(int a,int b);
void SEG1(int a,int b);
ds18b20.c
#include<stc15f2k60s2.h>
#include"ds18b20.h"
//单总线内部延时函数
unsigned char temL;
unsigned char temH;
void Delay_OneWire(unsigned int t)
{
while(t--);
}
//单总线写操作
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(50);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(50);
}
//单总线读操作
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(50);
}
return dat;
}
//DS18B20初始化
void init_ds18b20(void)
{
DQ=0;
Delay_OneWire(250);
DQ=1;
Delay_OneWire(250);
}
long tem_get()
{
long tem;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
temL=Read_DS18B20();/
temH=Read_DS18B20();//
tem=temH;
tem<<=8;
tem|=temL;
tem=tem*6.25;
return tem;
}
ds18b20.h
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
sbit DQ = P1^4;
long tem_get();
#endif
iic.c
#include<stc15f2k60s2.h>
#include "iic.h"
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
long V_Rb2;
long V_Rb1;
void Delay6us() //@11.0592MHz
{
unsigned char i;
i = 14;
while (--i);
}
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}
//应答位控制
void IIC_Ack(unsigned char ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
//等待应答
bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++)
{
SCL = 1;
Delay6us();
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
Delay6us();
}
return da;
}
void write_DA(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
iic.h
#ifndef _IIC_H
#define _IIC_H
#include<stc15f2k60s2.h>
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
//函数声明
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(unsigned char ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
void write_DA(unsigned char dat);
#endif