//用于测试电压的 用的单片机是 STC15F408AS
#include <reg51.h>
#include<intrins.h>
void Display(unsigned int num);//用于数码管显示具体数字 显示0到9直接用相应的数字做参数,显示1到9 加个点 用1到9乘以10做参数 0加一个点用11做参数
void Display_num(unsigned int num,unsigned char weizhi); // 用于确认那个数码管显示数字。 第一参数num是要显示的数字, 第二个参数weizhi是要在哪个数码管显示(最左边为1,最右边为4)
void Delay1ms(); //@12.000MHz
void delay_n_ms(unsigned int n);//延时n毫秒函数
void Delay1us(); //@12.000MHz
void delay_n_us(unsigned int n);//延时微秒函数
unsigned int a; //保存模数转换后的数据
sfr P2M0=0x96; //声明 P2引脚模式寄存器
sfr P3M0=0xb2; //声明 P3引脚模式寄存器
sfr P1ASF=0x9D; //声明 P1口模拟功能寄存器 p1.7开启模拟功能
sfr ADC_RES=0xBD; //声明 ADC转换结果寄存器
sfr ADC_CONTR=0xBC;//声明 ADC控制寄存器
sbit DA=P2^4; //数码管每个引脚
sbit DB=P3^2;
sbit DC=P3^6;
sbit DD=P2^0;
sbit DE=P2^1;
sbit DF=P2^3;
sbit DG=P3^5;
sbit DP=P3^7;
sbit B1=P2^5; //四个数码管的引脚定义 用于控制哪个数码管亮
sbit B2=P2^2;
sbit B3=P3^3;
sbit B4=P3^4;
void main()
{
unsigned int i;//用于存储临时数据
P2M0=0x1B; //需要高电平大电流的引脚 2.4、2.3、2.1、2.0,填入数值0001 1011
P3M0=0xE4; //需要高电平大电流的引脚 3.7、3.6、3.5、3.2,填入数值1110 0100
B1=B2=B3=B4=0;
while(1)
{
delay_n_ms(2);
P1ASF=0x80;
ADC_CONTR=0X88+7;
a=ADC_RES;
a=a*100;
i=a/5100;
//显示个位
if (i==0) //如果是零点几伏就显示 零点
{
Display_num(11,3);
}
else
{
Display_num(i*10,3);
}
delay_n_us(20);
//显示十分位
i=a%5100/510;
Display_num(i,4);
delay_n_us(10);
}
}
void Display(unsigned int num) //显示0到9直接用相应的数字做参数,显示1到9 加个点 用1到9乘以10做参数 0加一个点用11做参数
{
switch(num)
{
case 0:
{
DA=0; DB=0; DC=0; DD=0; DE=0; DF=0; DG=1; DP=1; //显示0
break;
}
case 1:
{
DA=1; DB=0; DC=0; DD=1; DE=1; DF=1; DG=1; DP=1; //显示1
break;
}
case 2:
{
DA=0; DB=0; DC=1; DD=0; DE=0; DF=1; DG=0; DP=1; //显示2
break;
}
case 3:
{
DA=0; DB=0; DC=0; DD=0; DE=1; DF=1; DG=0; DP=1; //显示3
break;
}
case 4:
{
DA=1; DB=0; DC=0; DD=1; DE=1; DF=0; DG=0; DP=1; //显示4
break;
}
case 5:
{
DA=0; DB=1; DC=0; DD=0; DE=1; DF=0; DG=0; DP=1; //显示5
break;
}
case 6:
{
DA=0; DB=1; DC=0; DD=0; DE=0; DF=0; DG=0; DP=1; //显示6
break;
}
case 7:
{
DA=0; DB=0; DC=0; DD=1; DE=1; DF=1; DG=1; DP=1; //显示7
break;
}
case 8:
{
DA=0; DB=0; DC=0; DD=0; DE=0; DF=0; DG=0; DP=1; //显示8
break;
}
case 9:
{
DA=0; DB=0; DC=0; DD=0; DE=1; DF=0; DG=0; DP=1; //显示9
break;
}
case 10:
{
DA=1; DB=0; DC=0; DD=1; DE=1; DF=1; DG=1; DP=0; //显示1加个点
break;
}
case 11:
{
DA=0; DB=0; DC=0; DD=0; DE=0; DF=0; DG=1; DP=0; //显示0 加个点
break;
}
case 20:
{
DA=0; DB=0; DC=1; DD=0; DE=0; DF=1; DG=0; DP=0; //显示2 加个点
break;
}
case 30:
{
DA=0; DB=0; DC=0; DD=0; DE=1; DF=1; DG=0; DP=0; //显示3 加个点
break;
}
case 40:
{
DA=1; DB=0; DC=0; DD=1; DE=1; DF=0; DG=0; DP=0; //显示4 加个点
break;
}
case 50:
{
DA=0; DB=1; DC=0; DD=0; DE=1; DF=0; DG=0; DP=0; //显示5 加个点
break;
}
case 60:
{
DA=0; DB=1; DC=0; DD=0; DE=0; DF=0; DG=0; DP=0; //显示6 加个点
break;
}
case 70:
{
DA=0; DB=0; DC=0; DD=1; DE=1; DF=1; DG=1; DP=0; //显示7 加个点
break;
}
case 80:
{
DA=0; DB=0; DC=0; DD=0; DE=0; DF=0; DG=0; DP=0; //显示8 加个点
break;
}
case 90:
{
DA=0; DB=0; DC=0; DD=0; DE=1; DF=0; DG=0; DP=1; //显示9 加个点
break;
}
default :
{
DA=1; DB=1; DC=1; DD=1; DE=1; DF=1; DG=1; DP=1; //全灭
break;
}
}
}
void Display_num(unsigned int num,unsigned char weizhi)
{
switch(weizhi)
{
case 1:
{
B1=1; B4=B2=B3=0;
Display(num);
break;
}
case 2:
{
B2=1; B1=B3=B4=0;
Display(num);
break;
}
case 3:
{
B3=1; B1=B2=B4=0;
Display(num);
break;
}
case 4:
{
B4=1; B1=B2=B3=0;
Display(num);
break;
}
}
}
void Delay1us() //@12.000MHz
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay_n_us(unsigned int n) //延时n毫秒函数
{
while(n)
{
Delay1ms();
n=n-1;//每循环一次n减小1
}
}
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delay_n_ms(unsigned int n) //延时n毫秒函数
{
while(n)
{
Delay1ms();
n=n-1;//每循环一次n减小1
}
}复制代码