【Proteus仿真】PCF8591 AD电压采集8X8点阵显示

【Proteus仿真】PCF8591 AD电压采集8X8点阵显示


  • Proteus仿真效果
    在这里插入图片描述
  • 采用的是8X8点阵来作为数据显示的,显示精度是小数点后2位,显示方式是轮流显示。
  • 读取的电压范围是:0 ~ 4.98V(滑动电阻在0欧姆是的电压值为最高4.98V,滑动电阻阻值最大时,电压值最低0.)
  • 采用数据锁存器74HC573来驱动显示的。

主程序示例代码

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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

--------------------------------\*/


#include<reg52.h>
#include <I2C.H>
#define uchar unsigned char
#define uint unsigned int


#define PCF8591 0x90 //PCF8591 地址

unsigned char code tab[]= {0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
};
unsigned char code graph[11][8]= {
{0x0,0x18,0x24,0x24,0x24,0x24,0x24,0x18},//0
{0x0,0x8,0x18,0x8,0x8,0x8,0x8,0x8},//1
{0x0,0x18,0x24,0x24,0x8,0x10,0x20,0x3C},//2
{0x0,0x18,0x24,0x4,0x8,0x24,0x24,0x18},//3
{0x0,0x8,0x8,0x18,0x28,0x3C,0x8,0x8},//4
{0x0,0x3C,0x20,0x38,0x4,0x4,0x24,0x18},//5
{0x0,0x18,0x24,0x20,0x38,0x24,0x24,0x18},//6
{0x0,0x3C,0x24,0x4,0x8,0x10,0x10,0x10},//7
{0x0,0x18,0x24,0x24,0x18,0x24,0x24,0x18},//8
{0x0,0x18,0x24,0x24,0x1C,0x4,0x24,0x18},//9
{0x4C,0xD2,0x52,0x52,0x52,0x52,0x52,0xEC},//10
};

unsigned char count;
unsigned char cnta;

unsigned char AD_CHANNEL;
unsigned int D[4];

void delay11(unsigned int cnt)
{
while(--cnt);
}





/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
ADC发送字节[命令]数据函数
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
bit ISendByte(unsigned char sla,unsigned char c)
{
Start\_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(c); //发送数据
if(ack==0)return(0);
Stop\_I2c(); //结束总线
return(1);
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
ADC读字节数据函数
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
unsigned char IRcvByte(unsigned char sla)
{ unsigned char c;

Start\_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)return(0);
c=RcvByte(); //读取数据0

Ack\_I2c(1); //发送非就答位
Stop\_I2c(); //结束总线
return(c);
}

//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
main()
{ unsigned char jj,kk,ll,bb,cc,dd;
double Data; //
double V; //转化成的电压值

while(1)
{
ISendByte(PCF8591,0x40);
Data=IRcvByte(PCF8591); //ADC0 模数转换1
V=Data\*5/256;
D[0]=V\*100;

for(bb=0; bb<10; bb++) {
for(jj=0; jj<8; jj++) //共要扫描八行
{
P1=graph[D[0]/100][jj]; //送字模数据
P2=tab[jj];
delay11(200); //选中第一行
P2=0xff;
delay11(500);
}
delay11(500);
}

for(bb=0; bb<10; bb++) {
for(jj=0; jj<8; jj++) //共要扫描八行
{
P1=0x06;
P2=0x7f;
delay11(500);
P2=0xbf;
delay11(500);
}
delay11(500);
}



for(cc=0; cc<10; cc++) {
for(kk=0; kk<8; kk++) //共要扫描八行
{
P1=graph[D[0]%100/10][kk]; //送字模数据
P2=tab[kk];
delay11(200); //选中第一行
P2=0xff;
delay11(500);
}
delay11(500);
}

for(dd=0; dd<10; dd++)
{
for(ll=0; ll<8; ll++) //共要扫描八行
{
P1=graph[D[0]%10][ll]; //送字模数据
P2=tab[ll];
delay11(200); //选中第一行
P2=0xff;
delay11(500);
}
delay11(500);
}
}
}


程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1IQYZ9810e0Nr3Z\_BnriRMw 
提取码:xtrt