📄 module.lst
字号:
C51 COMPILER V3.20, SN-0 MODULE 07/11/02 14:13:20 PAGE 1
DOS C51 COMPILER V3.20, COMPILATION OF MODULE MODULE
OBJECT MODULE PLACED IN MODULE.OBJ
COMPILER INVOKED BY: D:\QTH8052F\BIN\C51.EXE MODULE.C OBJECTEXTEND DB SB
stmt level source
1 /* module.c
*
* main program
* only for AD7710 module
* 2002/3/28
*/
7
8 #include "type.h"
9 #include <reg52.h>
10 #include <intrins.h>
11
12 #include "version.h"
13 #include "link.h"
14 #include "sja.h"
15 #include "ad7710.h"
16 #include "watchdog.h"
17 #include "delay.h"
18 #include "exp.h"
19
20
21
22
23
24
25 /*==================================================================
Main
==================================================================*/
28
29 /*数据采集是双缓冲的,采集的数据放在ad_val和cool_temp中,
而外部读取的是在ad_val_bk和cool_temp_bk中。这为保证了数据
的一致性,并且对数据进行修正成为可能。*/
32 UINT ad_val[2];/* 2 channels */
33 UINT cool_temp;
34
35 UINT ad_val_bk[2];
36 UINT cool_temp_bk;
37
38
39 BYTE cool_temperature[2];/*将cool_temp_bk中的值转换成实际值*/
40 /*实际室温值=
cool_temperature[1] +
cool_temperature[0]/16.0 */
43
44 static BYTE reset_flag = 0;/*复位信号。非0时系统将复位*/
45
46
47 /*对AD7710的两个通道的设定参数存放在下面的结构中*/
48 struct ad7710_ch ad7710_channel[2]={{1,7,1,0x07,0xD0},{1,7,1,0x07,0xD0}};
49
50
51 /*
*
*/
54 void data_sample()/*采集AD数据和室温数据*/
55 {
C51 COMPILER V3.20, SN-0 MODULE 07/11/02 14:13:20 PAGE 2
56 1 /* attention: gain range is 0~7 */
57 1
58 1 /* self calibration,channel number,scale,unipolar,50Hz
cutoff = 10 000 000/(512*50) = 0x0186
*/
62 1
63 1 /* ---------------channel 0--------------- */
64 1 set_mode(0,&ad7710_channel[0]);
65 1 /*wait 100 ms for new value available*/
66 1
67 1 ad_val[0]=read_ad();
68 1
69 1 /* ---------------channel 1-------------- */
70 1 set_mode(1,&ad7710_channel[1]);
71 1
72 1 /*wait 100 ms for new value available*/
73 1
74 1 ad_val[1]=read_ad();
75 1
76 1
77 1 /*-------------------------*/
78 1 cool_temp = read_ds_data();
79 1
80 1 }
81 /*将数据拷贝到后备缓冲区中,并且修正以供外部取用*/
82 void cp_temp()
83 {
84 1 EA=0;
85 1 ad_val_bk[0]=ad_val[0];
86 1 ad_val_bk[1]=ad_val[1];
87 1
88 1 cool_temp_bk=cool_temp;
89 1
90 1 /*修正*/
91 1
92 1 /*转换*/
93 1 cool_temperature[0] = cool_temp_bk;
94 1 cool_temperature[1] = (cool_temp_bk >> 8)&0x0f;
95 1
96 1 EA=1;
97 1 }
98
99
100 void main()
101 {
102 1 BYTE p0val;
103 1 BYTE baud;
104 1 /* disable interrupt */
105 1 EA=0;
106 1
107 1 /* P0~P3 port */
108 1
109 1 /* set interrupt */
110 1 IE=0x01;
111 1 IP=0x01;
112 1 TCON=0x01;/* falling_edge */
113 1
114 1 /* read address */
115 1 HC245G = 0;
116 1 p0val = P0;
117 1 HC245G = 1;
C51 COMPILER V3.20, SN-0 MODULE 07/11/02 14:13:20 PAGE 3
118 1
119 1
120 1 /* reset watch dog and do some read/write */
121 1 init_watchdog();
122 1
123 1 /* SJA init and send first frame*/
124 1 CANCS=1;/* select sja */
125 1 switch(p0val&0xc0){
126 2 case 0x00:
127 2 baud=0xc3;
128 2 break;
129 2 case 0x40:
130 2 baud=0xc9;
131 2 break;
132 2 case 0x80:
133 2 baud=0xd3;
134 2 break;
135 2 case 0xc0:
136 2 baud=0xe7;
137 2 break;
138 2 }
139 1 init_sja(p0val&0x3f,baud);
140 1
141 1 /* init 7710 */
142 1
143 1
144 1 /* open external interrupt */
145 1 EA=1;
146 1
147 1 /* initial end */
148 1
149 1 /* normal working cycle */
150 1 do{
151 2 clear_watchdog();
152 2
153 2 /* TODO: Add your code here */
154 2 data_sample();/* update our data */
155 2 cp_temp();
156 2
157 2 if(reset_flag){/*等待复位*/
158 3 reset_flag = 0;/*清复位信号*/
159 3 while(1){}
160 3 }
161 2 }while(1);
162 1 }
163
164 /* 命令帧中断处理函数 */
165 void sja_receive_int() interrupt 0 using 0
166 {
167 1 BYTE i;
168 1 BYTE reg;
169 1 BYTE can_status;
170 1
171 1 EA=0; /*disable all external interrupts*/
172 1
173 1 reg=read_sja(4);
174 1 write_sja(4,0x00);
175 1 can_status=receive();
176 1 read_sja(3);
177 1
178 1 if(can_status==0x00)/* is command frame */
179 1 {
C51 COMPILER V3.20, SN-0 MODULE 07/11/02 14:13:20 PAGE 4
180 2 BYTE ch = RXdata[3];
181 2
182 2 for(i=0;i<=4;i++){
183 3 TXdata[i]=RXdata[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -