找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2251|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机的数字电压表(分享文件)

[复制链接]
跳转到指定楼层
楼主
大家好:
          希望我的资料能帮助你

1,实物图片


2,原理图及PCB


3,手工制作PCB

4,程序
#include<reg52.h>//头文件
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int//宏定义
uchar code table[]=
{
   0xc0,0xf9,0xa4,0xb0,0x99,
   0x92,0x82,0xf8,0x80,0x90,
}; //共阳数码管段码表 没有小数点 0~9
uchar code table1[]=
{
0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10
};//带小数点的编码     0~9
sbit ADCCLK=P1^0;//ADC0832时钟端
sbit DI=P1^1;//ADC0832数据输入
sbit DO=P1^1;//ADC0832数据输出,输入输出共用P1.1
sbit ADCCS=P1^2;//ADC0832片选端
uchar dat=0;//AD值
uchar count=0;//定时器计数
uchar CH=0;//通道变量
uint num,ge,xiao1,xiao2,shi,shi1,ge1,xiao3,xiao4;
uint dy=0;
/**********************************************************/
/***********************************************************
初始化函数
***********************************************************/
void init()
{
TMOD=0x01;//定时器0工作方式1
TH0=0;//赋初值
TL0=0;
EA=1;//开总中断
TR0=1;//启动定时器0
ET0=1;//开定时器0中断
}
/*********************************************************
延时函数
**********************************************************/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
     for(b=110;b>0;b--);
}
/**************************************************
AD转换函数
***************************************************/
uint ADC0832()
{
uint i,test,adval;
adval=0;
test=0;
ADCCS=0; //选通ADC0832,CS使能端保持低电平并保持低电平直到转化完全结束
_nop_(); //延时
ADCCLK=1;//第一个脉冲的上升沿
_nop_(); //延时
DI=1;   //第一个脉冲下降沿之前DI必须是高电平,ADC0832转换启动信号
ADCCLK=0;//第一个脉冲的下降沿
_nop_(); //延时
ADCCLK=1;//第二个脉冲的上升沿
_nop_(); //延时
  if(CH==0)//DI输入先后输入1,0。选通CH0通道
    {
     DI=1;//第二个脉冲下降之前送人通道选择第二位
     ADCCLK=0;//第二个下降沿
     _nop_();
     ADCCLK=1;//第三个脉冲上升沿
      _nop_();
     DI=0;   //第三个脉冲下降沿之前送入通道选择第3位
     ADCCLK=0;//第三个脉冲的下降沿
      _nop_();
     ADCCLK=1;//开始第四个脉冲
     _nop_();
    }
   else    //选通CH1通道
    {
      DI=1;   //第二个脉冲下降沿之前送通道选择的第一位
     ADCCLK=0; //第二个下降沿
     _nop_();
     ADCCLK=1; //第三个脉冲的上升沿
      _nop_();
     DI=1;//第三个脉冲的下降沿之前送通道通道选择的第二位  
     ADCCLK=0;//第三个脉冲的下降沿
     _nop_();
     ADCCLK=1;//开始第四个脉冲
     _nop_();
    }
   ADCCLK=0;//第四个脉冲的下降沿
    DO=1;
    for(i=0;i<8;i++)//读取前八位
    {
        _nop_();
        adval<<=1;
        ADCCLK=1;
        _nop_();
        ADCCLK=0;
        if(DO)
           adval|=0x01;
        else
           adval|=0x00;
}
    for(i=0;i<8;i++)//读取后八位
    {
        test>>=1;
        if(DO)
           test|=0x80;
        else
           test|=0x00;
         _nop_();
        ADCCLK=1;
        _nop_();
        ADCCLK=0;
    }
    if(adval==test)//比较前8位与后8位的数值,如果不相同,舍去
        dat=test;
    _nop_();
    ADCCS=1;//释放ADC0832
    DO=1;
    ADCCLK=1;
    return dat;
}
/*******************************************************
数据转换函数
********************************************************/
void convdata(uint i)//数据转换函数
{
shi=i/51;//十位,8位AD,0-255对应0-5V,例如:AD得到的数据是1000 0000,即128。128/51=2.509,可见i/51,就可以得到十位
ge=(i%51)*10/51;//小数点后一位,i(例如128)用51取余数,等于26,26*10/51=5,就得到个位
xiao1=((i%51)*10%51)*10/51;//小数点后两位
dy=abs(shi*100+ge*10+xiao1-0          ///3 后改成0的
)*4;//硬件电路中,用4个10k电阻串联,取其中一个电阻电压,总电压就是4倍,测量范围变宽了,但是精度降低了。
         //-3是矫正值
shi1=dy/1000;
ge1=dy%1000/100;
xiao2=dy%100/10;
xiao3=dy%10;
}
/********************************************************
显示函数
********************************************************/
void display()
{
P2=0xfe;
if(shi1==0)
{
P0=0xff;
}
else
P0=table[shi1];
delay(5);
P2=0xfd;
P0=table1[ge1];//带小数点
delay(5);
P2=0xfb;
P0=table[xiao2];
delay(5);
P2=0xf7;
P0=table[xiao3];
delay(5);
P2=0xff;
}
/*********************************************************
主函数
**********************************************************/
void main()
{
init();
while(1)
    {
     convdata(dat);
     display();
    }
}
/***************************************************
中断服务函数
*****************************************************/
void T0_time() interrupt 1
{
TH0=0x00;//赋初值
TL0=0x00;
num++;
if(num==10)
    {
     num=0;
     dat=ADC0832();
    }
}


5,压缩包里有更详细的教程及源文件  谢谢观赏

数字电压表.rar

8.8 MB, 下载次数: 29, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表