【Proteus仿真】自动量程(范围<10V)切换数字电压表

【Proteus仿真】自动量程(范围<10V)切换数字电压表


  • 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
#include<reg52.h>
unsigned char code dispbitcode[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管断码
unsigned char dispbuf[4];
unsigned int i;
unsigned int j;
unsigned int getdata;
unsigned int temp;
unsigned int temp1;
unsigned char count;
unsigned char d;
sbit ST=P2^4;
sbit OE=P2^5;
sbit EOC=P2^6;
sbit CLK=P2^7;
sbit ADD_A=P3^4; //选择AD的输入端
sbit ADD_B=P3^5;
sbit ADD_C=P3^6;
sbit D0=P2^0; //数码管的位控制端
sbit D1=P2^1;
sbit D2=P2^2;
sbit D3=P2^3;
sbit P17=P1^7; //确定小数点的位置
sbit s1=P3^2;
sbit s2=P3^3;
#define \_v0\_5 {s1=1;s2=0;}
#define \_v10 {s1=0;s2=1;}


unsigned char m;

void TimeInitial();
void Delay(unsigned int i);

/\*定时器1初始化函数\*/
void TimeInitial()
{ TMOD=0x10;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
EA=1;
ET1=1;
TR1=1;
}
/\*延时函数\*/
void Delay(unsigned int i)
{
unsigned int j;
for(; i>0; i--)
{
for(j=0; j<125; j++)
{;}
}
}
/\*数码管显示函数\*/
void Display()
{
P1=dispbitcode[dispbuf[3]];

D0=0;
D1=1;
D2=1;
D3=1;
Delay(10);
P1=0x00;

P1=dispbitcode[dispbuf[2]];
if(m==2)
{
P17=1;
}
D0=1;
D1=0;
D2=1;
D3=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[1]];
if(m==10)
{
P17=1;
}
D0=1;
D1=1;
D2=0;
D3=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[0]];
D0=1;
D1=1;
D2=1;
D3=0;
Delay(10);
P1=0x00;
}
void main()
{
TimeInitial();
ADD_A=0;
ADD_B=0;
ADD_C=0;
_v10;
m=2;
while(1)
{


ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
if ((s1==0) && (s2==1) && (getdata<6))
{
ADD_A=1;
_v0_5;

m=10;
}
else if ((s1==1)&&(s2==0) && (getdata>254))
{
ADD_A=0;
_v10;

m=2;
}


temp=(getdata\*1.0/255)\*500\*m;
dispbuf[0]=temp%10;
dispbuf[1]=temp/10%10;
dispbuf[2]=temp/100%10;
dispbuf[3]=temp/1000;
Display();

}
}

void t1(void) interrupt 3 using 0
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
CLK=~CLK;
}

仿真资源和程序源码

1
2
3
链接:https://pan.baidu.com/s/12-rNBvoMRujGYpEN550fEQ 
提取码:986e