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

📄 51

📁 51单片机大量源码
💻
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V9.00   TCMAIN                                                                01/14/2010 22:09:38 PAGE 1   


C51 COMPILER V9.00, COMPILATION OF MODULE TCMAIN
NO OBJECT MODULE REQUESTED
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE TCMain.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND SRC(.\TCMain.SRC)

line level    source

   1          #include <AT89X51.H>
   2          #include <intrins.h>
   3          #define Key_UP            P1_4 
   4          #define Key_DOWN          P1_5   
   5          #define Key_SET           P1_6   
   6          #define RelayOutPort      P3_7  
   7          #define LEDPort           P0      
   8          #define DELPort           P3_6   
   9          #define LEDTwoC           P2_6    
  10          #define LEDThreeC         P2_7    
  11          #define TMPort                    P3_3
  12          #define INBUF_LEN 5 //数据长度
  13          unsigned char inbuf1[INBUF_LEN]={'0','0','0','0','0'};//发送缓冲区
  14          unsigned char inbuf2[50];//接收缓冲区
  15          unsigned char count3;
  16          void init_serialcomm( void )
  17          {
  18   1      SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
  19   1      TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
  20   1      PCON |= 0x80 ; //SMOD=1;
  21   1      TH1 = 0xFA ; //Baud:9600 fosc=11.0592MHz
  22   1      IE |= 0x90 ; //Enable Serial Interrupt
  23   1      TR1 = 1 ; // timer 1 run
  24   1      }
  25          //向串口发送一个字符
  26          void send_char_com( unsigned char ch)
  27          {
  28   1      SBUF=ch;
  29   1      while (TI== 0 );
  30   1      TI= 0 ;
  31   1      }
  32          //向串口发送一个字符串,strlen 为该字符串长度
  33          void send_string_com( unsigned char *str, unsigned int strlen)
  34          {
  35   1      unsigned int k= 0 ;
  36   1      do
  37   1      {
  38   2      send_char_com(*(str + k));
  39   2      k++;
  40   2      } while (k < strlen);
  41   1      }
  42          //串口接收中断函数
  43          void serial () interrupt 4 using 3
  44          {
  45   1      if (RI) //RI==开始接收
  46   1      {
  47   2      unsigned char ch;
  48   2      RI = 0 ; //软件RI=0
  49   2      ch=SBUF;
  50   2      if (ch> 1 )
  51   2      {
  52   3      count3= 0 ;
  53   3      inbuf2[count3]=ch;
  54   3      }
  55   2      else
C51 COMPILER V9.00   TCMAIN                                                                01/14/2010 22:09:38 PAGE 2   

  56   2      {
  57   3      count3++;
  58   3      inbuf2[count3]=ch;
  59   3      }
  60   2      }
  61   1      }       
  62          
  63          unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}; //0-9的LED笔划,
             -0xFF为空,0xF7为负号
  64          unsigned char dis_8[12]={'0','1','2','3','4','5','6','7','8','9',' ','-'};
  65          static unsigned char bdata StateREG;    //可位寻址的状态寄存器
  66          sbit DS1820ON = StateREG^0;               //DS1820是否存在
  67          sbit SetTF = StateREG^1;              //是否是在温度设置状态
  68          sbit KeySETDown = StateREG^2;         //是否已按过SET键标识
  69          sbit PowTF = StateREG^3;              //电源电源标识
  70          sbit KeyTF = StateREG^4;                                                        //键盘是否允许
  71          
  72          //sbit KeySETDowning = StateREG^5;                      //SET是否正在按下
  73          static unsigned char bdata TLV _at_ 0x0029;         //温度变量高低位
  74          static unsigned char bdata THV _at_ 0x0028;
  75          static signed char TMV;       //转换后的温度值
  76          static unsigned char KeyV,TempKeyV;      //键值
  77          static unsigned char Second;
  78          static unsigned char flag;
  79          static signed char TMRomV _at_ 0x0027;    //高温限制
  80          static signed char TMSetV _at_ 0x0026;    //温度设定值
  81          static unsigned char KSDNum;    //SET键连按时的采集次数
  82          static unsigned char IntNum,IntNum2,IntNum3;    //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态
             -时LED闪烁
  83          static signed char LED_One,LED_Two,LED_Three;  //LED的显示位 LED_One为十位,LED_Two为个位
  84          static unsigned char Sign; //负号标识
  85          
  86          void main(void)
  87          {
  88   1      
  89   1              void InitDS1820(void);   //定义函数
  90   1              void ROMDS1820(void);
  91   1              void TMVDS1820(void);
  92   1              void TMRDS1820(void);
  93   1              void TMWDS1820(void);
  94   1              void TMREDS1820(void);
  95   1              void TMERDS1820(void);
  96   1              void ReadDS1820(void);
  97   1              void WriteDS1820(void);
  98   1              void Delay_510(void);
  99   1              void Delay_110(void);
 100   1              void Delay_10ms(void);
 101   1              void Delay_4s(void);
 102   1              void V2ToV(void);
 103   1              
 104   1               DELPort=1;
 105   1              StateREG = 0;   //初始化变量
 106   1              SetTF = 0;      
 107   1              PowTF = 0;                      //关电源
 108   1              THV = 0;
 109   1              TLV = 0;
 110   1              TMV = 0;
 111   1              KeyV = 0;
 112   1              TempKeyV = 0;
 113   1              KSDNum = 0;
 114   1              IntNum = 0;
 115   1              IntNum2 = 0;
C51 COMPILER V9.00   TCMAIN                                                                01/14/2010 22:09:38 PAGE 3   

 116   1              IntNum3 = 0;
 117   1              LED_One = 0;
 118   1              LED_Two = 0;
 119   1      
 120   1              InitDS1820(); //初始化
 121   1              ROMDS1820();    //跳过ROM
 122   1              TMERDS1820();  //E2PRAM中温度上限值调入RAM
 123   1              InitDS1820(); //初始化
 124   1              ROMDS1820();    //跳过ROM
 125   1              TMRDS1820();    //读出温度指令
 126   1              ReadDS1820(); //读出温度值和上限值
 127   1              TMSetV = TMRomV;  //拷贝保存在DS18B20ROM里的上限值到TMSetV
 128   1      
 129   1              EA = 1;                                 //允许CPU中断
 130   1              ET0 = 1;                                //定时器0中断打开
 131   1              TMOD = 0x1;                     //设定时器0为模式1,16位模式
 132   1              TH0=0xB1;
 133   1              TL0=0xDF;                               //设定时值为20000us(20ms)
 134   1              TR0 = 1;
 135   1              
 136   1              while(1){                               //开始定时
 137   2      
 138   2              
 139   2      
 140   2               
 141   2      
 142   2      
 143   2      if (flag==0){
 144   3      if (Second==1){
 145   4                              Delay_4s();
 146   4                              Delay_4s();
 147   4                              Delay_4s();
 148   4                              Delay_4s();
 149   4                              Delay_4s();
 150   4                              Delay_4s();
 151   4                              
 152   4                        DELPort=0; 
 153   4                        Second=0;
 154   4                        }
 155   3                         }
 156   2                       }
 157   1              
 158   1              
 159   1      }
 160          
 161          //定时器0中断外理中键扫描和显示
 162          void KeyAndDis_Time0(void) interrupt 1 using 2
 163          {
 164   1        TH0=0xB1;
 165   1              TL0=0xDF;                               //设定时值为20000us(20ms)
 166   1      
 167   1              LEDPort = 0xFF;
 168   1              
 169   1         
 170   1                 if (inbuf2[0]==0x33){
 171   2                 send_char_com('O');
 172   2                 send_char_com('O');
 173   2                 send_char_com('O');
 174   2                 SetTF = 1;
 175   2      //send_string_com(inbuf2,1);
 176   2      //BEEP=0;
 177   2      //RELAY=0;
C51 COMPILER V9.00   TCMAIN                                                                01/14/2010 22:09:38 PAGE 4   

 178   2      send_char_com('O');
 179   2           //inbuf2[0]=0x00;
 180   2               inbuf2[0]=0x00;
 181   2      } 
 182   1      
 183   1      if (inbuf2[0]==0x36){
 184   2      
 185   2      //send_string_com(inbuf2,1);
 186   2      //BEEP=1;
 187   2      send_char_com('N');
 188   2      send_char_com('N');
 189   2      send_char_com('N');
 190   2      SetTF = 0;
 191   2      
 192   2      inbuf2[0]=0x00;
 193   2      
 194   2      } 
 195   1      
 196   1      if (inbuf2[0]==0x34){
 197   2                 KeyV=2;
 198   2      //send_string_com(inbuf2,1);
 199   2      //BEEP=0;
 200   2      //RELAY=0;
 201   2        TMSetV = TMSetV - 1;
 202   2          inbuf2[0]=0x00;
 203   2      } 
 204   1      
 205   1      if (inbuf2[0]==0x35){
 206   2      
 207   2      //send_string_com(inbuf2,1);
 208   2      //BEEP=1;
 209   2      //RELAY=1;
 210   2       TMSetV = TMSetV + 1;    //上调温度
 211   2       inbuf2[0]=0x00;
 212   2      } 
 213   1      
 214   1      if (inbuf2[0]==0x74){
 215   2               KeyV=2;
 216   2      //send_string_com(inbuf2,1);
 217   2      //BEEP=1;
 218   2      //RELAY=1;
 219   2      } 
 220   1      
 221   1      if (inbuf2[0]==0x90){
 222   2               KeyV=1;
 223   2      //send_string_com(inbuf2,1);
 224   2      //BEEP=1;
 225   2      //RELAY=1;
 226   2      } 
 227   1      
 228   1      
 229   1        if (!Key_UP)
 230   1          KeyV = 1;
 231   1        if (!Key_DOWN)
 232   1          KeyV = 2;
 233   1        if (!Key_SET)
 234   1          KeyV = 3;
 235   1              //KeySETDowning = 0;  //清除
 236   1        if (KeyV != 0)      //有键按下
 237   1          {
 238   2            Delay_10ms();   //延时防抖  按下10ms再测
 239   2            if (!Key_UP)
C51 COMPILER V9.00   TCMAIN                                                                01/14/2010 22:09:38 PAGE 5   

 240   2              TempKeyV = 1;
 241   2            if (!Key_DOWN)
 242   2              TempKeyV = 2;
 243   2            if (!Key_SET)
 244   2              TempKeyV = 3;
 245   2            if (KeyV == TempKeyV)   //两次值相等为确定接下了键
 246   2              {
 247   3                if (KeyV == 3)      //按下SET键,如在SET状态就退出,否则进入
 248   3                  {
 249   4                                                              //KeySETDowning = 1; //表明SET正在按下
 250   4                                                              
 251   4                              
 252   4                    PowTF = 0;      //电源标识开
 253   4                                                              if (!KeyTF)
 254   4                      if (SetTF){
 255   5                                      send_char_com('N');
 256   5      send_char_com('N');
 257   5      send_char_com('N');
 258   5                                      SetTF = 0;    //标识位标识退出设定
 259   5                                                      
 260   5                                                                                      InitDS1820(); //初始化
 261   5                                                                              ROMDS1820();    //跳过ROM
 262   5                                                                              TMWDS1820();    //写温度上限指令
 263   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 264   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 265   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 266   5                                                                                      InitDS1820(); //初始化
 267   5                                                                              ROMDS1820();    //跳过ROM
 268   5                                                                              TMREDS1820();   //温度上限值COPY回E2PRAM
 269   5                                                                              }
 270   4                      else {
 271   5                                      send_char_com('O');
 272   5                 send_char_com('O');
 273   5                 send_char_com('O');
 274   5                              SetTF = 1;}
 275   4                                               
 276   4                                         
 277   4                    if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
 278   4                      KeySETDown = 1;
 279   4                    else
 280   4                      KSDNum = KSDNum + 1;  //前一秒内有按过SET则开始计数
 281   4                  }
 282   3                if (SetTF)  //在SET状态下
 283   3                  {
 284   4                               
 285   4                    if ((KeyV == 1) && (!KeyTF))
 286   4                      TMSetV = TMSetV + 1;    //上调温度
 287   4                    if ((KeyV == 2) && (!KeyTF))
 288   4                      TMSetV = TMSetV - 1;    //下调温度
 289   4                    if (TMSetV <= 20)          //限制温度上下限
 290   4                      TMSetV = 20;
 291   4                    if (TMSetV >= 75)
 292   4                      TMSetV = 75;
 293   4                  }
 294   3                      if ((!KeyTF) && (IntNum3 == 0)) KeyTF = 1; //当键盘处于可用时,锁定
 295   3              }
 296   2      
 297   2           
 298   2          }
 299   1        KeyV = 0;
 300   1        TempKeyV = 0;   //清空变量准备下次键扫描
 301   1      
C51 COMPILER V9.00   TCMAIN                                                                01/14/2010 22:09:38 PAGE 6   

 302   1        if (!PowTF)
 303   1          {
 304   2            InitDS1820();     //初始化
 305   2            ROMDS1820();      //跳过ROM
 306   2            TMVDS1820();  //温度转换指令
 307   2      
 308   2            Delay_510();
 309   2            Delay_510();  //延时等待转换完成
 310   2      
 311   2            InitDS1820(); //初始化
 312   2            ROMDS1820();      //跳过ROM
 313   2            TMRDS1820();      //读出温度指令
 314   2            ReadDS1820(); //读出温度值
 315   2      
 316   2            V2ToV();        //转换显示值
 317   2            if (TMV > TMSetV)   //根据采集到的温度值控制继电器
 318   2              {
 319   3                RelayOutPort = 0;
 320   3                        flag=0;
 321   3                        }
 322   2            else
 323   2                          {
 324   3                RelayOutPort = 1;
 325   3                        DELPort=1; 
 326   3                        Second=1;
 327   3                        flag=1;
 328   3      
 329   3                      
 330   3                        }
 331   2      
 332   2            if (SetTF) IntNum2 = IntNum2 + 1; //用于闪烁计数
 333   2            if (IntNum2 > 50 ) IntNum2 = 0;
 334   2                              if (KeyTF) IntNum3 = IntNum3 + 1; //用于防止按键连按
 335   2                              if (IntNum3 > 25) 
 336   2                                      {
 337   3                                              IntNum3 = 0;
 338   3                                              KeyTF = 0;
 339   3                                      }
 340   2      
 341   2            if ((SetTF) && (IntNum2 < 25)) goto InitEnd;  //计数在后半段时显示
 342   2               
 343   2                LEDPort = LED_Two;
 344   2            LEDTwoC = 0;
 345   2            Delay_510();
 346   2            LEDTwoC = 1;    //显示十位数
 347   2            LEDPort = LED_Three;
 348   2            LEDThreeC = 0;
 349   2            Delay_510();
 350   2            LEDThreeC = 1;    //显示个位数

⌨️ 快捷键说明

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