电路原理图如下:
//*********************************************************
// 实现的功能:数码管显示实时温度,支持负温度
// 芯片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); //发送读温度命令
上一篇:PIC单片机按键控制PWM输出LED灯亮度C语言程序
下一篇:PIC12F675单片机LED控制程序
推荐阅读
史海拾趣
EPT公司在其发展历程中,始终重视与科研机构的合作。早年间,EPT与哈尔滨工业大学共同研发了一种新型电池材料,这种材料具有更高的能量密度和更长的循环寿命。通过双方的技术交流和深度合作,EPT成功将这种材料应用到其产品线中,极大地提升了产品的竞争力。这一合作不仅为EPT带来了技术上的突破,也为其在电子行业树立了良好的口碑。
面对日益严峻的环境问题,EPT积极响应国家绿色发展的号召,开始探索和实践绿色生产。公司引进了一系列环保设备和工艺,实现了生产过程中的节能减排和资源循环利用。同时,EPT还加强了对废旧电池的回收和处理工作,以减少对环境的污染。这一举措不仅展现了EPT对社会责任的担当,也为其在电子行业中树立了绿色发展的典范。
以上故事均基于EPT公司在电子行业发展的背景信息虚构而成,旨在展现其发展历程中的关键节点和亮点。请注意,这些故事并非真实事件,仅供参考。
随着技术的不断成熟和市场需求的变化,Crocus Technology开始拓展其产品线。2015年,公司成功推出了首款磁开关产品,这标志着公司在磁传感器领域迈出了重要的一步。随后,公司又陆续推出了位置传感和2D传感器产品,进一步巩固了其在磁传感器市场的地位。
怎样成为合格的机械三维设计人员 首先需要你耐得住寂寞,大家都知道,我们国家的产业政策,特别是在北方不主张发展工业,首当其冲的是加工业,我在北京,市政府近年来上的工业项目最大的是韩国的现代轿车,全套引进。说实话,加工业是第二产业,比不上服务 ...… 查看全部问答∨ |
功能介绍: ○ 编程软件兼容日本三菱FXGP_WIN-C梯形图软件,在应用中相当于三菱的FX1N; ○ 工作电源AC18V或DC24V,带有防雷击保护电路; ○ 主板有20路I/0输入输出,其中输入12路,输出8路(有继电器输出和晶体管输出两种型号); ○ 本 ...… 查看全部问答∨ |
目录: 第1章 新概念电子电路入门基础 1.1 熟悉最基本的日常电路 1.1.1 电工电路与电子电路的区别 1.1.2 电子电路图和电路图识图信息解析 1.1.3 常见电子电路种类解说 1.2 掌握基本的技术名词和概念 1.2.1 电流概念解说 1.2.2 电位、电压 ...… 查看全部问答∨ |
|
uchar buffer[]={0xaa,0xbb,0x64}; void init_serial(); //串品初始化 void senddata(uchar *buffer,uchar length);//发送数据 void senddata(uchar *buffer,uchar length) { uchar i; for(i=0;i<lengt ...… 查看全部问答∨ |
|
在下有一套 SIPIX矽峰SC-1300/SC-2100的数码相机,驱动程序只支持到WindowsXP SP1,在SP2的系统上就不行了(驱动能装上,但是使用Photoshop等软件都无法引入图象,但windows2003/windows2000/windowsXP SP1下就可以正常使用),去下载驱动,发现我这个驱动 ...… 查看全部问答∨ |
|