#浅浅试水#
//main.c文件内容
#include <STC15F2K60S2.H>
#include <intrins.h>
#include "onewire.h"
#include "iic.h"
u8 pcfda_point=0;
u8 status=0;
u8 key=0;
u8 point=0;
u16 light_val=0;
u16 temp_set=25;
u16 temp_val=0;
u8 flag_key=0;
float da=0;
u8 da_val=0;
u8 flag_display=0;
u8 a[8]={10,10,10,10,10,10,10,10};
u16 flag_ds18b20=0;
u16 flag_pcfda=0;
float temp_new;
void ctrl(u8 ctrl)
{
u8 p2data=P2;
P2=ctrl<<5|(P2&0x1f);
P2=p2data;
}
u8 key_val(void)
{
u8 row=0,column=0,adc=0;
P3=0x0f;P42=0;P44=0;
if(P30==0)row=1;
if(P31==0)row=2;
if(P32==0)row=3;
if(P33==0)row=4;
P3=0xf0;P44=1;P42=1;
if(P44==0)column=1;
if(P42==0)column=2;
if(P35==0)column=3;
if(P34==0)column=4;
if(row!=0)adc=4*column+(4-row);
return adc;
}
u8 key_sta(void)
{
static sta=0;
u8 ret=0,val=key_val();
switch(sta)
{
case 0:if(val!=0)sta=1;break;
case 1:if(val==0)sta=0;else{sta=2;ret=val;}break;
case 2:if(val==0)sta=0;break;
default:break;
}
return(ret);
}
void leds(u8 status,u8 point)
{
u8 p=(point+1)%2;
P0=~(0x02<<status|p);
ctrl(4);
}
void display(u8 site,u8 light)
{
P0=0xff;
ctrl(7);
P0=0x01<<site;
ctrl(6);
switch(light%20)
{
case 0:P0=0xc0;break;
case 1:P0=0xf9;break;
case 2:P0=0xa4;break;
case 3:P0=0xb0;break;
case 4:P0=0x99;break;
case 5:P0=0x92;break;
case 6:P0=0x82;break;
case 7:P0=0xf8;break;
case 8:P0=0x80;break;
case 9:P0=0x90;break;
case 10:P0=0xff;break;
case 11:P0=0xc6;break;
case 12:P0=0x8c;break;
case 13:P0=~0x77;break;
default:break;
}
if(light>=20)P0=P0&0x7f;
ctrl(7);
}
void get(u8 a0,u8 a1,u8 a2,u8 a3,u8 a4,u8 a5,u8 a6,u8 a7)
{
a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;a[5]=a5;a[6]=a6;a[7]=a7;
}
void Process(void)
{
if(flag_ds18b20>101){flag_ds18b20=0;temp_new=ds18b20();temp_val=(int)temp_new;}
if(flag_pcfda>199){flag_pcfda=0;pcfda(da_val);}
if(flag_key>10){flag_key=0;key=key_sta();}
}
void Timer2_Init(void) //1??@12.000MHz
{
AUXR &= 0xFB; //?????12T??
T2L = 0x18; //???????
T2H = 0xFC; //???????
AUXR |= 0x10; //???2????
IE2 |= 0x04; //?????2??
EA=1;
}
void main()
{
P0=0xff;
ctrl(4);
P0=0x00;
ctrl(5);
Timer2_Init();
while(1)
{
Process();
if(key==4){key=0;status++;status=status%3;}else{status=status%3;}
if(key==5){key=0;point++;point=point%2;}else{point=point%2;}
if(point==0)
{
if(temp_val>=temp_set*100)light_val=500;
if(temp_val<temp_set*100)light_val=0;
da_val=light_val/100*51;
}
else
{
if(temp_val<=2000)da=100;
else if(temp_val>=4000)da=400;
else{ da=((temp_val-2000)*1.5+1000)/10;}
light_val=(int)da;
da_val=(int)(da*51/100);
}
switch(status)
{
case 0:{
get(11,10,10,10,temp_val/1000,20+temp_val/100%10,temp_val%100/10,temp_val%10);
break;
}
case 1:{
if(key==8){key=0;temp_set--;}
if(key==9){key=0;temp_set++;}
get(12,10,10,10,10,10,temp_set/10,temp_set%10);
break;}
case 2:{
get(13,10,10,10,10,20+light_val/100,light_val%100/10,light_val%10);
break;}
default:break;
}
}
}
void Timer2_Isr(void) interrupt 12
{
flag_ds18b20++;
flag_pcfda++;
flag_key++;
flag_display++;
flag_display=flag_display%8;
leds(status,point);
display(flag_display,a[flag_display]);
}
//iic.c
/*
????: IIC??????
????: Keil uVision 4.10
????: CT107????????? 8051,12MHz
? ?: 2011-8-9
*/
#include "reg52.h"
#include "intrins.h"
#include "iic.h"
#define DELAY_TIME 5
#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; // 0:??,1:???
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;
}
//??I2C??????
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;
}
//?I2C???????
/*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 pcfda(u8 ctrl)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(ctrl);
IIC_WaitAck();
IIC_Stop();
}
//iic.h
#ifndef _IIC_H
#define _IIC_H
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
void pcfda(u8 ctrl);
#endif
//onewire.c
#include <STC15F2K60S2.H>
#include <intrins.h>
#include "onewire.h"
sbit DQ = P1^4;
void Delay_OneWire(unsigned int t) //STC89C52RC
{
t=t*12;
while(t--);
}
//??????DS18B20?????
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);
}
//?DS18B20??????
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;
}
//DS18B20?????
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 ds18b20(void)
{
u8 low,high;
float adc=11;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
adc=(high<<8|low)*6.25;
return adc;
}
//onewire.h
#ifndef _ONEWIRE_H
#define _ONEWIRE_H
#include "iic.h"
float ds18b20(void);
#endif
基本上自己编写的部分和底层代码都已经包含,大家通过复制代码就可以看一下最终运行效果,如有错误欢迎指出