网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月22日漏签0天
单片机吧 关注:211,659贴子:1,046,058
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 10回复贴,共1页
<<返回单片机吧
>0< 加载中...

用STC12C5A60S2和DS18b20做温度传感器,程序有问题,请高手看看

  • 只看楼主
  • 收藏

  • 回复
  • 茶几博士
  • 中士
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
温度值通过串口助手得到,但是串口助手上一直显示FE或者FF,也不会随温度变化,请高手指导下
#include <STC12C5A60S2.H> //单片机头文件
#include <intrins.h> //51基本运算(包括_nop_空函数)
sbit DQ=P0^0;
unsigned char tem[5]={0};
void delay_us(unsigned char times)
{
unsigned char i=times;
for(;i>0;i--) _nop_();
}
void delay1ms(unsigned int t) //误差 -0.018084490741us
{
unsigned char a,b;
unsigned int j;
for(j=t;j>0;j--)
for(b=21;b>0;b--)
for(a=130;a>0;a--);
}
void Init_serial()
{
SCON=0x50;//串口1工作方式1
AUXR|=0x40; //Timer1 speed 12 of MCU
AUXR&=0xFE;//use T1 as baud sender
TMOD=0x20;
TL1 = 0xF7;//设定定时初值
TH1 = 0xF7;//设定定时器重装值
//ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
//ES = 1; //允许串行中断
//EADC=1;
//EA=1; //开总中断
IE=0xA0;
}
void SendData(unsigned char dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}
void Send_String(unsigned char *p)
{
unsigned char i;
for(i=0;i<5;i++)
{
SendData(*p++);
}
}
//DS18B20复位
void DS18B20_Reset()
{
bit presence=1;
while(presence)
{
delay_us(2);
DQ=0;
delay_us(480);
DQ=1; //DQ=1表示释放总线
delay_us(50);
if(!DQ) presence=0;
delay_us(430);
}
}
//写DS18B20数据线从高到低写时序开始
void DS18B20_Write(unsigned char wDate)
{
unsigned int i;
for(i=0;i<8;i++)
{
DQ=0;
delay_us(1);
DQ=wDate&0x01; //将数据的最低位传到数据总线DQ
delay_us(60);
DQ=1; //释放总线
delay_us(1);
wDate=wDate>>1;
}
}
//读ds18b20
unsigned char DS18B20_Read()
{
unsigned char j,Dat=0;
for(j=0;j<8;j++)
{
Dat>>=1;
DQ=0;
delay_us(1);
DQ=1;
delay_us(6);
if(DQ) Dat|=0x80;
delay_us(60);
}
return (Dat);
}
void Get_Temp()
{
/*12位转化后得到的12位数据存储在18B20的两个8比特的RAM中,二进制中的前面5位是符
号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625 即可得到实际温度;
如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。 */
unsigned char i,temp_date;
unsigned int wendu;
unsigned char temp[1]={0};
float tt;
DQ=1;
DS18B20_Reset();
DS18B20_Write(0xCC); //忽略ds18b20的ROM检查
DS18B20_Write(0x44); //开始温度转换
//delay_us(500);
DS18B20_Reset(); //再复位依次,ds18b20每次操作必须先复位下
DS18B20_Write(0xCC); //发送读数据指令
DS18B20_Write(0xBE); //发送读数据指令
for(i=0;i<2;i++) temp[i]=DS18B20_Read(); //开始读取数据
DS18B20_Reset(); //结束读取操作
temp_date=temp[1];
temp_date&=0xf8;
if(temp_date==0xf8) //判断高5位是否为1 即温度是正是负
{
if(temp[0]==0)
{
temp[0]=~temp[0]+1;
temp[1]=~temp[1]+1;
}
else
{
temp[0]=~temp[0]+1;
temp[1]=~temp[1];
}
}
wendu=temp[1];
wendu<<=8;
wendu=wendu|temp[0];
tt=wendu*0.0625;
wendu=tt*10; //温度值放大十倍,因为我要测的温度为0-99度之间,如果要测超过99度可做适当改动
tem[0]=wendu/100+*0*; //取温度的十位
tem[1]=wendu%100/10+*0*; //去个位
tem[2]=*.*;
tem[3]=wendu%10+*0*;
tem[4]=*\n*;
Send_String(tem);
}
void main()
{
Init_serial();
while(1)
{
Get_Temp();
delay1ms(1000);
}
}


  • 茶几博士
  • 中士
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
是串口程序的问题还是温度传感器程序的问题啊?高手呢~~求指导啊


2025-05-22 20:48:44
广告
  • 675121727
  • 上校
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
自己写的?从头看下来可能读温度那里有问题


  • yhzyhzyhzapple
  • 中校
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
是不是从89c52移植的程序?12c是1T单片机,速度更快,因此总线时序就不对了,要改延时等


  • 小丑ln爱美丽
  • 新兵
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我就是来看看


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 10回复贴,共1页
<<返回单片机吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示