【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调


  • Proteus仿真
    在这里插入图片描述

示例程序

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
143
144
145
146
147
148
149
150
151
152
153
154
//单片机+ADC0832实现量程0~25V数字电压表的仿真程序
#include<reg51.h>
#include<intrins.h>

sbit CS=P3^5;
sbit CLK=P3^3;
sbit DI=P3^4;
sbit DO=P3^4;
sbit dot=P0^5; //小数点

unsigned char dat=0x00;
unsigned char nums[]={0x00,0x00,0x00,0x00};
unsigned char channel; //转换通道
unsigned char LEDS[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xB8,0x20,0x28}; //共阳4位数码管段码,字符显示从'0'到'9'

unsigned char ADC0832(unsigned char channel) //模数转换
{
unsigned char i;
unsigned char x=0x00;
unsigned char y=0x00;

CLK=0; //初始化
DI=1;
\_nop\_();
CS=0;
\_nop\_();
CLK=1;
\_nop\_();

if(channel==0x00) //通道选择
{ //通道0
CLK=0;
DI=1;
\_nop\_();
CLK=1;
\_nop\_();
CLK=0;
DI=0;
\_nop\_();
CLK=1;
\_nop\_();
}
else //通道1
{
CLK=0;
DI=1;
\_nop\_();
CLK=1;
\_nop\_();
CLK=0;
DI=1;
\_nop\_();
CLK=1;
\_nop\_();
}

CLK=0;
DI=1;
for(i=0;i<8;i++) //读取ADC0832输出的前8位数据
{
x<<=1;
\_nop\_();
CLK=1;
\_nop\_();
CLK=0;
if(DO==1)
{
x|=0x01;
}
else
{
x|=0x00;
}
}
for(i=0;i<8;i++) //读取ADC0832输出的后8位数据
{
y>>=1;
if(DO==1)
{
y|=0x80;
}
else
{
y|=0x00;
}
\_nop\_();
CLK=1;
\_nop\_();
CLK=0;
}
if(x==y) //校验,比较前8位与后8位的值
{
dat=x;
}
\_nop\_();
CS=1; //释放ADC0832
DO=1;
CLK=1;
return dat;
}

void Convert(unsigned char dat0) //数据处理
{
unsigned int x;
x=dat0\*0.0196\*100\*5;
nums[0]=x/1000;
nums[1]=x%1000/100;
nums[2]=x%1000%100/10;
nums[3]=x%1000%100%10;
}

void Delay() //数码管显示
{
unsigned char i,j;
for(i=0;i<1;i++)
{
for(j=0;j<20;j++);
}
}

void Display()
{
P0=LEDS[nums[0]];
P2 =~0xFE;
Delay();
P2 &=0xF0;//消隐

P0=LEDS[nums[1]];
dot=0;
P2 =~0xFD;
Delay();
P2 &=0xF0;

P0=LEDS[nums[2]];
P2 =~0xFB;
Delay();
P2 &=0xF0;

P0=LEDS[nums[3]];
P2 =~0xF7;
Delay();
P2 &=0xF0;
}

void main()
{
while(1)
{
dat=ADC0832(channel);
Convert(dat);
Display();
}
}

程序源码和仿真资源

本实验基于Proteus8.9平台。

1
2
3
链接:https://pan.baidu.com/s/1EF00QBDQLxYRE2aznrXX1A 
提取码:qpbp


人生像攀登一座山, 而找寻出路, 却是一种学习的过程, 我们应当 在这过程中, 学习稳定、 冷静, 学习如何从慌乱中找到生机。 —— 席慕蓉