/********************************************************
* 文件名 :main.c
* 描述 :stc15系列采集ds18b20温度数据,并从串口输出,采用的是11.0592M晶振,用P2口
* 实验平台:IAP15w4k58S4
* 库版本 :
* 连接方式: 见连接图
* 注意 : 芯片上电后所有与PWM相关的IO口均为高阻态
需将这些口设置为准双向口或强推挽模式方可正常使用
相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
另外还有P1.0/P1.4两个口在上电时为强推挽输出,程序
初始化时也需将这两个口设置为弱上拉准双向口模式
* 作者 :12345678
**********************************************************************************/
#include "config.h"
#include "delay.h"
#include "uart.h"
#include "18B20.h"
/************* 功能说明 **************
******************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
u16 a=0;//测试用
/************* 本地函数声明 **************/
/************* 外部函数和变量声明 *****************/
/******************** IO配置函数 **************************/
void GPIO_config(void)
{
P5M0 = 0; //设置准双向口
P5M1 = 0;
P2M0 = 0; //P2口全部设置为准双向
P2M1 = 0;
}
/******************** 主函数 **************************/
void main(void)
{
u8 i = 0;
GPIO_config();
UartInit();
while(1)
{
SendString("4路18B20温度 串口1测试!\r\n");
for(i=0;i<4;i++)
{
// if(Ds18b20Init(i)){
a=Ds18b20ReadTemp(i);
SendString("第 ");
SendData(i+'1');
SendString(" 路温度 : ");
if(a/10000 == 1)
{ //如果万位为1,则表示温度为负
SendData('-'); //输出负号
}
SendData(a%10000/1000+'0'); //十位
SendData(a%1000/100+'0'); //个位
SendData('.'); //小数点
SendData(a%100/10+'0'); //小数点后第一位
SendData(a%10+'0'); //小数点后第二位
SendString("℃\r\n");
// }else{ //想要不显示直接去除else这部分
// SendString("第 ");
// SendData(i+'1');
// SendString("路温度 初始化失败请检测\r\n");
// }
}
P55 = 0;
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
// P55 = 1;
// delay_ms(100);
// P55 = 0;
// delay_ms(100);
P55 = 1;
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
}
}
/**************************18B20*******************************/
#include "18B20.h"
#include<intrins.h>
#include "delay.h"
#define DS P2
#define set1(x) (0x01<<(x))
bit Ds18b20Init(u8 m)
{
bit flag=1;
DS = 0;
Delay600us();
DS|=set1(m);
Delay100us();
flag=DS;
Delay600us();
DS|=set1(m);
return (~flag);
}
void Ds18b20WriteByte(u8 dat,m)
{
u8 j;
bit testb ;
for(j=0; j<8; j++)
{
testb = dat&0x01;//取最低位
dat=dat>>1;
if(testb) //置高 1
{
DS =0;
Delay1us();
Delay1us();
DS|=set1(m);
Delay100us(); //>60us
}
else
{
DS =0;
Delay100us(); //大于 60us 小于 120us
DS|=set1(m);
Delay1us();
Delay1us();
}
}
}
u8 Ds18b20ReadByte(u8 m)
{
u8 byte, bi;
u8 j;
for(j=8; j>0; j--)
{
DS =0X00;
Delay1us();
DS|=set1(m);
Delay6us();
bi = DS;
byte = (byte >> 1) | (bi << 7);
Delay48us();
}
return byte;
}
void Ds18b20ChangTemp(u8 m)
{
Ds18b20Init(m);
Delay1ms();
Ds18b20WriteByte(0xcc,m);
Ds18b20WriteByte(0x44,m);
Delay1ms();
}
void Ds18b20ReadTempCom(u8 m)
{
Ds18b20Init(m);
Delay1ms();
Ds18b20WriteByte(0xcc,m);
Ds18b20WriteByte(0xbe,m);
}
int Ds18b20ReadTemp(u8 m)
{
int temp = 0;
u8 tmh, tml;
Ds18b20ChangTemp(m);
Ds18b20ReadTempCom(m);
tml = Ds18b20ReadByte(m);
tmh = Ds18b20ReadByte(m);
if(tmh>0x7f)
{
tml=~tml; //补码转换,取反加一
tmh=~tmh+1;
temp=100;
}
temp=temp+tmh*16+tml/16;
temp=temp*100;
temp=temp+((tml&0x0f)*10/16)*10;
temp=temp+(tml&0x0f)*100/16%10;
return (u16)(temp);
}
|