stc12c5a60s2 18b20 总是显示0 求助啊
//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();
}
}