📄 chongdianqi.lst
字号:
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 + -