首页
AI
爬虫
嵌入式开发
C语言入门视频教程
模电数电
51/52单片机
STM32
Linux嵌入式
文学修养
生活哲理
感动和励志文字
随手乱写
IT计算机
QT学习之路
网站搭建
微信开发
数据库设计
Java
计算机知识
Web程序设计
编程语言
NCRE全国计算机等级考试
关于我们
广告招租
表白网页制作
搜索
登录
搜索
RainFly
明确一个目标,这很重要!
累计撰写
196
篇文章
累计收到
4775
条评论
首页
栏目
首页
AI
爬虫
嵌入式开发
C语言入门视频教程
模电数电
51/52单片机
STM32
Linux嵌入式
文学修养
生活哲理
感动和励志文字
随手乱写
IT计算机
QT学习之路
网站搭建
微信开发
数据库设计
Java
计算机知识
Web程序设计
编程语言
NCRE全国计算机等级考试
关于我们
广告招租
表白网页制作
包含标签 【实践】 的文章
2015-3-7
测温模块原理图及原程序
这款制作容易能显示正负值的USB口供电单片机+DS18B20测温模块,只使用了6只元件:一片STC12C4052单片机、一个4位一体共阳数码管,一只DS18B20数字温度传感器、一个USB 插口、一个10uf 贴片复位电容、一个10k 的贴片复位电阻。单片机驱动数码管的端口设置成推挽工作方式,这样使用整个显示电路比较简单,数码管段驱动端省去了限流电阻,数码管亮度显示通过程序控制通断时间实现。由于电路比较简单,这里直接给出PCB 图,制作PCB 板时,我使用的是雕刻机雕刻,雕刻好后再用雕刻机钻孔,之后手工去除多余的敷铜。设计温度测量范围是:-9.9~99.9℃,下面是制作过程,文后附有源程序,源程序适合于STC1T 单片机。下图是制作好的实物工作照片及制作过程照片。 附上源程序: //使用单片机内部RC振荡器 #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sfr P1M0 = 0x91; sfr P1M1 = 0x92; sfr P3M0 = 0xB1; sfr P3M1 = 0xB2; #define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值 sbit temp=P1^7; sbit LED0=P3^0; //C sbit LED1=P1^4; // 小数点后一位 sbit LED2=P1^3; //个位 sbit LED3=P1^0; // 十位 sbit A=P1^1; sbit B_B=P1^5; sbit C=P3^2; sbit D=P3^4; sbit E=P3^5; sbit F=P1^2; sbit G=P3^1; sbit H=P3^3; //小数点 uchar temp_low,zf,mz; int temp_high; int final_temp; void dm(mz); void delay(uint x) //(x+1)*6微 { while(x--); } void delay_long(uint x) { uint i; while(x--) { for(i=0;i<125;i++); } } void init_ds18b20()//初始化 { temp=1;//复位 delay(6);//稍作延时 temp=0; delay(145);//延时大于480us(520us) temp=1; delay(14);//这个时间不能太长,否则就过了检测信号的时间了 } void read_signal()//读取应答脉冲 { while(temp); while(~temp)//检测到应答脉冲 { delay(7); break; } } bit readbit_ds18b20() { bit b; temp=1; delay(6);//稍作延时 temp=0; delay(2);//保持低最少1us(4us) temp=1; delay(4);//延时15us以后输出数据有效(23us) b=temp; delay(20);//读时间间隙不少于60us(71us) return(b); } void writebyte_ds18b20(uchar b)//写0写1一起完成 { int i,j; uchar btemp; temp=1; for(i=0;i<8;i++) { j=0; btemp=b&0x01; b>>=1; if(btemp==0) { temp=0; delay(18);//保持拉低在60us以上(71us) temp=1; } else { temp=0; j++;//15us 之内拉高 temp=1; delay(18);//整个写时序时间在60us以上(71us)} } } void temp_convert() { init_ds18b20();//初始化read_signal();//读取应答脉冲 delay_long(4); writebyte_ds18b20(0xcc);//跳过验证序列号命令,若单线上有多个ds18b20,则不可用这个命令writebyte_ds18b20(0x44);//启动温度转换命令} char readbyte_ds18b20() { uint i; uchar a,b; b=0; for(i=0;i<8;i++) { a=readbit_ds18b20(); b=(a<<i)|b; } return(b); } uint read_ds18b20() { int y; float yy; init_ds18b20();//初始化read_signal();//读取应答脉冲 delay_long(4); writebyte_ds18b20(0xcc);//跳过验证序列号命令writebyte_ds18b20(0xbbe);//读取内部ROM 的数据temp_low=readbyte_ds18b20();//读数据时低位在前,高位在后temp_high=readbyte_ds18b20(); y=temp_high; y<<=8; y=y|temp_low;//整合为一个int型 yy=y*0.0625;//12位精度为0.0625 y=yy*10+0.5; return(y); } void display(uint x) { uchar sw,gw,xs; sw=x/100; gw=x%100/10; //个位 xs=x%10; //小数 if(zf==1) { sw=11; } else { if(sw==0) { sw=12; } } dm(sw); LED3=1; delay(30); LED3=0; delay(10); dm(gw); LED2=1; delay(30); LED2=0; delay(10); dm(13); LED2=1; delay(10); LED2=0; delay(10); dm(xs); LED1=1; delay(30); LED1=0; delay(10); dm(10); LED0=1; delay(30); LED0=0; delay(10); } void dm(mz) { switch(mz) { case 0:A=0;B_B=0;C=0;D=0;E=0;F=0;G=1;H=1;break; case 1:A=1;B_B=0;C=0;D=1;E=1;F=1;G=1;H=1;break; case 2:A=0;B_B=0;C=1;D=0;E=0;F=1;G=0;H=1;break; case 3:A=0;B_B=0;C=0;D=0;E=1;F=1;G=0;H=1;break; case 4:A=1;B_B=0;C=0;D=1;E=1;F=0;G=0;H=1;break; case 5:A=0;B_B=1;C=0;D=0;E=1;F=0;G=0;H=1;break; case 6:A=0;B_B=1;C=0;D=0;E=0;F=0;G=0;H=1;break; case 7:A=0;B_B=0;C=0;D=1;E=1;F=1;G=1;H=1;break; case 8:A=0;B_B=0;C=0;D=0;E=0;F=0;G=0;H=1;break; case 9:A=0;B_B=0;C=0;D=0;E=1;F=0;G=0;H=1;break; case 10:A=0;B_B=1;C=1;D=0;E=0;F=0;G=1;H=1;break; //C case 11:A=1;B_B=1;C=1;D=1;E=1;F=1;G=0;H=1;break; //- case 12:A=1;B_B=1;C=1;D=1;E=1;F=1;G=1;H=1;break; //不显示 case 13:A=1;B_B=1;C=1;D=1;E=1;F=1;G=1;H=0;break; //小数点 } } void main(void) { P1M0 = 0x00; P1M1 = 0x19; P3M0=0x00; P3M1=0x01; LED0=0; //C LED1=0; // 小数点后一位LED2=0; //个位 LED3=0; // 十位 read_ds18b20(); temp_convert(); delay_long(5); delay_long(2000);//delay(5)就是延时555us while(1) { temp_convert(); delay_long(5); final_temp=read_ds18b20(); if(final_temp<0) { final_temp=-(final_temp-1); zf=1; } else zf=0; display(final_temp); } } 转自:http://user.qzone.qq.com/1211716/main
2015年-3月-7日
10147 阅读
0 评论
51/52单片机