以下代码已经通过测评
main.h
#ifndef MAIN_H
#define MAIN_H
#define y4 P2=(P2&0x1f)|0x80
#define y5 P2=(P2&0x1f)|0xa0
#define y6 P2=(P2&0x1f)|0xc0
#define y7 P2=(P2&0x1f)|0xe0
#define u8 unsigned char
#define u16 unsigned int
#include <STC15F2K60S2.H>
#include "intrins.h"
#include "all_1.h"
#include "all_2.h"
void Delay1ms(void); //@12.000MHz
void Delay750ms(void); //@12.000MHz
#endif
main.c
#include "main.h"
u8 seg[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
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}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
u8 smg[8]={0,0,0};
u8 p=0,f=0;
void smg_dis() //数码管
{
u8 i;
for(i=0;i<8;i++)
{
y6;
P0=(1<<i);
y7;
P0=~seg[smg[i]];
Delay1ms();
}
y6;
P0=0xff;
y7;
P0=0xff;
}
void init() //初始化
{
y5;
P0=0x00;
y4;
P0=0xff;
y6;
P0=0xff;
y7;
P0=0xff;
}
void scanf() //按键扫描
{ u8 key_num=0;
static u8 key_state=0, hang=0;
switch(key_state)
{
case 0:
{
P3=0x0f;P44=0;P42=0;
if(P3!=0x0f)
{
key_state=1;
}
}break;
case 1:
{
P3=0x0f;P44=0;P42=0;
if(P3!=0x0f)
{
if(P30==0)hang=1;
if(P31==0)hang=2;
if(P32==0)hang=3;
if(P33==0)hang=4;
switch(hang)
{
case 1:
{
P3=0xf0;P44=1;P42=1;
if(P44==0){key_num=4;key_state=2;
}
if(P42==0){key_num=0;key_state=2;}
if(P35==0){key_num=0;key_state=2;}
if(P34==0){key_num=4;key_state=2;
}
}break;
case 2:
{
P3=0xf0;P44=1;P42=1;
if(P44==0){key_num=0;key_state=2;
}
if(P42==0){key_num=0;key_state=2;}
if(P35==0){key_num=0;key_state=2;}
if(P34==0){key_num=0;key_state=2;
}
}break;
case 3:
{
P3=0xf0;P44=1;P42=1;
if(P44==0){key_num=5;key_state=2;
if(p==0)
{
p=1;
}
else if(p==1)
{
p=0;
}}
if(P42==0){key_num=0;key_state=2;}
if(P35==0){key_num=0;key_state=2;}
if(P34==0){key_num=0;key_state=2;}
}break;
case 4:
{
P3=0xf0;P44=1;P42=1;
if(P44==0){key_num=4;key_state=2;
if(f==0 && p==0)
{
f=1;
}
else if(f==1 && p==0)
{
f=0;
}}
if(P42==0){key_num=0;key_state=2;}
if(P35==0){key_num=0;key_state=2;}
if(P34==0){key_num=0;key_state=2;}
}break;
}
}
else
{
key_state=0;
}
}break;
case 2:
{
P3=0x0f;P44=0;P42=0;
if(P3==0x0f)
{
key_state=0;
}
}break;
}
}
u16 tempreture() //温度测量
{
u16 high,low, date;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(500);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
date=((high<<8)|low)*0.625;
return date ;
}
void main()
{
u16 temp;
float l;
init();
tempreture();
Delay750ms();
while(1)
{
scanf();
switch(p)
{
case 0://模式切换
{
scanf();
switch(f)
{
case 0://温度模式
{
temp=tempreture();
smg[0]=1;smg[1]=16;smg[2]=16;smg[3]=16;
smg[4]=16;smg[5]=temp/100;smg[6]=temp%100/10+32;smg[7]=temp%10;
if(temp<=100)
{
l=1;
}
else if(temp>100 && temp<400)
{
l=(4*temp/10-10)/30.0;
}
else if(temp<=400)
{
l=5;
}
}break;
case 1://光照模式
{
temp=iic_r(1);
if(temp<100)
{
smg[0]=2;smg[1]=16;smg[2]=16;smg[3]=16;
smg[4]=16;smg[5]=16;smg[6]=temp/10;smg[7]=temp%10;
}
else
{
smg[0]=2;smg[1]=16;smg[2]=16;smg[3]=16;
smg[4]=16;smg[5]=temp/100;smg[6]=(temp%100)/10;smg[7]=temp%10;
}
if(temp<=10)
{
l=1;
}
else if(temp>10 && temp<240)
{
l=(4*temp+190)/230.0;
}
else if(temp>240)
{
l=5;
}
}break;
}
iic_w(0x40,l*51);
}break;
case 1:
{
switch(f)
{
case 0://输出温度模式
{
temp=tempreture();
if(temp<=100 || temp>=400)
{
if(temp<=100) l=1;
if(temp>=400) l=5;
smg[0]=25;smg[1]=16;smg[2]=16;smg[3]=16;
smg[4]=16;smg[5]=16;smg[6]=l+32;smg[7]=0;
}
else if(temp>100 && temp<400)
{
l=(4*temp/10-10)/30.0;
smg[0]=25;smg[1]=16;smg[2]=16;smg[3]=16;
smg[4]=16;smg[5]=16;smg[6]=l*10/10+32;smg[7]=(int)(l*10)%10;
}
}break;
case 1://输出光照模式
{
temp=iic_r(1);
if(temp<=10 || temp>240)
{
if(temp<=10) l=1;
if(temp>=240) l=5;
smg[0]=25;smg[1]=16;smg[2]=16;smg[3]=16;
smg[4]=16;smg[5]=16;smg[6]=l+32;smg[7]=0;
}
else if(temp>10 && temp<240)
{
l=(4*temp+190)/230.0;
smg[0]=25;smg[1]=16;smg[2]=16;smg[3]=16;
smg[4]=16;smg[5]=16;smg[6]=l*10/10+32;smg[7]=(int)(l*10)%10;
}
}break;
}
iic_w(0x40,l*51);
}break;
}
if(f==0)
{
y4;
P0=0xfe;
}
else if(f==1)
{
y4;
P0=0xfd;
}
else if(p!=0 && p!=1)
{
y4;
P0=0xff;
}
smg_dis();
}
}
void Delay1ms(void) //@12.000MHz
{
unsigned char data i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void Delay750ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 35;
j = 51;
k = 182;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
iic.c
#include "main.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);
}
onewire.c
#include "main.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;
}
all_.h
#ifndef ALL_1_H
#define ALL_1_H
void scanf();
void init();
void smg_dis();
void Delay750ms(void); //@12.000MHz
void Delay1ms(void); //@12.000MHz
static void I2C_Delay(unsigned char n);
void I2CStart(void);
void I2CStop(void);
void I2CSendByte(unsigned char byt);
unsigned char I2CReceiveByte(void);
unsigned char I2CWaitAck(void);
void I2CSendAck(unsigned char ackbit);
u8 iic_r(u8 addr);
void iic_w(u8 addr,date);
#endif
all_2.h
#ifndef ALL_2_H
#define ALL_2_H
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
u16 tempreture();
#endif
期间遇到问题:
1,温度只能测到25.5,
原因:是因为温度测量函数的返回类型是 unsigned char ,数值范围是0~255
解决措施:将返回类型改为unsigned int ,这样就可以满足测温到40°。