历史上的今天
今天是:2025年06月20日(星期五)
2018年06月20日 | 温度传感器18B20(串口显示)
2018-06-20 来源:eefocus
/*温度传感器18B20--串口显示温度*/
#include
#include
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef char int8;
typedef int int16;
sbit DQ=P3^2; //温度输入口
void nops()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(uint16 n)
{
while(n--);
}
void delay_ms(uint16 n)
{
uint8 m=120;
while (n--)
while (m--);
}
void DS18b20_reset(void)
{
bit flag=1;
while (flag)
{
DQ = 1;
delay(1); //7.5us
DQ = 0;
delay(50); //139.8us
DQ = 1;
delay(6); // 21us
flag = DQ;
}
delay(45); //延时500us
DQ=1;
}
/*
* 18B20写1个字节函数
* 向1-WIRE总线上写一个字节
*/
void write_byte(uint8 val)
{
uint8 i;
for (i=0; i<8; i++)
{
DQ = 1;
_nop_(); //两次传送间隔大于1us
DQ = 0;
nops(); //4us
DQ = val & 0x01; //最低位移出
delay(6); //66us (30US)
val >>= 1; //右移一位
}
DQ = 1;
delay(1);
}
/*
* 18B20读1个字节函数
* 从1-WIRE总线上读取一个字节
*/
uint8 read_byte(void)
{
uint8 i, value=0;
for (i=0; i<8; i++)
{
value >>= 1;
DQ=1;
_nop_();
DQ = 0;
nops(); //4us
DQ = 1;
nops(); //4us
if (DQ)
value|=0x80;
delay(6); //66us
}
DQ=1;
return value;
}
/*
* 启动温度转换
*/
void start_temp_sensor(void)
{
DS18b20_reset();
write_byte(0xCC); // 发Skip ROM命令
write_byte(0x44);// 发转换命令
}
/*
* 读出温度
*/
int16 read_temp(void)
{
uint8 temp_data[2]; // 读出温度暂放
int16 temp;
DS18b20_reset(); // 复位
write_byte(0xCC); // 发Skip ROM命令
write_byte(0xBE); // 发读命令
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
temp = temp_data[1];
temp <<= 8;
temp |= temp_data[0];
temp >>= 4; //注意是移动四位
return temp;
}
/**
* UART初始化
* 波特率:9600
*/
void uart_init(void)
{
TMOD = 0x21; // 定时器1工作在方式2(自动重装)
SCON = 0x50; // 10位uart,允许串行接受
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
/**
* UART发送一字节
*/
void UART_Send_Byte(uint8 dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
/**
* 将数据转换成ASC码并通过UART发送出去
*/
void UART_Send_Dat(uint8 dat) //100度以下温度可用
{
UART_Send_Byte(dat/10%10 + '0');
UART_Send_Byte(dat%10 + '0');
}
main()
{
int16 ans;
uart_init();
start_temp_sensor();
while (1)
{
delay_ms (1000); // 延时1秒
ans=read_temp();
if (ans < 0)
{
UART_Send_Byte('-');
ans = -ans;
}
UART_Send_Dat(ans);
UART_Send_Byte('\r');
UART_Send_Byte('\n');
}
}
史海拾趣
|
使用PPPD控制GPRS模块拨号上网后,直接PING外网IP可以PING通,便是PING域名就不通,请问应怎样解决? 感觉应该是DNS的问题,使用PPPD能自动获取DNS吗,或怎样设置?… 查看全部问答> |
|
编译WinCe内核,platform builder5死机是什么问题 请问一下,在我的台式机上能编译通过的WinCe内核,却把他转移到我的笔记本上的platform builder5编译却死机了 我笔记本上的信息: 系统:vista CPU:core2 T5670 请问这是什么问题?… 查看全部问答> |
|
系统:CE5,开发工具:EVC4 用DirectShow开发MP3播放器,功能已经实现。但明天测试发现一个问题,先描述一下: 播放MP3,触笔点击播放进度条调整播放进度,然后正常播放。此时一切正常! 但是当这首歌播放完毕,自动转到下一首时,出现异常:不是 ...… 查看全部问答> |
|
一位老电子工程师十年的职场感悟 当电子工程师也是十余年了,不算有出息,环顾四周,也没有看见几个有出息的!回顾工程师生涯,感慨万千,愿意讲几句掏心窝子的话,也算给咱们师弟师妹们提个醒,希望他们比咱们强! [1]好好规划自己的路,不 ...… 查看全部问答> |
|
深圳扬创科技的Android工业平板电脑,是基于Cortex-A8架构的,支持以太网,串口,GPIO口等,方便用户直接进行通信控制。GPIO操作函数如下: 8路输出口: (1)IO全部输出为高按钮:控制8路输出全部为高电平。 (2)IO全部输出为低按钮:控制8 ...… 查看全部问答> |
|
晒WEBENCH设计的过程+设计一款家用5W冷光LED照明灯电源 一 方案构想 现在LED照明非常火热,号称绿色能源,比节能灯寿命长,但是价格还是比较高。想着设计一款冷光LED灯,5W,可以做洗墙灯,装饰灯,台灯照明,卧室照明等应用。 二、设计过程 ...… 查看全部问答> |




