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

📄 chongdianqi.lst

📁 用LPC915单片机做的一个脉冲充电器的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   CHONGDIANQI                                                           03/12/2009 16:20:17 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE CHONGDIANQI
OBJECT MODULE PLACED IN chongdianqi.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE chongdianqi.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //***************************************************************************
   2          //* Charger.c
   3          //* By : 王进
   4          //* Date : March 2009
   5          //* Description :  P89LPC916用于充电器控制部分
   6          //***************************************************************************
   7          #include <reg916.h> // 定义LPC916头文件
   8          #define uchar unsigned char
   9          #define uint unsigned int
  10          //-----------------------------------------------
  11          //定义全局变量
  12          //---------------------------------------------
  13          uchar data RTC_Counter_LED, LED_Flash_Speed; //RTC 用于 LED 延时
  14          uint data RTC_Counter_AD; //RTC 计数用于 AD转换
  15          uint data AD_Convert_Speed; //AD转换间隔时间
  16          uint data RTC_Counter; //RTC定时
  17          uchar data RTC_Counter_Minute; // 延时控制的时间
  18          bit data LED_Flag, AD1_Flag, AD_Flag, Battery_On_Socket;
  19          bit data Pre_Charge_Status, Constant_Current_Charge, Constant_Voltage_Charge;
  20          uint data AD1_1,AD1_2,AD1_3; //AD1.1-检测电压, AD1.2-检测温度., AD1.3-检测电流
  21          uchar data average; // AD 转换的平均时间
  22          /****************************************************************************
  23          各脚位功能:P0.2脚AD采样电压。P0.4脚AD采样电流。P1.2为PWM输出。P0.1为LED输出。
  24          ****************************************************************************/
  25          //-----------------------------------------------
  26          //定义常量
  27          //-----------------------------------------------
  28          #define LED_FLASH_FAST 10 // 定义LED灯闪最高频率
  29          #define LED_FLASH_SLOW 200 // 定义LED灯闪最低频率
  30          #define STOP_CHARGE_DELAY 50 // 当电流为1.5A时延时开始,延时X分
  31          //***************************************************************************
  32          //* 声明
  33          //***************************************************************************
  34          void main(void); // 主函数
  35          void init(void); // 初始化函数
  36          void ad_convert(void);//AD控制函数
  37          //***************************************************************************
  38          //* main()
  39          //* Description : 主函数
  40          //***************************************************************************
  41          void main ()
  42                  {
  43   1                      EA = 0;
  44   1                      init();
  45   1                      EA = 1;
  46   1                      for( RTC_Counter = 1; RTC_Counter < 1700; );
  47   1                      RTC_Counter = 0;
  48   1                      for(;;)
  49   1                              {
  50   2                                      if(LED_Flag == 0) // 控制LED为灯闪
  51   2                                              {
  52   3                                                      KB1 = 0;
  53   3                                              }
  54   2                                      else
  55   2                                              {
C51 COMPILER V7.50   CHONGDIANQI                                                           03/12/2009 16:20:17 PAGE 2   

  56   3                                                      KB1 = 1;
  57   3                                              }
  58   2                                      if( ( AD_Flag == 1 ) && ( Battery_On_Socket == 1 ))
  59   2                                      // 开始 AD 转换并控制 PWM, 预设AD转换速度
  60   2                                              { // AD_Flag 控制 AD 转换速度
  61   3                                                      ad_convert();
  62   3                                                      AD_Flag = 0;
  63   3                                              }
  64   2                                      if( RTC_Counter_Minute == STOP_CHARGE_DELAY ) // 如果延时结束, 停止 charge
  65   2                                              {
  66   3                                                      EA = 0; //关闭中断, 所以无法设置 AD_Flag
  67   3                                                      P1 = 0; //关闭 PWM
  68   3                                                      LED_Flag = 1; //LED打开
  69   3                                              }
  70   2                              }
  71   1              }
  72          //***************************************************************************
  73          //* init()
  74          //* Description :  P89LPC916 初始化
  75          //***************************************************************************
  76          void init(void)
  77                  {
  78   1                      //SP = 0x30; //设置 SP 从 50H - 7FH
  79   1                      //-----------------------------------------------
  80   1                      //配置 P0 I/O
  81   1                      //-----------------------------------------------
  82   1                      P0M1 = 0x1C; // 设置 P0.2/3/4 为输入, 0001 1100
  83   1                      P0M2 = 0xE3; // 设置 P0.1 for PP, P0^1 用于LED, 1110 0011
  84   1                      //-----------------------------------------------
  85   1                      //配置 P1 I/O
  86   1                      //-----------------------------------------------
  87   1                      P1M1 = 0x24; // ^5 Input only 0010 0100
  88   1                      P1M2 = 0xdf; // 设置 P1^2 为开漏输出 1101 1111 
  89   1                      //-----------------------------------------------
  90   1                      //配置 P2 I/O (P2 没有使用)
  91   1                      //-----------------------------------------------
  92   1                      P2M1 = 0x00; // 设置P2口为推挽输出
  93   1                      P2M2 = 0xFF;
  94   1                      KB5 = 0; //设置 p0.5 = 0 
  95   1                      P1 = 0x00; //设置 p1.2 = 0   TO为PWM
  96   1                      P2 = 0x00;
  97   1                      RTC_Counter = 0x00;
  98   1                      RTC_Counter_LED = 0x00;
  99   1                      LED_Flag = 0;
 100   1                      LED_Flash_Speed = LED_FLASH_SLOW;
 101   1                      AD1_1 = 0;
 102   1                      AD1_2 = 0;
 103   1                      AD1_3 = 0;
 104   1                      AD1_Flag = 0;
 105   1                      RTC_Counter_LED= 0;
 106   1                      AD_Flag = 0;
 107   1                      average = 10;
 108   1                      Pre_Charge_Status = 0;
 109   1                      Constant_Current_Charge = 0;
 110   1                      Constant_Voltage_Charge = 0;
 111   1                      RTC_Counter_Minute = 0;
 112   1                      Battery_On_Socket = 1;
 113   1                      AD_Convert_Speed = 10;
 114   1                      //-----------------------------------------------
 115   1                      //初始化 RTC 用于定时器
 116   1                      //-----------------------------------------------
 117   1                      WDCON &=0xE0; //关闭 WDT
C51 COMPILER V7.50   CHONGDIANQI                                                           03/12/2009 16:20:17 PAGE 3   

 118   1                      RTCH = 0x01; //设置RTC为16bit, 大约8.9ms
 119   1                      RTCL = 0xFF;
 120   1                      RTCCON = 0x63; //启用RTC, 使用内部 RC
 121   1                      EWDRT = 1; //启用 RTC/WD 中断
 122   1                      //-----------------------------------------------
 123   1                      //初始化 T0 用于 PWM
 124   1                      //-----------------------------------------------
 125   1                      TMOD |= 0x02; //Set T0 mode 6
 126   1                      TAMOD |= 0x01; //For PWM, 0x01
 127   1                      TH0 = 255; //Duty cycle = 256 - TH0, for 5v input, set initial charge current very small
 128   1                      AUXR1 |= 0x10; //Enable toggling pin P1.2
 129   1                      TR0 = 1; //Enable T0
 130   1                      //----------------------------------------------------------------------
 131   1                      //Enable the A/D Converter and use the CPU clock as the A/D clock.
 132   1                      //----------------------------------------------------------------------
 133   1                      ADMODA = 0x10; //AD1 single mode no boundary interrupt
 134   1                      ADMODB = 0x40; //AD "40" for CCLK/3, 7.3728/3=2.4576M. "60" for CLK = CCLK/4, 1.8432M, ADC MODE
 135   1                      ADINS = 0xE0; //Enable AD11,AD12,AD13
 136   1                      ADCON1 = 0x04; //Enable AD1 with timer no start occurs mode, no completed & boundary interrupt
 137   1              }
 138          //***************************************************************************
 139          //* ad_convert()
 140          //* Description : AD转换控制
 141          //***************************************************************************
 142          void ad_convert ()
 143                  {
 144   1                      uchar temp = 0;
 145   1                      ADCON1 |= 0x01; //启用AD转换
 146   1                      while( !(ADCON1 & 0x08) ); //等待AD转换结果
 147   1                      ADCON1 &= ~0x08;
 148   1                      if( average-- == 0) // 每隔10S输出一次转换结果,第一判断以下--
 149   1                              {
 150   2                                      AD1_1 = AD1_1/10;
 151   2                                      AD1_2 = AD1_2/10;
 152   2                                      AD1_3 = AD1_3/10;
 153   2                                      average = 10;
 154   2                                      //-----------------------------------------------
 155   2                                      //AD11 用于检测电池电压
 156   2                                      //-----------------------------------------------
 157   2                                      if( AD1_1 > 176 ) // If Vout > 4.6v
 158   2                                              { // 为防止电池损坏或没插插头

⌨️ 快捷键说明

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