⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rd.lst

📁 使用proteus仿真的温度测量器
💻 LST
字号:
C51 COMPILER V8.08   RD                                                                    08/05/2008 10:18:37 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE RD
OBJECT MODULE PLACED IN RD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE RD.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<regx51.h>
   2          #include<stdio.h>
   3          sbit DQ=P3^4;
   4          
   5          unsigned char L_18B20,H_18B20,rom[8];
   6          unsigned int fg=0,zhengshu,xiaoshu;
   7          
   8          
   9          /*------RS232 INIT------*/
  10          void com_initialize(void){
  11   1         
  12   1         PCON = 0x80;           //PCON寄存器设置AT89S5X的串行传输速率与省电模式 SMOD=0 一般波特率 SMOD=1 双倍波特率
  13   1         TMOD = 0x20;           //TMOD计时器模式控制寄存器 工作模式2 8位的计时/计数器 可自动重新载入计数值
  14   1         TH1 = 0xfa;            //根据公式所算 波特率为9600
  15   1         SCON = 0xd2;           //串行端口控制器SCON的内容决定了串行端口的工作模式本 设置表示9位元UART 由TIMER1和SMOD位
             -决定波特率
  16   1         TR1 = 1;
  17   1        
  18   1      
  19   1      }
  20          
  21          /*------DS18B20------*/
  22          
  23          
  24          void delay_18B20(unsigned int i)
  25          {
  26   1              while(i--);
  27   1      }
  28          
  29          
  30          /*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲
  31            然后主机释放单总线并进入接收模式 此时单总线电平被拉高
  32            DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲  */                                         
  33          void Init_DS18B20(void) 
  34          {
  35   1               unsigned char x=0;
  36   1               DQ = 1;          //DQ复位
  37   1               delay_18B20(8);  //稍做延时
  38   1               DQ = 0;          //单片机将DQ拉低
  39   1               delay_18B20(80); //精确延时 大于 480us
  40   1               DQ = 1;          //拉高总线
  41   1               delay_18B20(14);
  42   1               x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  43   1               delay_18B20(20);
  44   1      }
  45          
  46          /*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0
  47            所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间
  48            两种写时隙均以主机拉低总线开始
  49            产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平
  50            产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */
  51          void WriteOneChar(unsigned char dat)
  52          {
  53   1              unsigned char h=0;
  54   1              for (h=8; h>0; h--)
C51 COMPILER V8.08   RD                                                                    08/05/2008 10:18:37 PAGE 2   

  55   1              {
  56   2                      DQ = 0;
  57   2                      DQ = dat&0x01;
  58   2              delay_18B20(5);
  59   2                      DQ = 1;
  60   2              dat>>=1;
  61   2       }
  62   1      }
  63            
  64          /*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间
  65            每次读时隙由主机发起,拉低总线至少1us。
  66            若传1,则保持总线高电平;若发送0,则拉低总线
  67            传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样
             -总线状态 */
  68          unsigned char ReadOneChar(void)
  69          {
  70   1              unsigned char i=0;
  71   1              unsigned char dat = 0;
  72   1              for (i=8;i>0;i--)
  73   1               {
  74   2                        DQ = 0; // 给脉冲信号
  75   2                        dat>>=1;
  76   2                        DQ = 1; // 给脉冲信号
  77   2                        if(DQ)
  78   2                        dat|=0x80;
  79   2                        delay_18B20(4);
  80   2               }
  81   1              return(dat);
  82   1      }
  83                           
  84          
  85          
  86          
  87          void read_18B20(void)
  88          {
  89   1      
  90   1              
  91   1              Init_DS18B20();
  92   1      
  93   1      
  94   1              WriteOneChar(0xCC);     // 跳过读序号列号的操作
  95   1              WriteOneChar(0x44);     // 启动温度转换
  96   1      
  97   1              delay_18B20(100);       // this message is wery important
  98   1      
  99   1              Init_DS18B20();
 100   1              WriteOneChar(0xCC);     //跳过读序号列号的操作
 101   1      
 102   1              WriteOneChar(0xBE);     //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 103   1      
 104   1              delay_18B20(100);
 105   1      
 106   1              L_18B20=ReadOneChar();  //读取低八位数据
 107   1              H_18B20=ReadOneChar();  //读取高八位数据
 108   1      
 109   1              zhengshu=(int)(L_18B20/16+H_18B20*16); //整数部分
 110   1              xiaoshu=(int)((L_18B20&0x0f)*10/16); //小数第一位
 111   1              
 112   1      }
 113          
 114          void main()
 115          {
C51 COMPILER V8.08   RD                                                                    08/05/2008 10:18:37 PAGE 3   

 116   1         unsigned char i;
 117   1         com_initialize();
 118   1         for(i=0;i<200;i++)
 119   1         read_18B20();
 120   1         printf("Temprature:\n");
 121   1         printf("%d.%d\n",zhengshu,xiaoshu);   
 122   1         //WriteOneChar(0x33);
 123   1         //for(i=0;i<8;i++)
 124   1         //rom[i]=ReadOneChar();
 125   1         // for(i=0;i<8;i++)
 126   1      //      printf("%c",rom[i]);
 127   1      
 128   1         while(1);
 129   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    252    ----
   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -