百度搜索ADC0832 Datasheet便可以免费获取该芯片的权威数据手册。
最重要的是查看它的时序及对应英文词组的意思。
CLK为时钟信号,需要外部输入,可直接与单片机引脚相连
Chip Select(CS):从Timing图中可以看出芯片工作期间要保持低电平
DATA IN(DI):
第一个时钟周期,输入高电平为启动信号
第二个时钟周期,设置输入方式(单端输入/差分输入)
第三个时钟周期,设置具体通道
第四个时钟周期,将DI拉高,使主机处于接收状态,准备接收
具体的通道设置如图:
DATA OUT (DO):8位的采样数据先从高位到低位输出,然后最低位复用,在从倒数二位输出只最高位,共15位数据(bit7–>bit0–>bit7)
除此之外,在第1,2,3周期DI配置通道,DO位TRI-STATE,在4-19周期,DO输出数据,DI处于DONT CARE状态。因此在实际的应用中,这两个引脚可以连在单片机的一个网络标号下。
Proteus原理图:
仿真结果:
程序:IODEFINE.H MAIN.H DELAY.C ADC0832.C MAIN.C
1.IODEFINE.H
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51#ifndef _IODEF_H_ #define _IODEF_H_ #include<REG52.H> #include <INTRINS.H> #include <ABSACC.H> #define uchar unsigned char #define uint unsigned int #define segA P1_4 #define segB P1_5 //用74HC139节省IO资源 #define LED P1_1 sbit P0_0 = P0^0; sbit P0_1 = P0^1; sbit P0_2 = P0^2; sbit P0_3 = P0^3; sbit P0_4 = P0^4; sbit P0_5 = P0^5; sbit P0_6 = P0^6; sbit P0_7 = P0^7; sbit P1_0 = P1^0; sbit P1_1 = P1^1; sbit P1_2 = P1^2; sbit P1_3 = P1^3; sbit P1_4 = P1^4; sbit P1_5 = P1^5; sbit P1_6 = P1^6; sbit P1_7 = P1^7; sbit P2_0 = P2^0; sbit P2_1 = P2^1; sbit P2_2 = P2^2; sbit P2_3 = P2^3; sbit P2_4 = P2^4; sbit P2_5 = P2^5; sbit P2_6 = P2^6; sbit P2_7 = P2^7; sbit P3_0 = P3^0; sbit P3_1 = P3^1; sbit P3_2 = P3^2; sbit P3_3 = P3^3; sbit P3_4 = P3^4; sbit P3_5 = P3^5; sbit P3_6 = P3^6; sbit P3_7 = P3^7; #endif
2.MAIN.H
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#ifndef _MAIN_H #define _MAIN_H /*--------------------------------------------*/ #include "iodefine.h" //自定义内容 /*--------------------------------------------*/ #define DELAY #define ADC0832 /*--------------------------------------------*/ #ifdef DELAY #define DELAY_MS_US void delay_ms(uint xms); void delay_us(uint Xus); #endif /*--------------------------------------------*/ #ifdef ADC0832 void start_ADC0832(void); //启动0832以及设置采样方式 uchar getADC0832_DO(void); //返回采样电压值0-5v void ADC_dataProcess(uchar); //ADC0832采样数据处理,存放在ADC_data[4]中 void ADC_seg7display(); //及显示在数码管 #endif /*--------------------------------------------*/ #endif
3.DELAY.C
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include"main.h" #ifdef DELAY_MS_US void delay_ms(uint xms) { uint loop; for (loop = 0; loop < xms; loop++) { /* 1ms_code 误差 +0.306315ms/2000ms */ uchar i, j; _nop_(); i = 2; j = 195; do { while (--j); } while (--i); } } /*--------------------------*/ void delay_us(uint Xus) { uint i,j; for(i=0;i<8;i++){ for(j=0;j<Xus;j++){ _nop_(); } } } #endif
4.ADC0832.C
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114#include "main.h" #ifdef ADC0832 extern uchar code SEG7_yin[]; static uint ADC_data[4] = {0}; //存放采样数据的各个位,便于数码管显示 #define CS_LOW P1_7 //ADCS #define CLK P3_4 //ADCLK #define DI_DO P1_6 //DIO #define led P1_1 void start_ADC0832() { CS_LOW = 1; CLK = 0; delay_us(2); //未上电//第零个周期 CS_LOW = 0; CLK = 0; DI_DO = 1; //START//第一个周期 delay_us(2); CLK = 1; delay_us(2); CLK = 0; DI_DO = 0; //DIF差分输入方式//第二个周期 delay_us(2); CLK = 1; delay_us(2); CLK = 0; DI_DO = 0; //CH0 + CH1 - //第三个周期 delay_us(2); CLK = 1; delay_us(2); CLK = 0; DI_DO = 1; delay_us(2); //MUX SETTING TIME } uchar getADC0832_DO(void) //返回采样电压值 { uchar i,dat = 0,redat = 0; for ( i = 0; i < 8; i++) { CLK = 1; delay_us(2); CLK = 0; delay_us(2); dat = (dat << 1)|(uchar)DI_DO; } for ( i = 0; i < 8; i++) { redat = redat | ((uchar)DI_DO << i); CLK = 1; delay_us(2); CLK = 0; delay_us(2); } CS_LOW = 1; //使能端禁止 return (dat == redat)? dat : 0; //校验正确则输出 } void ADC_dataProcess(uchar beforeDat) { uint afterDat,qian,bai,shi,ge; afterDat = (double)beforeDat / 51 * 1000; qian = afterDat / 1000; bai = (afterDat % 1000) / 100; shi = (afterDat % 100) / 10; ge = afterDat % 10; ADC_data[0] = qian; ADC_data[1] = bai; ADC_data[2] = shi; ADC_data[3] = ge; } void ADC_seg7display() { P0 = 0; P0 = SEG7_yin[ADC_data[0]]+0x80; //P0 = SEG7_yin[0]; segB = 0; segA = 0; delay_us(100); P0 = 0; P0 = SEG7_yin[ADC_data[1]]; //P0 = SEG7_yin[1]; segB = 0; segA = 1; delay_us(100); P0 = 0; P0 = SEG7_yin[ADC_data[2]]; //P0 = SEG7_yin[2]; segB = 1; segA = 0; delay_us(100); P0 = 0; P0 = SEG7_yin[ADC_data[3]]; //P0 = SEG7_yin[3]; segB = 1; segA = 1; delay_us(100); } #endif
5.主函数(main.c)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13#include "main.h" uchar code SEG7_yin[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; void main(){ start_ADC0832(); ADC_dataProcess(getADC0832_DO()); while(1){ ADC_seg7display(); } }
^^Crystal
最后
以上就是阔达跳跳糖最近收集整理的关于ADC0832的使用的全部内容,更多相关ADC0832内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复