📄 mainprog.lst
字号:
C51 COMPILER V8.06 MAINPROG 02/13/2009 09:29:07 PAGE 1
C51 COMPILER V8.06, COMPILATION OF MODULE MAINPROG
OBJECT MODULE PLACED IN MainProg.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE MainProg.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 水6月15日 47吨 每吨2.93共137.7元
3 卫生费24 电共1088,每度0.49元,共1088*0.49=533元。
4 */
5
6 #include <intrins.h> //含_nop_()函数
7 #include "SM5964reg.h"
8 #include "OS_CFG.H"
9 #include "NewType.h"
10 #include "SerialNewType.h"
11 #include "ht1621.h"
12
13 //****************************************************************************//
14 //注意在SerialNewType.h中修改摘机振铃次数(pick_ring_times)供北京铁通使用。 //
15 //注意如果需要将程序改为拨9次电话不锁机在os_cfg.h中修改CALL9_LOCK_LINE //
16 //****************************************************************************//
17 //定义版本号常量
18 unsigned char code Versoin[]={"070723"};
19 //中断用全局变量
20 bit ADC0_open=0; //adc0打开控制
21 bit ADC1_open=1; //adc1打开控制
22 bit ADC2_open=0; //adc2打开控制
23 bit ADC3_open=1; //adc3打开控制
24
25 unsigned char timer0_interrupt_counter;
26 unsigned int ADC_result_intr; //adc结果
27 unsigned int ADC_result_intr0;
28 unsigned int ADC_result_intr1;
29 unsigned int ADC_result_intr2;
30 unsigned int ADC_result_intr3;
31 unsigned long ADC1_accumulate_intr; //1通道累加值
32 unsigned int ADC2_accumulate_intr; //2通道累加值
33 unsigned int ADC3_accumulate_intr; //3通道累加值
34 unsigned char ADC2_counter_intr; //adc计数
35 unsigned char ADC3_counter_intr; //adc计数
36
37 //主程序使用变量
38 unsigned long idata ADC1_accumulate; //1通道累加值
39
40 unsigned int ADC_result1,ADC_result2,ADC_result3; //adc结果
41
42 float ADC0_coefficient; //adc系数
43 float ADC1_coefficient; //adc系数
44 float ADC2_coefficient; //adc系数
45 float ADC3_coefficient; //adc系数
46 float idata charge; //累加电荷量
47 float start_votage; //充电起始电压
48 float Curent_Votage; //当前电压
49 float Votage; //电压值
50 float current; //电流记录
51 float Capacitance; //电容
52 float resistance;
53
54 unsigned char chip_connect; //芯片是否连接
55 unsigned char timer0_10ms=0;
C51 COMPILER V8.06 MAINPROG 02/13/2009 09:29:07 PAGE 2
56 unsigned char timer0_0d1s=0;
57 unsigned char timer0_1s=0;
58 bit flag_1ms_adc=0;
59 bit flag_10ms_1=0;
60 bit flag_0d1s=0;
61 bit flag_1s_1=0;
62 unsigned int resistance_measure_1ms=0;
63
64 unsigned char data Mesure_state; //侧量状态
65 unsigned int data Mesure_counter_10ms; //侧量计数
66 unsigned char data disp_flag; //动态显示电压标志
67 unsigned char data stop_flag; //停止测试标志
68 unsigned char data second; //秒
69 unsigned char data minute; //分钟
70 unsigned char data hour; //小时
71
72 unsigned char Display_state=0;
73 unsigned char RefreshDisplay_1s=0;
74 unsigned char MAX_SP=0;
75 #define timer0_counter_start 65536-(25000/4)*5 +20;
76
77 extern bit Ti; //Ti=1,串口准备好,可以发送数据
78 extern bit SendBufFullFlag; //发送缓冲区满标志
79 bit RefreshDisplay_0d1s;
80
81 void main()
82 {
83 1
84 1 //初始化硬件设置。
85 1 //WDTC = 0x87; //5964打开看门狗。复位周期限约4秒钟。
86 1 WDTC = 0x3f; //stc89le516打开看门狗。复位周期限约4.5秒钟。
87 1
88 1 //初始化定时器及串口。
89 1 IP = 0x02; //T0为高级中断
90 1 TMOD = 0x21; //定时器0设为方式1,定时器1设为方式2。
91 1 //(方式1:16位计数结构。方式2:8位重置)
92 1 //TL0 = 0x00; //普通定时器初值。14745600Hz下,10ms产生一次中断。
93 1 //TH0 = 0xd0; //65536-14745600/1200=0xd000
94 1
95 1 TL0 = 0x00; //12倍速
96 1 TH0 = 0xd0; //65536-14745600/1000=0xc666
97 1
98 1
99 1 TL1 = BAUDRATE9600; //定时器一作为波特率发生器。初值
100 1 TH1 = BAUDRATE9600; //重装值,BAUDRATE38400作为系统默认值。
101 1
102 1 PCON = 0x80; //pcon=#80h时,SMOD=1,波特率加倍;
103 1 //波特率=(2^SMOD)*(振荡频率/[384(256-TH1)]
104 1 SCON = 0x50; //串行口设为方式1,REN=1允许接收。
105 1 //定时器1作为波特率发生器,1个起始位,8个数据位,1个停止位。
106 1 TCON = 0x50; //启动T0,T1。
107 1
108 1 P0=0xff;
109 1 P0M0=0; //P0为普通I/0
110 1 P0M1=0;
111 1
112 1 P1=0xff;
113 1 P1M0=0x0f; //P1.4-01.7推挽输出1,其它为输入
114 1 P1M1=0xf0;
115 1
116 1 P2=0; //各开关均关闭
117 1
C51 COMPILER V8.06 MAINPROG 02/13/2009 09:29:07 PAGE 3
118 1 P3=0xff;
119 1 P3M0=0; //P3为普通I/O输入
120 1 P3M1=0;
121 1
122 1
123 1
124 1 CLK_DIV=0; //时钟分频00=1,01=2,03=4,03=8,04=16,05=32,06=64,07=128
125 1 AUXR=0x80; //d7=1,T0为系统时钟,d6=0,T1为系统时钟/12,d5=0,正常串口波特率
126 1
127 1 //葛同府所写模块初始化函数。
128 1 InitialGeTF();
129 1 InitialHT1621();
130 1 ClearDisplay();
131 1
132 1 timer0_0d1s=0;
133 1 Mesure_state=0;
134 1 disp_flag=1; //动态显示电压
135 1 ADC_coefficient_measure(); //ADC系数计算
136 1 IE = 0x92; //允许T0、串行中断开,开总中断位。
137 1
138 1 while(1)
139 1 {
140 2 //清硬件看门狗。
141 2 CearHardWatchDog();
142 2 Display ();
143 2 //葛同府所写任务调用。
144 2 TaskGeTF();
145 2 //键盘扫描
146 2 JP_SM();
147 2 //电容测量
148 2 Capacitance_Mesure();
149 2 }
150 1 }
151
152 void Timer() interrupt 1
153 {
154 1 //TL0 = 0x1e;
155 1 //TH0 = 0xd0; //14745600Hz下,系统时钟/12,10ms产生一次中断计数器初值为0xd000。
156 1
157 1 TL0 = TL0+0x66;
158 1 TH0 = 0xc6; //14745600Hz下,系统时钟/1,1ms产生一次中断计数器初值为0xc666。
159 1 if (SP <0x20)
160 1 {
161 2 // sp_over_flow=1;
162 2 if (SP>MAX_SP) MAX_SP=SP; //最大堆栈
163 2 }
164 1 if (F12_drv==1) F12_drv=0;
165 1 else F12_drv=1;
166 1
167 1 //0通道转换
168 1 if (ADC0_open==1){ //adc0打开控制
169 2 ADC_CONTR=0xe8+0; //启动AD转换,用最低转换速率
170 2 while ((ADC_CONTR & 0x10)==0) {}
171 2 ADC_CONTR=0xe0+0; //停止AD转换
172 2 ADC_result_intr0 = ADC_HIGH*4;
173 2 ADC_result_intr0 +=ADC_LOW & 0x03; //adc结果
174 2 }
175 1 //1通道转换
176 1 if (ADC1_open==1){ //adc1打开控制
177 2 ADC_CONTR=0xe8+1; //启动AD转换,用最低转换速率
178 2 while ((ADC_CONTR & 0x10)==0) {}
179 2 ADC_CONTR=0xe0+1; //停止AD转换
C51 COMPILER V8.06 MAINPROG 02/13/2009 09:29:07 PAGE 4
180 2 ADC_result_intr1 = ADC_HIGH*4;
181 2 ADC_result_intr1 +=ADC_LOW & 0x03; //adc结果
182 2 ADC1_accumulate_intr +=ADC_result_intr1; //2通道累加值
183 2 }
184 1 //2通道转换
185 1 if (ADC2_open==1){ //adc2打开控制
186 2 ADC_CONTR=0xe8+2; //启动AD转换,用最低转换速率
187 2 while ((ADC_CONTR & 0x10)==0) {}
188 2 ADC_CONTR=0xe0+2; //停止AD转换
189 2 ADC2_accumulate_intr += ADC_HIGH*4;
190 2 ADC2_accumulate_intr +=ADC_LOW & 0x03; //adc结果
191 2 if (++ADC2_counter_intr>=4) {
192 3 ADC2_counter_intr=0;
193 3 ADC_result_intr2=ADC2_accumulate_intr/4; //adc计数
194 3 ADC2_accumulate_intr=0;
195 3 }
196 2 }
197 1 //3通道转换
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -