📄 ad.lst
字号:
C51 COMPILER V8.02 AD 08/31/2007 05:20:24 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE AD
OBJECT MODULE PLACED IN AD.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE AD.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*----------------------------------------------
2 通讯+采集,程序可以使用
3 发送方式与“1”有点不同
4
5 ----------------------------------------------*/
6
7 #include <aduc841.h>
8
9 #define CTH1 0xfd //定时期1,波特率设置9600
10 #define CTL1 0xfd
11
12 #define CTH0 0xee //定时期0,5ms
13 #define CTL0 0x00
14
15 #define uchar unsigned char
16 #define uint unsigned int
17
18 sbit P37=P3^7;
19
20 uint senddata=0;//发送的数据
21 uchar sendbuf[2]={0,0}; //发送的数据缓冲
22 uchar delay1=0; //延时采集
23
24 bit flag1=0; //发送标志
25 uchar sum=0; //采集多次之和
26 uint i=0;
27
28
29 //--------------------------------------------------------
30 uint adc(uchar temp); //ADC采集函数
31 void send(uchar num ,uchar *add); //发送
32 //--------------------------------------------------------
33
34
35 /*------------------------------------------------------
36 发送程序,num为发送字节的个数,add为指向发送数据的指针
37 ------------------------------------------------------*/
38 void send(uchar num ,uchar *add)
39 {
40 1
41 1 for(num=0;num<2;num++)
42 1 {
43 2 SBUF=*(add+num);
44 2 while(TI==0);//等待完毕,为下一次做准备
45 2 TI=0;
46 2 }
47 1 flag1=0;//发送启动标志 */
48 1 }
49
50
51 /*------------------------------------------------------
52 该段程序完成的是,对指定通道的采集,和滤波处理TEMP的值
53 在0~7之间
54 ------------------------------------------------------*/
55 uint adc(uchar chinnels) //通道选择
C51 COMPILER V8.02 AD 08/31/2007 05:20:24 PAGE 2
56 {
57 1 uint da=0,max=0,min=0,count=0;
58 1 long int sum=0;
59 1
60 1 for(count=0;count<1000;count++) //10次采集和滤波
61 1 {
62 2 ADCCON2=chinnels;
63 2 SCONV=1; //单次AD转换使能,“1”有效,转换完后由硬件清零
64 2
65 2 while((ADCCON3&0x80)==0x80); //检测转化是否完毕
66 2
67 2 da=ADCDATAH&0x0f;
68 2 da=(da<<8)+ADCDATAL;
69 2
70 2 sum=sum+da;
71 2
72 2 if(count==1) { max=da;min=da;}
73 2 else if(max<da) max=da;
74 2 else if(min>da) min=da;
75 2 }
76 1
77 1 return (sum-max-min)/998;
78 1 }
79
80
81
82 /*------------------------------------------------------
83 定时期0
84 ------------------------------------------------------*/
85 void time0(void)interrupt 1 //5ms
86 {
87 1 TH0=CTH0;
88 1 TL0=CTL0;
89 1 MDO=1;
90 1 for(i=0;i<2;i++){
91 2 delay1++; //采集时间
92 2 if(delay1>200)
93 2 {
94 3 delay1=0; MDO=0;
95 3 flag1=0;
96 3 senddata=adc(i);
97 3 sendbuf[0]=(senddata&0xf00)>>8;
98 3 sendbuf[1]=senddata&0x0ff;
99 3 flag1=1;}//发送启动标志
100 2 }
101 1
102 1 }
103
104 /*------------------------------------------------------
105 串口发送中断
106 ------------------------------------------------------*/
107 void com1(void)interrupt 4
108 {
109 1 }
110
111
112 /*------------------------------------------------------
113 主程序
114 ------------------------------------------------------*/
115 main()
116 {
117 1 I2CCON=0XFF;
C51 COMPILER V8.02 AD 08/31/2007 05:20:24 PAGE 3
118 1 MDE=1;
119 1 TMOD=0x21; //定时期1设置为方式2(自动添装),定时期0为方式1(16位计数)
120 1
121 1 TH1=CTH1;
122 1 TL1=CTL1;
123 1
124 1 TH0=CTH0;
125 1 TL0=CTL0;
126 1
127 1 SCON=0x50; //串口通讯方式1,“1+8+1”
128 1 PCON=0;
129 1
130 1 TR1=1; //定时器1启动
131 1 TR0=1; //定时器0启动
132 1
133 1 ADCCON1=0x64; //对AD的基本设置
134 1
135 1 MDE=1;
136 1 I2CM=1;
137 1
138 1 RI=0;
139 1 TI=0;
140 1
141 1 ET0=1; //允许定时器0中断
142 1 ES=1; //串口中断允许
143 1 EA=1; //总中断
144 1
145 1 while(1)
146 1 {
147 2 if(flag1==1) //发送启动标志
148 2 {P37=1;MCO=0;MDO=1;
149 3 send(2,&sendbuf[0]);
150 3 P37=0;MCO=1;MCO=0;
151 3 }
152 2 }
153 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 448 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 11
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -