历史上的今天
今天是:2025年01月31日(星期五)
2019年01月31日 | PIC16F877A DS18B20数字温度计实验
2019-01-31 来源:eefocus
main.c
#include
#include
#include "def.h"
#include "ds18b20.h"
__CONFIG(0xFF32);
void Delay_ms(u16 xms)
{
int i,j;
for(i=0;i { for(j=0;j<71;j++) ; } } void uart_init(void) { TXSTA=0x24; //开启发射使能位、高波特率,TRMT初始值可0可1 RCSTA=0x80; SPBRG=0x19; //4M晶振,波特率9600,则SPBRG初值为25 } //printf函数重定向 void putch(u8 c) { TXREG = c; while(TRMT==0); } short temperature; void main() { uart_init(); Delay_ms(5); printf("ds18b20 demo\n"); while(1) { if(Init_18B20()==0) { printf("init ok1!\n"); Skip(); Convert(); Delay_ms(750); if(Init_18B20()==0) { printf("init ok2!\n"); Skip(); Read_SP(); RomCode[0]=Read_18B20(); RomCode[1]=Read_18B20(); temperature=ReadTemp(RomCode); temperature=CalcTemp(temperature); printf("code=%02x%02x\t->\t%d.%d℃\n",RomCode[0],RomCode[1],temperature/10,temperature%10); } } Delay_ms(3000); } } ds18b20.h #include #include "def.h" #ifndef __ds1820_h #define __ds1820_h extern u8 RomCode[2]; #define DQ1 RC1=1 #define DQ0 RC1=0 #define DQ_in TRISC1=1 #define DQ_out TRISC1=0 #define DQ_val RC1 #define _DINT() di() #define _EINT() ei() #define _NOP() asm("nop") u8 Init_18B20(void); short CalcTemp(short a); void Skip(void); void Convert(void); void Read_SP(void); u8 Read_18B20(void); short ReadTemp(u8 *r); #endif ds18b20.c /********************************* PIC16F877A@4MHz *********************************/ #include "ds18b20.h" #include "def.h" u8 RomCode[2]; #define DelayNus _delay u8 Init_18B20(void) { u8 Error; DQ_out; _DINT(); DQ0; DelayNus(500); //延迟至少480us DQ1; DelayNus(55); //释放DQ后延时120us(60~240)后再读数 DQ_in; _NOP(); if(DQ_val) Error = 1; //初始化失败 else Error = 0; //初始化成功 DQ_out; DQ1; _EINT(); DelayNus(400); return Error; } void Write_18B20(u8 wdata) { u8 i; for(i = 0; i < 8;i++) { _DINT(); DQ0; //DelayNus(6); //延时2us _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); if(wdata & 0X01) DQ1; else DQ0; wdata >>= 1; DelayNus(70); //延时91us DQ1; _EINT(); _NOP(); } } u8 Read_18B20(void) { u8 i; u8 temp = 0; for(i = 0;i < 8;i++) { temp >>= 1; _DINT(); DQ0; _NOP(); _NOP(); _NOP(); _NOP(); DQ1; //DelayNus(8); //延时9us DQ_in; //DelayNus(25); //延时45us if(DQ_val) temp |= 0x80; DQ_out; DQ1; DelayNus(70); //延时10us _EINT(); _NOP(); } return temp; } void Skip(void) { Write_18B20(0xcc); } void Convert(void) { Write_18B20(0x44); } void Read_SP(void) { Write_18B20(0xbe); } short ReadTemp(u8 *r) { u8 temp_low; short temp; temp_low = r[0]; //读低位 temp = r[1]; //读高位 temp = (temp<<8) | temp_low; return temp; } const u8 dottab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}; //优化读数算法 short CalcTemp(short a) { u8 b; if(a<0) { a=~a; a++; b=a; a>>=4; a*=-10; a-=dottab[b&0x0f]; } else { b=a; a>>=4; a*=10; a+=dottab[b&0x0f]; } return a; } def.h #ifndef __DEF__H_ #define __DEF__H_ #define u8 unsigned char #define u16 unsigned int #endif 
史海拾趣
|
提出了一种利用触须来识别物体表面轮廓的新方法.传感器采用了二维PSD作为敏感元件,实时地测量由于与物体接触在触须根部所产生的微小位移量.介绍了机器人触须传感器具体的结构及工作原理.由实验数据可知,触须根部位移量的大小与接触的距离成反比,且 ...… 查看全部问答> |
|
SES5VD923-2B资料 TVS管的选择 替换型号;PVS05A-0402 SES5VD923-2B WE05D9-B Feature 100 Watts peak pulse power (tp = 8/20μs) Transient protection for data lines to IEC 61000-4-2 (ESD) ±25kV (air), ...… 查看全部问答> |
|
下面是我编写关于93C46的读写代码,P0引脚连接的是8个LED,目的是通过读写93C46实现LED闪烁的效果。 现在程序运行时,DO引脚始终是高电平,LED常亮,检查好几遍时序设置,也没有发现问题,请各位高手帮我分析一下到底问题出现在哪了,谢谢! #inc ...… 查看全部问答> |
|
为实现低成本小体积的模拟式锁相放大器,来采集TDS中的差分探头产生的THz信号。通过核心器件AD630(平衡调制解调器)做锁相放大,以提取被噪声淹没的微弱THz信号,要求其动态范围宽,达到100db以上,能检测300pA以上的信号。最终采集的信噪比需满足 ...… 查看全部问答> |
|
请问32KB+256B Flash Memory,这个256B干嘛用的? MSP430 Datasheet中一般出现这句话:32KB + 256B Flash Memory 512B RAM 问1,这个256B是什么意思? 问2,假如我的程序大小为12KB,那么剩下的20KB Flash Memory是否可以当做EEPROM来使用?… 查看全部问答> |
|
51单片机实现红外编码检测 通过51 单片机及外围电路实现对接受信号的处理(通过外部中断和计数器)获得信号的01编码,设备显示。 有关红外传感的一些资料 红外传感基础知识:v 红外发光管:红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlA ...… 查看全部问答> |
|
给beaglebone扩展的群创LCD,是AT070TN92,电路设计是这样的: 但是会出现比较严重的色差现象: 上图的颜色过渡明显有问题,换成整图的话,这种问题会更明显!! 我尝试去掉此电平转换芯片,显示效果倒是正常了: 但是又有了新的 ...… 查看全部问答> |




