设计单片机温度传感器!

全部回答1
默认 最新
  • 一块温度传感器DS18B20和一块单片机就行了(欢迎提问) /******************************************************************** * 文件名  : 温度采集DS18B20.c * 描述    :  该文件实现了用温度传感器件DS18B20对温度的采集,并在液晶1602     上显示出来。 * 创建人  : Hsy2011,2011年1月10日 ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint  unsigned int #define jump_ROM 0xCC #define start 0x44 #define read_EEROM 0xBE sbit DQ = P2^3;    //DS18B20数据口 unsigned char TMPH,TMPL; sbit E=P2^7;  //1602使能引脚 sbit RW=P2^6;  //1602读写引脚  sbit RS=P2^5;  //1602数据/命令选择引脚 /******************************************************************** * 名称 : delay() * 功能 : 延时,延时时间大概为140US。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay_1() {  int i,j;  for(i=0; i<=10; i++)  for(j=0; j<=2; j++) ; } /******************************************************************** * 名称 : enable(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void enable(uchar del) {  P0 = del;  RS = 0;  RW = 0;  E = 0;  delay_1();  E = 1;  delay_1(); } /******************************************************************** * 名称 : write(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void write(uchar del) {  P0 = del;  RS = 1;  RW = 0;  E = 0;  delay_1();  E = 1;  delay_1(); } /******************************************************************** * 名称 : L1602_init() * 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void L1602_init(void) {  enable(0x01);  enable(0x38);  enable(0x0c);  enable(0x06);  enable(0xd0); } /******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下    L1602_char(1,5,'b') * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) {  uchar a;  if(hang == 1) a = 0x80;  if(hang == 2) a = 0xc0;  a = a + lie - 1;  enable(a);  write(sign); } /******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下     L1602_string(1,5,"ab cd ef;") ***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p) {  uchar a;  if(hang == 1) a = 0x80;  if(hang == 2) a = 0xc0;  a = a + lie - 1;  enable(a);  while(1)  {   if(*p == '\0') break;   write(*p);   p++;  } } /******************************************************************** * 名称 : delay() * 功能 : 延时函数 ***********************************************************************/ void delay(uint N) {  int i;  for(i=0; i<N; i++)  ; } /******************************************************************** * 名称 : Reset() * 功能 : 复位DS18B20 * 输入 : 无 * 输出 : 无 ***********************************************************************/ uchar Reset(void) {  uchar deceive_ready;  DQ = 0;  delay(29);  DQ = 1;  delay(3);  deceive_ready = DQ;  delay(25);  return(deceive_ready); } /******************************************************************** * 名称 : read_bit() * 功能 : 从DS18B20读一个位值 * 输入 : 无 * 输出 : 从DS18B20读出的一个位值 ***********************************************************************/ uchar read_bit(void) {  uchar i;  DQ = 0;  DQ = 1;  for(i=0; i<3; i++);  return(DQ); } /******************************************************************** * 名称 : write_bit() * 功能 : 向DS18B20写一位 * 输入 : bitval(要对DS18B20写入的位值) * 输出 : 无 ***********************************************************************/ void write_bit(uchar bitval) { DQ=0;if(bitval==1) DQ=1; delay(5); DQ=1; } /******************************************************************** * 名称 : read_byte() * 功能 : 从DS18B20读一个字节 * 输入 : 无 * 输出 : 从DS18B20读到的值 ***********************************************************************/ uchar read_byte(void) {  uchar i,m,receive_data;  m = 1;  receive_data = 0;  for(i=0; i<8; i++)  {   if(read_bit())   {    receive_data = receive_data + (m << i);   }   delay(6);  }  return(receive_data); } /******************************************************************** * 名称 : write_byte() * 功能 : 向DS18B20写一个字节 * 输入 : val(要对DS18B20写入的命令值) * 输出 : 无 ***********************************************************************/ void write_byte(uchar val) {  uchar i,temp;  for(i=0; i<8; i++)  {   temp = val >> i;   temp = temp & 0x01;   write_bit(temp);   delay(5);  } } /******************************************************************** * 名称 : Main() * 功能 : 主函数 ***********************************************************************/ void main() {  float tt;  uint temp;  P2 = 0x00;  L1602_init();  L1602_string(1,1,"  DS18B20 TEST  ");  L1602_string(2,1,"Temperature:00`C");  while(1)  {   Reset();   write_byte(jump_ROM);   write_byte(start);   Reset();   write_byte(jump_ROM);   write_byte(read_EEROM);   TMPL = read_byte();   TMPH = read_byte();   temp = TMPH;   temp <<= 8;       temp = temp | TMPL;   tt = TMPL * 0.0625;   temp = TMPL / 16 + TMPH * 16;   L1602_char(2,13,temp/10%10 + 48);   L1602_char(2,14,temp%10 + 48);   } }
    0 点赞

没有更多内容了

返回顶部
产品求购 求购