|
本帖最后由 huxiao 于 2015-1-24 14:39 编辑
西安这鬼天气,这几天真的好热呀,估计也在30多度
这几天也没什么事情干,做个温度计吧,好坏不说知道有多热。
很简单得,18B20+AT89C2051+数码管
用洞洞板好了,电路不复杂。
这个是我每次用洞洞板前必须要做的工作,用cad先把走线布一下,这样焊起来就方便多了。
焊接完得正面是这个样子得:

显示数字的用前面三个数码管,最后一个反过来用,可以显示摄氏度符号。
背面的镀锡走线是这个垃圾效果:
上电测试温度显示:

最后把程序给大家,线路看着程序走,数码管是共阳的。
- #include<reg51.h>
- #define leddata P1
- sbit led0=P3^7;
- sbit led1=P3^0;
- sbit led2=P3^1;
- sbit DQ=P3^5;
- typedef unsigned char byte;
- byte i;
- unsigned char code tab2[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};//小数部分显示数据
- unsigned char code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//LED段码表,根据自己硬件修改
- // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, off
- void delays(unsigned char k)
- {
- unsigned char i,j;
- for(i=0;i<k;i++)
- for(j=0;j<50;j++);
- }
- //*********** 18B20驱动 **************************
- void delay(unsigned char i)
- {
- while(--i);
- }
- //复位
- byte ow_reset(void)
- {
- byte presence;
- DQ=0; //拉低总线
- delay(250); // 保持 480us
- delay(250);
- DQ = 1; // 释放总线
- delay(30); // 等待回复
- presence = DQ; // 读取信号
- delay(250); // 等待结束信号
- return(presence); // 返回 0:正常 1:不存在
- }
- //从 1-wire 总线上读取一个字节
- byte read_byte(void)
- {
- byte i;
- byte value = 0;
- for (i=8;i>0;i--)
- {
- value>>=1;
- DQ = 0;
- DQ = 1;
- delay(2);
- if(DQ)value|=0x80;
- delay(6);
- }
- return(value);
- }
- //向 1-WIRE 总线上写一个字节
- void write_byte(char val)
- {
- byte i;
- for (i=8; i>0; i--) // 一次写一位
- { DQ=1;
- DQ=0;
- DQ = val&0x01;
- delay(30);
- DQ = 1;
- val=val/2;
- }
- delay(70);
- }
- unsigned int Read_Temperature(void)
- {
- union
- {
- unsigned char c[2];
- unsigned int x;
- }temp;
- temp.x=0x0000;
- i=ow_reset();
- if(!i)
- {
- write_byte(0xCC); //Skip ROM
- write_byte(0xBE); //Read Scratch Pad
- temp.c[1]=read_byte(); //Start read data
- temp.c[0]=read_byte(); //read two byte data from device
- ow_reset(); //reset
- write_byte(0xCC); //Skip ROM
- write_byte(0x44); //Start Conversion
- }
- return temp.x;
- }
- //***************************
- void main(void)
- { unsigned int j;
- unsigned char p,q,n0,n1,n2;
- while(1)
- {
- j=Read_Temperature();
- q=(unsigned char)(j&0x000f);
- p=(unsigned char)(j>>4)-2;
- n0=p/10;
- n1=p%10;
- n2=tab2[q];
- led0=0;leddata=tab1[n0];delays(30);led0=1;
- led1=0;leddata=tab1[n1]&0x7f;delays(30);led1=1;
- led2=0;leddata=tab1[n2];delays(20);led2=1;
- }
- }
复制代码
超级简单吧,所以这个小儿科,给初学者一个参考,高手就不要给我拍砖了,不然我要被打死了。
|
|