资源说明:#include
2 //#include
3 //#include
4 //#include
5 #define uchar unsigned char
6 #define uint unsigned int
7 //#define DAC0832 XBYTE[0xfffe]
8 /************I/O口定义*********/
9 sbit CS=P2^3; //ADC0832的片选端
10 sbit CLK=P2^2; //时钟端
11 sbit DIO=P2^1; //数据输入输出端
12 sbit up=P2^7;
13 sbit down=P3^0;
14 sbit L1=P2^4;
15 sbit L2=P2^5;
16 sbit L3=P2^6;
17 sbit WR2=P2^0;
18 sbit LED1=P2^7;
19 sbit LED2=P3^7;
20 uint cdi=0x68;
21 uchar key=0;
22 uint ge,dian,xiao1,xiao2;
23 uchar code table[]={ //共阳数码管显示定义
24 0x03,0x9f,0x25,0x0d,
25 0x99,0x49,0x41,0x1f,
26 0x01,0x09};
27 void delay();
28 uint A_D();
29 void display();
30 void DAC();
31 void key_test();
32
33 void delay(uchar i) //i=1延迟1ms
34 {
35 1 uchar a,b,c;
36 1 for(c=i;c>0;c--)
37 1 for(b=142;b>0;b--)
38 1 for(a=2;a>0;a--);
39 1 }
40 /*****
41 *函数名称: void dispaly1()
42 *输入参数: 共0个参数;
43 *输出参数: 共0个参数;
44 *返回值: 无;
45 *需储存的参数: 共0个参数;
46 *功能介绍: 显示电压值
47 *****/
48 void display()
49 {
50 1 P1=table[ge]&0xfe;
51 1 P1=table[ge]&0xfe; //显示整数位,与0x01是为了显示小数点
52 1 L1=1;
53 1 delay(1);
54 1 L1=0;
55 1 P1=table[xiao1]; //显示小数点后第一位
C51 COMPILER V9.01 WENYAYUAN 03/22/2012 13:38:37 PAGE 2
56 1 L2=1;
57 1 delay(1);
58 1 L2=0;
59 1 P1=table[xiao2]; //显示小数点后第二位,
60 1 L3=1;
61 1 delay(1);
62 1 L3=0;
63 1
64 1 }
65
66
67 /*****
68 *函数名称: uchar A_D()
69 *输入参数: 共0个参数;
70 *输出参数: 共0个参数;
71 *返回值: 有;
72 *需储存的参数: 共0个参数;
73 *功能介绍: 采集电压
74 *****/
75 uint A_D()
76 {
77 1 uint dat;
78 1 uchar i;
79 1 CS=1; //一个转换周期开始
80 1 CLK=0; //为第一个脉冲准备
81 1 CS=0; //CS置0,片选有效
82 1 DIO=1; //DIO置1,规定起始信号
83 1 CLK=1; //第一个脉冲
84 1 CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
85 1 DIO=1; //DIO置1,通道选择信号
86 1 CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入
87 1 //两位数据用于选择通道,这里选通道CH1
88 1 CLK=0; //第二个脉冲下降沿
89 1 DIO=1;//DI置1,选择通道1
90 1 CLK=1;//第三个脉冲
91 1 CLK=0;//第三个脉冲下降沿
92 1 DIO=1;//第三个脉冲下沉沿之后,输入端DIO失去作用,应置1
93 1 CLK=1;//第四个脉冲
94 1 for(i=0;i<8;i++) //高位在前,循环8次读出8位数据
95 1 {
96 2 CLK=1; //第四个脉冲
97 2 CLK=0;
98 2 dat<<=1; //将下面存储的低位数据右移
99 2 dat|=(uchar)DIO; //将输出数据DIO通过或运算存储在dat最低位
100 2 }
101 1 CS=1;//片选无效
102 1 return dat;
103 1 }
104
105 void DAC()
106 {
107 1 P0 = cdi;
108 1 WR2=0;
109 1 WR2=1;
110 1 }
111
112 /*****
113 *函数名称: void key_test()
114 *输入参数: 共0个参数;
115 *输出参数: 共0个参数;
116 *返回值: 无;
117 *需储存的参数: 共0个参数;
C51 COMPILER V9.01 WENYAYUAN 03/22/2012 13:38:37 PAGE 3
118 *功能介绍: 键盘扫描程序,采用行反转法对键盘进行扫描,确定键值
119 *****/
120 void key_test()
121 {
122 1 uchar temp=0;
123 1 P3=0x0f;
124 1 if((P3&0x0f)!=0x0f)
125 1 {
126 2 delay(10); //去抖
127 2 if((P3&0x0f)!=0x0f)
128 2 {
129 3 temp=P3;
130 3 P3=0x70;
131 3 temp=temp|P3; //将行列值或即可得到每个键的编码
132 3 switch(temp)
133 3 {
134 4 case 0x3e:key=1;break; //1
135 4 case 0x5e:key=2;break; //2
136 4 case 0x6e:key=3;break; //3
137 4 case 0x3d:key=4;break; //4
138 4 case 0x5d:key=5;break; //5
139 4 case 0x6d:key=6;break; //6
140 4 case 0x3b:key=7;break; //7
141 4 case 0x5b:key=8;break; //8
142 4 case 0x6b:key=9;break; //9
143 4 case 0x37:key=10;break; //*
144 4 case 0x57:key=0;break; //0
145 4 case 0x67:key=11;break; //#
146 4 default:key=12;
147 4 }
148 3 while((P3&0x70)!=0x70); //判断松手检测
149 3 }
150 2 }
151 1 }
152
153
154 void main()
155 {
156 1 uchar i=0,flag=0;
157 1 uint dy;
158 1 uint num=0,num2;
159 1 LED1=1;
160 1 DAC();
161 1 delay(1);
162 1 dy=A_D()*9/5;
163 1 ge=dy/51; // 计算整数部分
164 1 dian=(dy%51)*100/51; //计算小数部分
165 1 xiao1=dian/10; //取小数点后第一位
166 1 xiao2=dian; //去小数点后第二位
167 1 display();
168 1 while(1)
169 1 {
170 2 P3=0x0f;
171 2 if((P3&0x0f)!=0x0f)
172 2 {
173 3 key_test();
174 3 if(key<=9)
175 3 {
176 4 if(flag<3)
177 4 num=num*10+key;
178 4 if(num>=900)
179 4 num=900;
C51 COMPILER V9.01 WENYAYUAN 03/22/2012 13:38:37 PAGE 4
180 4 flag++;
181 4 }
182 3 if(key==10);
183 3 LED1=1;
184 3 if(key==11)
185 3 {
186 4 cdi=(num-126)*21/100;
187 4 DAC();
188 4 delay(1);
189 4 dy=A_D()*9/5;
190 4 ge=dy/51; // 计算整数部分
191 4 dian=(dy%51)*100/51; //计算小数部分
192 4 xiao1=dian/10; //取小数点后第一位
193 4 xiao2=dian; //去小数点后第二位
194 4 num2=ge*100+xiao1*10+xiao2;
195 4 for(i=0;i<5;i++)
196 4 {
197 5 if((num-num2)>1)
198 5 cdi+=1;
199 5 else
200 5 cdi-=1;
201 5 DAC();
202 5 delay(1);
203 5 dy=A_D()*9/5;
204 5 ge=dy/51; // 计算整数部分
205 5 dian=(dy%51)*100/51; //计算小数部分
206 5 xiao1=dian/10; //取小数点后第一位
207 5 xiao2=dian; //去小数点后第二位
208 5 num2=ge*100+xiao1*10+xiao2;
209 5 }
210 4 flag=0;
211 4 key=0;
212 4 ge=num/100; // 计算整数部分
213 4 dian=num0; //计算小数部分
214 4 xiao1=dian/10; //取小数点后第一位
215 4 xiao2=dian; //去小数点后第二位
216 4 num=0;
217 4 LED1=0;
218 4 }
219 3 }
220 2 display();
221 2 }
222 1 }
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。