//MCU:STC12C5A16S2
//晶振:24M
#define uchar unsigned char
#define uint unsigned int
#include "stc12c5a60s2.h"
#include "INTRINS.H"//汇编语句
//变量定义:
unsigned char ly_dis[4];//定义显示缓冲区
code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //表:共阳数码管 0-9
unsigned char l_posit=0; //显示位置
sbit ACC_7 = ACC^7;
unsigned int count2 = 0;//中断次数计数变量2
unsigned int temperate;//温度变量
//引脚定义:
sbit SMG_q = P3^1; //定义数码管阳级控制脚(千位)
sbit SMG_b = P3^2; //定义数码管阳级控制脚(百位)
sbit SMG_s = P3^3; //定义数码管阳级控制脚(十位)
sbit SMG_g = P3^4; //定义数码管阳级控制脚(个位)
//函数声明:
void display(void);//显示函数,显示缓冲区内容
void delay(void);
/********IO引脚定义***********************************************************/
sbit DS=P0^7; //定义DS18B20接口
//显示函数,参数为显示内容
void display()
{
P2=0XFF; //
ly_dis[0] = temperate / 100;
ly_dis[1] = temperate % 100 / 10;
ly_dis[2] = temperate % 10;
switch(l_posit){
case 0: //选择千位数码管,关闭其它位
SMG_q=0;
SMG_b=1;
SMG_s=1;
SMG_g=1;
P2=table[ly_dis[0]]; //输出显示内容
break;
case 1: //选择百位数码管,关闭其它位
SMG_q=1;
SMG_b=0;
SMG_s=1;
SMG_g=1;
P2=table[ly_dis[1]];
break;
case 2: //选择十位数码管,关闭其它位
SMG_q=1;
SMG_b=1;
SMG_s=0;
SMG_g=1;
P2=table[ly_dis[2]]&0x7f;
break;
case 3: //选择个位数码管,关闭其它位
SMG_q=1;
SMG_b=1;
SMG_s=1;
SMG_g=0;
P2=table[ly_dis[3]];
break;
}
l_posit++; //每调用一次将轮流显示一位
if(l_posit>3)
l_posit=0;
}
//*******************
//*******************
//*****温度模块******
//*****核心函数******
//*******************
//*******************
//延时函数
delay2(unsigned int i)
{
while(--i);
}
Init_Tmp()//DS18B20初始化
{
char i;
DS = 0;
delay2(1000);
DS = 1;
delay2(41);
}
Tmp_Write(unsigned char dat)//写数据
{
unsigned char i;
for(i = 0;i<8;i++)
{
if(dat&0x01)
{
DS = 0;
delay2(20);
DS = 1;
delay2(120);
}
else
{
DS = 0;
delay2(120);
DS = 1;
}
dat >>= 1;
}
}
unsigned char Tmp_Read()//读数据
{
unsigned char i;
for(i = 0;i<8;i++)
{
DS = 0;
delay2(2);
DS = 1;
delay2(2);
ACC_7 = DS;
delay2(120);
ACC >>= 1;
}
return ACC;
}
Get_Tmp()//获取温度值
{
unsigned char data1,data2;
Init_Tmp();//初始化DS18B20
delay2(500);
Tmp_Write(0xcc);//跳过18B20的序列号检测
Tmp_Write(0x44);//发送温度转换指令
data1 = Tmp_Read();
data2 = Tmp_Read();
temperate = data1|(data2<<8); //带小数的温度的计算
temperate = temperate * 0.625+0.5;
}
//*******************
//*******************
//*****温度模块******
//*******结束********
//*******************
//*******************
void main()
{
unsigned int i=1;
while(1)
{
if(i == 1) Get_Tmp();
i++;
if(i == 1000) i = 0;
display(); //调用显示
delay();
}
}
stc12c5a60s2 18b20 总是显示0,纠结死了,看着例程照着数据手册写的函数,总是显示0,感觉时序都符合啊,请高手帮忙,不存在硬件问题。
------解决方案--------------------
你的ds18b20时序错误了,驱动程序就不对。另外stc12c5a是1t的单片机 delay程序错的。定时更不就不对,肯定出错吗。程序抄的吧。好好看看ds18b20的datasheet。另外这个温度传感器需要读两次才能读到温度数据。正常情况下如果读写不对读到的一直是0x85.