历史上的今天
今天是:2024年10月29日(星期二)
2019年10月29日 | PIC16F877单片机DS18B20数码管温度计仿真程序 可显示负温度
2019-10-29 来源:51hei
电路原理图如下:
//*********************************************************
// 实现的功能:数码管显示实时温度,支持负温度
// 芯片PIC16F877
// XT:4MHZ
//*********************************************************
#include #define LVP 0x3f39 // 晶振:XT;代码:没有代码保护;上电延时定时器关闭; // 低电压复位禁止;看门狗关闭 ;低电压编程禁止 __CONFIG (XT & UNPROTECT & PWRTDIS & BORDIS & WDTDIS & LVP); #define uch unsigned char //给unsigned char起别名 uch #define DQ RA2 //定义18B20数据端口 #define DQ_DIR TRISA2 //定义18B20D口方向寄存器 #define DQ_HIGH() DQ_DIR =1 //设置数据口为输入 #define DQ_LOW() DQ_DIR = 0;DQ = 0 //设置数据口为输出 const unsigned char ledcode[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; //不带小数点的共阴极数码管0123456789段码,正负符号位 const unsigned char ledcode1[12]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00,0x40}; //带小数点的共阴极数码管0123456789段码 ,正负符号位 void init_port(void); void delay(char x,char y); void delay_1ms(void); void delay_ms(unsigned int time); void interrupt dealtime(); void tmint(void); void timetoseg(uch fh_temp,uch bai_temp,uch shi_temp,uch ge_temp,uch sf_temp,uch bf_temp,uch qf_temp,uch wf_temp); void binary_temp(uch TL , signed char TH); void reset(void); void write_byte(uch val); uch read_byte(void); void get_temp(void); unsigned char display_data[8]; unsigned char intcount=0; uch TLV=0 ; //采集到的温度高8位 uch THV=0; //采集到的温度低8位 union temp //定义一个联合体 { int T; uch TV[2]; }temp; signed char TZ=0; //转换后的温度值整数部分,有符号位 uch TX=0; //转换后的温度值小数部分 unsigned int wd; //转换后的温度值BCD码形式 unsigned char fh; //符号位 unsigned char bai; //整数百位 unsigned char shi; //整数十位 unsigned char ge; //整数个位 unsigned char shifen; //十分位 unsigned char baifen; //百分位 unsigned char qianfen; //千分位 unsigned char wanfen; //万分位 //********************************************************* // 主程序 //********************************************************* void main(void) { init_port(); tmint(); while(1) { get_temp(); timetoseg(fh,bai,shi,ge,shifen,baifen,qianfen,wanfen); } } //********************************************************* // 端口初始化 // PORTD作为数码管段驱动(高有效) // PORTE作为数码管位选择驱动(低有效) //********************************************************* void init_port(void) { RBPU=0; // PORTB=0xFF; TRISB=0xFF; PORTD=0x00; // TRISC=0x00; //C口控制LED指示灯,设置成输出 TRISD=0; //D口当作数码管段,设置成输出 ADCON1=0x07; //使A口,E口全为数字I/O口 TRISE=0x00; //E口当作数码管位选择控制脚,设置成输出 PORTE=0x00; } //********************************************************* // 延时程序 //********************************************************* void delay(char x,char y) { char z; do{ z=y; do{;}while(--z); }while(--x); } //其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。 //则是:14+(3*(Y-1)+7)*(X-1)。 //********************************************************* // 延迟程序 //********************************************************* void delay_1ms(void) { unsigned int n; for(n=0;n<50;n++) { NOP(); } } //********************************************************* void delay_ms(unsigned int time) { for(;time>0;time--) { delay_1ms(); } } //----------------------------------------------- //复位DS18B20函数 void reset(void) { uch presence=1; while(presence) { DQ_LOW() ; //主机拉至低电平 delay(2,90); //延时>480503us DQ_HIGH(); //释放总线等电阻拉高总线,并保持15~60us delay(2,8); //延时>60us if(DQ==1) presence=1; //没有接收到应答信号,继续复位 else presence=0; //接收到应答信号 delay(2,70); //延时>240us } } //----------------------------------------------- //写18b20写字节函数 void write_byte(uch val) { uch i; uch temp; for(i=8;i>0;i--) { temp=val&0x01; //最低位移出 DQ_LOW(); NOP(); NOP(); NOP(); NOP(); NOP(); //从高拉至低电平,产生写时间隙 if(temp==1) DQ_HIGH(); //如果写1,拉高电平 delay(2,7); //延时63us DQ_HIGH(); NOP(); NOP(); val=val>>1; //右移一位 } } //------------------------------------------------ //18b20读字节函数 uch read_byte(void) { uch i; uch value=0; //读出温度 static bit j; for(i=8;i>0;i--) { value>>=1; DQ_LOW(); //每次读时隙由主机发起,拉低总线至少1μs。 NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); //6us DQ_HIGH(); //读时隙开始后的15μs内释放总线,拉至高电平,准备采样总线。 NOP(); NOP(); NOP(); NOP(); NOP(); //5us j=DQ; //采样总线 if(j) value|=0x80; //把采样到的数据放入value delay(2,7); //所有读时隙至少60μs,这里大约63us } return(value); } //------------------------------------------------- //启动温度转换函数 void get_temp() { int i; DQ_HIGH(); reset(); //复位等待从机应答 write_byte(0XCC); //忽略ROM匹配 write_byte(0X44); //发送温度转化命令 for(i=10;i>0;i--) { delay(201,132); } reset(); //再次复位,等待从机应答 write_byte(0XCC); //忽略ROM匹配 write_byte(0XBE); //发送读温度命令
史海拾趣
|
有没有人做过高斯白噪声叠加一个正弦信号的仿真工程,这是细胞自动化高斯白噪声 module CellularAutomata#( parameter INIT_VEC = 32'b0100_1000_0001_0010_0100_1000_0001_0010, parameter RULE_VEC = 32'b0000_1100_0100_0111_0000_1100_0000_0110, N = 32 )(   ...… 查看全部问答> |
|
在任何电力电子转换器中,热设计都是一项重要的考虑因素。热设计经优化后,工程师能够将 GaN 用于各种功率级别、拓扑和应用中。此应用手册论述了 TI LMG341XRxxx GaN 功率级系列非常重要的权衡标准和注意事项,包括 PCB 布局、热界面、散热器选择和 ...… 查看全部问答> |
|
请问JY134G9是哪家的液晶屏,这是我下载的资料中出现的一个型号,网上查不到是哪家的 请问JY134G9是哪家的液晶屏,这是我下载的资料中出现的一个型号,网上查不到是哪家的,所以问问大家。 … 查看全部问答> |
|
## 前 言 本文主要介绍基于全志科技A40i(ARM Cortex-A7)处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616AD芯片,亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。 > 备注: > > (1)创龙科技TL7606I ...… 查看全部问答> |
|
浙江南都电源动力股份有限公司(股票代码:300068)面向智慧储能、数据中心、工业后备和绿色出行四大应用领域,提供以锂离子电池和铅电池为核心的产品、系统集成及服务,同时打造了“锂电池循环产业链”和“铅电池循环产业链” ...… 查看全部问答> |
|
浙江南都电源动力股份有限公司(股票代码:300068)面向智慧储能、数据中心、工业后备和绿色出行四大应用领域,提供以锂离子电池和铅电池为核心的产品、系统集成及服务,同时打造了“锂电池循环产业链”和“铅电池循环产业链” ...… 查看全部问答> |
|
爱好者Kian Ryan组装了一台很可能是最小的CP/M微型计算机--建立在Pimoroni Tiny 2040和Adafruit microSD读卡器之上。 “我一直在使用RC 2014作为CP/M开发机器,特别是在开发跨平台的Rogue类游戏时。我喜欢它,” ...… 查看全部问答> |




