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

📄 com.lst

📁 1820显示温度(LED(595))C语言版 通过串口设定温度和读取当前温度
💻 LST
字号:
C51 COMPILER V7.00  COM                                                                    04/21/2008 22:46:10 PAGE 1   


C51 COMPILER V7.00, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN com.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE com.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include<reg51.h>
   2          #include <intrins.h>
   3          
   4          #define  uint  unsigned int
   5          #define uchar unsigned char
   6          /*端口定义*/
   7          #define LED P0                                  /*实际温度值输出端口定义*/
   8          
   9          #define NOP _nop_()
  10          
  11           uint temp=40;
  12           uint t1=41;
  13          
  14          sbit CLK=P0^7;
  15          sbit DAT=P0^4;
  16          sbit DCLK=P0^6;
  17          
  18          sbit key=P1^0;
  19          
  20          uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭
  21          sbit  tem_in=P2^6;                              /*温度读取端口*/
  22          sbit  heat1=P2^0;                                //加热控制端口1
  23          
  24          uchar temp_h,temp_l;                    /*温度值变量*/
  25          uchar flag1;                                    /*正负标志位*/
  26          uchar temper,temper_set;
  27          
  28          void initcom(void);
  29          void send_char(unsigned char txd);
  30          void tmpchange(void);
  31          void sendbyte(uchar byte);
  32          void delay2(uint  j);//延时
  33          void display(uchar number);
  34           void delays(uint n);
  35          
  36          //串口初始化
  37          void initcom(void)
  38          {
  39   1              TMOD = 0x20;                    // 定时器1工作于8位自动重载模式, 用于产生波特率
  40   1              TH1 = 0x0F3;                            // 波特率2400
  41   1              TL1 = 0x0F3;
  42   1      
  43   1      
  44   1              SCON = 0x50;                    // 设定串行口工作方式 
  45   1              PCON=0; //波特率不翻倍 
  46   1      //PCON &= 0xef;                 // 波特率不倍增
  47   1      
  48   1              ES=1;      //允许串行口中断
  49   1              TR1 = 1;                                // 启动定时器1
  50   1              IE|= 0x90;                              // enable serial interrupt,禁止other中断
  51   1      //              IE= 0x9F;                               // enable serial interrupt,禁止other中断
  52   1      //      IE = 0x00;                              // 禁止任何中断
  53   1          EA=1; //开总中断
  54   1      //       IT0=1;
  55   1      //       EX0=1;
C51 COMPILER V7.00  COM                                                                    04/21/2008 22:46:10 PAGE 2   

  56   1      }
  57          
  58          
  59          void send_char(unsigned char txd)
  60          // 传送一个字符
  61          {
  62   1              SBUF = txd;
  63   1              while(!TI);                             // 等特数据传送
  64   1              TI = 0;                                 // 清除数据传送标志
  65   1      }
  66          
  67          
  68           //======595显示程序===============================================
  69          void sendbyte(uchar byte)
  70          {
  71   1              uchar num,i;
  72   1              num=tab[byte];
  73   1      
  74   1         for(i=0;i<8;i++)
  75   1              {
  76   2               CLK=0;
  77   2               DAT=num&0x80;
  78   2               num=num<<1;
  79   2      
  80   2               CLK=1;
  81   2               }
  82   1      
  83   1      }
  84          
  85          
  86          void delay2(uint  j)//延时
  87          { uchar m;
  88   1      for(;j>0;j--)
  89   1      {
  90   2      for(m=0;m<=250;m++)
  91   2       {;}
  92   2      }
  93   1      }
  94          
  95          void display(uchar number)
  96          {
  97   1       uchar sw,gw;
  98   1       DCLK=0;
  99   1       sw=number/10;
 100   1       gw=number-10*sw;
 101   1      
 102   1       sendbyte(sw);
 103   1       sendbyte(gw);
 104   1        DCLK=0;
 105   1        delay2(150);
 106   1       //out595();
 107   1       DCLK=1;
 108   1      }
 109          //=====================================================================
 110           /**********************************延时1S整*******************************/
 111           void delays(uint n)
 112          {
 113   1        unsigned char i,j,k,l;
 114   1        for(l=n;l>0;l--)
 115   1      
 116   1        for(k=100;k>0;k--)
 117   1      
C51 COMPILER V7.00  COM                                                                    04/21/2008 22:46:10 PAGE 3   

 118   1        for(i=20;i>0;i--)
 119   1      
 120   1        for(j=248;j>0;j--);
 121   1      
 122   1      }
 123          
 124          
 125          //************************************
 126          /*====================================
 127          函数功能:延时 
 128          入口参数:
 129           说  明 :送1迟202us
 130          =====================================*/
 131          
 132          void delay(unsigned int count)
 133          {
 134   1              unsigned int i;
 135   1              while(count)
 136   1              {
 137   2                      i=200;
 138   2                      while(i>0)i--;
 139   2                      count--;
 140   2              }
 141   1      }
 142          
 143          /*====================================
 144          函数功能:延时 us
 145          入口参数:
 146           说  明 :
 147          =====================================*/
 148          
 149          void Delay_us(uchar n)
 150          {
 151   1              uchar i;
 152   1              i=0;
 153   1              while(i<n)
 154   1              {i++;}
 155   1              return;
 156   1      }
 157          
 158          /*====================================
 159          函数功能:DS18B20重设
 160          入口参数:无
 161           说  明 :
 162          =====================================*/
 163          
 164          void dsreset(void)
 165          {
 166   1              unsigned int i;
 167   1              tem_in=0;
 168   1              i=103;
 169   1              while(i>0)i--;
 170   1              tem_in=1;
 171   1              i=4;
 172   1              while(i>0)i--;
 173   1      }
 174          
 175          /*====================================
 176          函数功能:直接读一字节程序
 177          入口参数:无
 178           说  明 :返回结果
 179          =====================================*/
