用8051单片机设计一数字式温度计 的电路图 有程序的最好 谢了

全部回答1
默认 最新
  • 这个电路很简单,我说一下就可以了。数字式温度传感器用最常用的DS18B20,它只有3个管脚,一个接电源,一个接地,另一个接8051单片机就可以了。温度值用数码管显示。这样整个电路就接好了。如果楼主觉得我回答的可以别忘了给我加分哦,为了你的问题我花费了半天的时间啊。程序如下: #include #include #define uchar unsigned char #define uint unsigned int #define Self_Define_ISP_Download_Command 0x3D sfr IAP_CONTR=0xE7; sbit DQ = P3^5; //DS18B20接入口 uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90} ; char bai,shi,ge; //定义变量 void Init_Com(void) { TMOD = 0x20; SM0=0; SM1=1; REN=1; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; EA=1; ES=1; } /*延时子函数*/ void delay(uint num) { while(num--) ; } /*************DS18b20温度传感器函数*********************/ Init_DS18B20(void) //传感器初始化 { uchar x=0; DQ = 1; //DQ复位 delay(10); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us //450 DQ= 1; //拉高总线 delay(20); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30); } //读一个字节 ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(8); } return(dat); } //写一个字节 WriteOneChar(unsigned char dat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(10); DQ = 1; dat>>=1; } delay(8); } //读取温度 int ReadTemperature(void) { uchar a,b; uint t; float tt; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar();//低位 b=ReadOneChar();//高位 tt=(b*256+a)*0.0625*100;//2个8位合成16位 t=(int)tt; /*t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; */ return(t); } /*显示子函数*/ void display(int bai,int shi,int ge) { int temp; temp=ReadTemperature();//读温度 bai=temp/1000;//显示百位 shi=temp%1000/100;//显示十位 ge=temp%100/10;//显示个位 //xiao=temp%10; P2=0xfd; //位选 P0=0X7f; //显示小数点 delay(500); P2=0xfe; P0=table[bai];//显示千位 delay(500);//一小段延时动态显示 P2=0xfd; P0=table[shi];//显示百位 delay(500); P2=0xfb; P0=table[ge];//显示十位 delay(500); P2=0xf7;// 显示° P0=0x9c; // delay(50); } void main() { Init_Com(); while(1) { display(bai,shi,ge);//显示函数 } } void UART_Interrupt_Receive(void) interrupt 4 { unsigned char k=0; unsigned int a,b; if(RI==1) { RI=0; k=SBUF; if(k==Self_Define_ISP_Download_Command) { for(a=1000;a>0;a--) for(b=100;b>0;b--); //延时约1S IAP_CONTR = 0x60; } } else { TI=0; } }
    0 点赞

没有更多内容了

返回顶部
产品求购 求购