STC15F2K60S2+DS18B20怎么一直都是显示-0.1°,求大佬帮忙,单片机代码如下, 本帖最后由 111gjk 于 2021-1-8 18:48 编辑
#include”STC15F2K60S2.h”
//#include”reg52.h”
#include”intrins.h”
sbit DQ=P4^2;
// sbit DQ=P3^6;
sbit beep=P3^7;
sbit LED_H=P1^4;
sbit LED_L=P1^5;
unsigned char code Duan_Ma[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
unsigned char code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
char Alarm_Temp[2]={70,-20};
unsigned long int Current=0;
unsigned char Temp_Value[]={0x00,0x00};
unsigned char Display[]={0,0,0,0};//待显示的各温度数位
bit Alarm_H=0,Alarm_L=0;
bit DS18B20_IS_OK=1;
unsigned int Timer0_cout=0;
void delay(unsigned int k)
{
while(–k);
}
void delay15us(unsigned long int i) //误差 0us
{
while(i–)
{
unsigned char a;
for(a=6;a>0;a–);
}
}
// void dsreset()
// {
// unsigned int i;
// DQ=0;
// i=103;
// while(i>10)
// i–;
// DQ=1;
// i=4;
// while(i>0)
// i–;
// }
unsigned char DS18B20_Init()//18B20初始化
{
unsigned char staues;
DQ=1;
delay(8);
DQ=0;
delay15us(32);
DQ=1;
delay15us(4);
staues=DQ;
delay15us(32);
// while(1)
// {
// if( staues==1)
// {
// P0=0x3f;
// P2=0x00;
// }
// else
// {
// P0=0x06;
// P2=0x00;
// }
//
// }
DQ=1;
delay15us(16);
return staues;
}
unsigned char Red_Byte_1()//读一个字节
{
unsigned char byte = 0;
unsigned char j=0;
// DQ=1;
// delay(1);
for(j=8; j>0; j–)
{
DQ = 0;
byte >>= 1; //先将总线拉低1us
DQ = 1; //然后释放总线 //延时6us等待数据稳定
// delay15us(3);
if(DQ)
byte |= 0x80;
delay15us(20);
}
return byte;
}
unsigned Wri_Byte_1(unsigned int dat)//写入一个字节
{
unsigned char i;
for(i=8;i>0;i–)
{
DQ=0;
DQ=dat&0x01;
delay15us(20);
DQ=1;
dat>>=1;
}
delay15us(20);
// while(1)
// {
// if(dat==0)
// {
// P0=0x3f;
// P2=0x00;
// }
// }
return dat;
}
void Red_Temp_ture()//读取温度值
{
// dsreset();
// delay15us(6);
if(DS18B20_Init()==1)
DS18B20_IS_OK=0;
else
{
// delay15us(12);
DS18B20_Init();
Wri_Byte_1(0xCC);//跳过序列号
Wri_Byte_1(0x44);
// delay15us(12);
DS18B20_Init();
// delay15us(3000);
Wri_Byte_1(0xCC);
Wri_Byte_1(0xBE);
Temp_Value[0]=Red_Byte_1();
Temp_Value[1]=Red_Byte_1();
Alarm_Temp[0]=Red_Byte_1();
Alarm_Temp[1]=Red_Byte_1();
DS18B20_IS_OK=1;
}
// DS18B20_IS_OK=1;
}
void Set_Alare_Temp_V()//设置温度报警值
{
DS18B20_Init();
Wri_Byte_1(0xCC);
Wri_Byte_1(0x4E);
Wri_Byte_1(Alarm_Temp[0]);
Wri_Byte_1(Alarm_Temp[1]);
Wri_Byte_1(0x7F);
DS18B20_Init();
Wri_Byte_1(0xCC);
Wri_Byte_1(0x48);
}
void Display_Temp()//数码管上显示温度
{
unsigned char i;
unsigned char t=150;
unsigned char ng=0,np=0;
char Singed_Currtet_Temp;//如果为负数则取反加一,并设置负号标识及负号显示位置
if((Temp_Value[1]&0xF8)==0xF8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
np=0xFD;
}
Display[0]=df_Table[Temp_Value[0]&0x0F];
Current=((Temp_Value[0]&0x0F)>>4)|((Temp_Value[1]&0xF0)<<4);
if(Singed_Currtet_Temp==ng)
{
Singed_Currtet_Temp=-Current;
}
else
{
Singed_Currtet_Temp=Current;
}
Alarm_H=Singed_Currtet_Temp>=Alarm_Temp[0]?1:0;
Alarm_L=Singed_Currtet_Temp<=Alarm_Temp[1]?1:0;
Display[3]=Current/100;
Display[2]=Current%100/10;
Display[1]=Current%10;
// Display[3]=0;
// Display[2]=1;
// Display[1]=0;
if(0==Display[3])
{
Display[3]=10;
np=0xFB;
if(0==Display[2])
{
Display[2]=10;
np=0xF7;
}
}
for(i=0;i<30;i++)
{
P0=0x39;
P2=0x7F;
delay(t);
P2=0xFF;
P0=0x63;
P2=0xBF;
delay(t);
P2=0xFF;
P0=Duan_Ma[Display[0]];
P2=0xDF;
delay(t);
P2=0xFF;
P0=(Duan_Ma[Display[1]])|0x80;
P2=0xEF;
delay(t);
P2=0xFF;
P0=Duan_Ma[Display[2]];
P2=0xF7;
delay(t);
P2=0xFF;
P0=Duan_Ma[Display[3]];
P2=0xFB;
delay(t);
P2=0xFF;
if(ng)
{
P0=0x40;
P2=np;
delay(t);
P2=0xFF;
}
}
}
void Timer0_Init ()interrupt 1
{
TH0=(60536)/256;
TL0=(60536)%256;
beep=!beep;
if(++Timer0_cout==400)
{
Timer0_cout=0;
if(Alarm_H)
{
LED_H=~LED_H;
}
else
{
LED_H=1;
}
if(Alarm_L)
{
LED_L=~LED_L;
}
else
{
LED_L=1;
}
}
}
void main()
{
IE=0x82;
TMOD=0x01;
TH0=(60536)/256;
TL0=(60536)%256;
TR0=0;
LED_H=1;
LED_L=1;
Set_Alare_Temp_V();
Red_Temp_ture();
// DS18B20_Init();
delay(50000);
delay(50000);
while(1)
{
Red_Temp_ture();
if(DS18B20_IS_OK)
{
if(Alarm_H==1||Alarm_L==1)
{
TR0=1;
}
else
{
TR0=0;
}
Display_Temp();
}
else
{
P0=P2=0x00;
}
}
}
,有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间,
51hei团团 发表于 2021-1-8 18:47
有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间
只要注意延时就可以了吗?,
51hei团团 发表于 2021-1-8 18:47
有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间
之前用51芯片仿真是没有问题的,但是用15F2K60S2之后就不行了
,数字温度传感器DS18B20最好的资料:http://www.073107.com/bbs/dpj-200465-1.html
后面这个是DS18B20代码贴子 http://www.073107.com/bbs/dpj-200968-1.html,
111gjk 发表于 2021-1-8 18:52
之前用51芯片仿真是没有问题的,但是用15F2K60S2之后就不行了
此51程序移植到STC15F2K60S2失败的主要有两个原因:
1.原来的延时函数要重新调整参数。由于具体函数体写法和采用数据类型不同,CPU处理用时也不同,无法给你一个固定的比例关系套用。可以参考STC官方示例。
2.由于1T单片机速度非常快,对端口写操作后要等待至少2个时钟达到稳定后才能读准,否则容易出错。1个 _nop_() 用时3个时钟。
,51hei搜索”1t DS18B20″可以找到程序:
http://www.073107.com/bbs/dpj-114378-1.html
他这个芯片的延迟和你这个一样的