C51 COMPILER V7.00  COM                                                                    04/21/2008 22:46:10 PAGE 4   

 180          
 181          uchar ReadByte(void){
 182   1              uchar i,k;
 183   1              i=8;
 184   1              k=0;
 185   1              while(i--)
 186   1              {
 187   2                      tem_in=1;
 188   2                      Delay_us(1);
 189   2                      tem_in=0;
 190   2                      k=k>>1;
 191   2                      tem_in=1;
 192   2                      NOP;
 193   2                      if(tem_in)k |= 0x80;
 194   2                      Delay_us(4);
 195   2              }
 196   1              return(k);
 197   1      }
 198          
 199          /*====================================
 200          函数功能:向B20写一字节
 201          入口参数:待写数据
 202           说  明 :
 203          =====================================*/
 204          
 205          void tmpwrite(unsigned char dat)
 206          {       unsigned int i;
 207   1              unsigned char j;
 208   1              bit testb;
 209   1              for(j=1;j<=8;j++)
 210   1              {       testb=dat&0x01;
 211   2                      dat=dat>>1;
 212   2                      if(testb)
 213   2                      {       tem_in=0;i++;i++;
 214   3                              tem_in=1;
 215   3                              i=8;while(i>0)i--;
 216   3                      }
 217   2                      else
 218   2                      {
 219   3                              tem_in=0;
 220   3                              i=8;while(i>0)i--;
 221   3                              tem_in=1;i++;i++;
 222   3                      }
 223   2              }
 224   1      }
 225          
 226          //////////////////////////////////////////////////////////////
 227          void tmpchange(void)
 228          {
 229   1              dsreset();                                              /*复位*/
 230   1              delay(1);
 231   1              tmpwrite(0xcc);                                 //跳过序列号命令
 232   1             // delay(200);
 233   1              tmpwrite(0x44);                                 //转换命令
 234   1      }
 235          
 236          /*====================================
 237          函数功能:将温度值读出来并转化为显示数组
 238          入口参数:
 239           说  明 :调用 ReadByte();
 240          =====================================*/
 241          
C51 COMPILER V7.00  COM                                                                    04/21/2008 22:46:10 PAGE 5   

 242          void tmp(void)
 243          {
 244   1              float dis;
 245   1      //      uchar tempbuf;
 246   1              dsreset();
 247   1              delay(1);
 248   1              tmpwrite(0xcc);
 249   1              tmpwrite(0xbe);
 250   1              temp_l=ReadByte();                              //低位在前
 251   1              temp_h=ReadByte();                              //高位在后
 252   1      
 253   1              flag1=temp_h&0xf8;
 254   1              if(flag1)
 255   1              {
 256   2                      temp_h=~temp_h;
 257   2                      if(temp_l==0)temp_h++;          //若低8位全为0且温度为负,取补时就要向高位进1
 258   2                      temp_l=~temp_l+1;
 259   2              }
 260   1              dis=(temp_h*256+temp_l)/16;
 261   1      
 262   1              //dis=25.34;                                            //调试用
 263   1              // dis=2;
 264   1               temper=(uchar)dis;
 265   1      
 266   1      
 267   1      }
 268          
 269          //================================================
 270          //================温度控制开始========
 271          void system_heat(uint temperature)
 272          {
 273   1      
 274   1       if(temper<=temperature)
 275   1                {
 276   2                        heat1=0;
 277   2                tmpchange();                                  //启动温度转换/
 278   2                delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了
             -芯片上电后预设的85度这个数。
 279   2              tmp();                                                  //温度显示和报警/
 280   2                display(temper);
 281   2                }
 282   1              else if(temper>temperature)
 283   1              {
 284   2                      heat1=1;
 285   2              tmpchange();                                    //启动温度转换/
 286   2                delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了
             -芯片上电后预设的85度这个数。
 287   2              tmp();                                                  //温度显示和报警/
 288   2                display(temper);
 289   2                        }     
 290   1       
 291   1      }
 292          //--------------串口接收从电脑发来的数据------------------//
 293          void chuankou() interrupt 4 using 1//串口接收数据,中断方式
 294          {
 295   1      if(RI!=0)
 296   1      {
 297   2          RI=0;
 298   2         // receive=SBUF;
 299   2          ES=0; 
 300   2         temp=SBUF;
 301   2      
C51 COMPILER V7.00  COM                                                                    04/21/2008 22:46:10 PAGE 6   

 302   2      
 303   2         
 304   2         if(temp==0x0e)
 305   2         {
 306   3        //   tmpchange();                                     //启动温度转换/
 307   3        //              delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果

⌨️ 快捷键说明

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