3300178839 发表于 2016-12-3 12:22:39

学习,学习。。。好教程要顶起来!!!!!!!!!!!!!!

长寿烙铁 发表于 2016-12-3 20:57:30

你好,我想自制一个简易微型万用表,具有常用的简单功能,可以挂在钥匙上,偶尔用一下。
我的单片机是20脚的12c5608ad,为了减少接口和缩小体积,想用一个数码管依次显示几位数字。

使用小型锂电池供电,电压3.5到4.2v。
基本功能为:直流电压-2到10v -20到100v,二极管压降0到3v,电阻0到3k。
电压接口并联蓝色发光管作为限压保护,压降2.7v,反向用4148,压降0.6v。
基本测量范围-1到2.5v,用431产生1v作为基准,以便能够测量电压极性。
单片机输出pwm产生1ma恒流,为测量二极管和电阻提供电流,使电阻测量比较准确。

枫飞秋语 发表于 2016-12-3 22:43:26

我爱萝丽爱萝丽 发表于 2016-12-3 03:34
46 在十二章

收到,马上补上~!

我爱萝丽爱萝丽 发表于 2016-12-3 23:05:50

长寿烙铁 发表于 2016-12-3 20:57
你好,我想自制一个简易微型万用表,具有常用的简单功能,可以挂在钥匙上,偶尔用一下。
我的单片机是20脚 ...

这么复杂,哪里还叫简易……测个电压电流还算简单,电阻二极管就不推荐搞了

panlongdian 发表于 2016-12-3 23:41:14

我爱萝丽爱萝丽 发表于 2016-12-3 23:05
这么复杂,哪里还叫简易……测个电压电流还算简单,电阻二极管就不推荐搞了 ...

支持老师,等知识慢慢积累到一定程度自然就懂了。先做电流电压的。

panlongdian 发表于 2016-12-3 23:49:34

长寿烙铁 发表于 2016-12-3 20:57
你好,我想自制一个简易微型万用表,具有常用的简单功能,可以挂在钥匙上,偶尔用一下。
我的单片机是20脚 ...

说实在话,我们维修人都希望有个自己diy而又实用的东西,但涉及的知识面太广,难以实现。

my21602 发表于 2016-12-4 00:40:15

萝丽老师,我紧跟这你的教程学习和实验,数码管的后两位数字变化不稳定,有时看不清,这该怎么解决呢?下一步是不是就该讲到了?

海浪淘沙 发表于 2016-12-4 07:51:01

别具一格的教程初学者喜欢

我爱萝丽爱萝丽 发表于 2016-12-4 16:23:07

my21602 发表于 2016-12-4 00:40
萝丽老师,我紧跟这你的教程学习和实验,数码管的后两位数字变化不稳定,有时看不清,这该怎么解决呢?下一 ...

你的电路和程序是否跟例程一样?数码管后两位没问题

长寿烙铁 发表于 2016-12-4 20:26:19

我爱萝丽爱萝丽 发表于 2016-12-3 23:05
这么复杂,哪里还叫简易……测个电压电流还算简单,电阻二极管就不推荐搞了 ...

电路不复杂,我画了测量电路的草图,恒流电路需要试验和调整一下,应该可行。
我对pwm输出还不太懂,还要学习和试验,电阻二极管的测量是比较常用的。

长寿烙铁 发表于 2016-12-4 20:30:04

panlongdian 发表于 2016-12-3 23:49
说实在话,我们维修人都希望有个自己diy而又实用的东西,但涉及的知识面太广,难以实现。 ...

电路不复杂,我画了测量电路的草图,恒流电路需要试验和调整一下,应该可行。

我爱萝丽爱萝丽 发表于 2016-12-4 23:25:36

长寿烙铁 发表于 2016-12-4 20:26
电路不复杂,我画了测量电路的草图,恒流电路需要试验和调整一下,应该可行。
我对pwm输出还不太懂,还要 ...

你还是用最简单的电阻串联分压测量电阻吧,比你这个简单10倍

我爱萝丽爱萝丽 发表于 2016-12-5 00:51:46

my21602 发表于 2016-12-4 00:40
萝丽老师,我紧跟这你的教程学习和实验,数码管的后两位数字变化不稳定,有时看不清,这该怎么解决呢?下一 ...

你应该是没接电位器,显示的电压当然会乱跳

我爱萝丽爱萝丽 发表于 2016-12-5 03:37:29

本帖最后由 我爱萝丽爱萝丽 于 2016-12-27 23:58 编辑

1.3 项目规划

上次说到如何把ADC转换结果转换为电压,这个算法应该中学生都会:(前提是单片机5V要准)
电压x      adc
————= ———
    5V         255
所以电压x=adc/255*5=adc/51。假设adc=128,x=2.5。
不过要注意,由于单片机没有小数点,你要是想精确到小数点后,需要把adc扩大10倍,x=25,显示时再补上小数点。

思考题:a=29*10/10; 与 b=29/10*10; 有什么区别?
表面上好像一样,实际上大不相同!
a=29*10/10 =290/10 =29;
b=29/10*10 =2*10 =20;
由于单片机的除法会损失精度,所以必须先乘后除。

学了新知识,就要学以致用。本期的项目就是要做一个实用的小电压表。


根据已学到的知识,你起码可以完成的最低要求:
单片机使用稳压5V或3.3V供电,测量一路0~5V或0~3.3V电压。


中等要求:
单片机稳压供电,用10k、10k电阻分压,量程增加2倍。
增加数码管显示小数点功能。


扩展要求:
多路不同量程电压测量,自动切换显示或按键切换……
使用10位ADC或多次测量求平均值等方法提高精度……





一个实现中等要求的小程序:#include<reg51.h>

sfr P2M0=0x96;   //声明 P2引脚模式寄存器
sfr P3M0=0xb2;   //声明 P3引脚模式寄存器
sfr P1ASF=0x9D;    //声明 P1口模拟功能寄存器
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;


unsigned char display_time;      //定义变量用于显示次数

unsigned char Data1;      //第一个数码管要显示的数据
unsigned char Data2;      //第二个数码管要显示的数据
unsigned char Data3;      //第三个数码管要显示的数据
unsigned char Data4;      //第四个数码管要显示的数据

unsigned char count;      //计时
unsigned int adc;          //AD转换计算


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
      }   
}

void Delay50us()                //@12.000MHz
{
      unsigned char i, j;

      i = 1;
      j = 146;
      do
      {
                while (--j);
      } while (--i);
}

void display(unsigned char x)//控制数码管显示内容的函数
{
      //判断x的值来决定显示什么
      if(x==0){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;} //显示“0”      
      if(x==1){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“1”      
      if(x==2){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;} //显示“2”      
      if(x==3){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;} //显示“3”
      if(x==4){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=0;} //显示“4”      
      if(x==5){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“5”      
      if(x==6){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“6”      
      if(x==7){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“7”      
      if(x==8){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“8”      
      if(x==9){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“9”
                                                      
      if(x==10){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=1;} //显示“0”带小数点      
      if(x==11){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=1;} //显示“1”带小数点      
      if(x==12){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=1;} //显示“2”带小数点      
      if(x==13){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=1;} //显示“3”带小数点
      if(x==14){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=1;} //显示“4”带小数点      
      if(x==15){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=1;} //显示“5”带小数点      
      if(x==16){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=1;} //显示“6”带小数点
      if(x==17){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=1;} //显示“7”带小数点      
      if(x==18){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=1;} //显示“8”带小数点
      if(x==19){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=1;} //显示“9”带小数点
}


main()
{
      P2M0=0x1B;                //需要高电平大电流的引脚 2.4、2.3、2.1、2.0,填入数值0001 1011
      P3M0=0xE4;                //需要高电平大电流的引脚 3.7、3.6、3.5、3.2,填入数值1110 0100
      
      P1ASF=0x80;//设置P1.7引脚为模拟功能
      
      while(1)
      {
                delay_n_ms(4);//系统周期4ms
               
                count=count+1;
                if(count>125)//0.5秒测量一次电压
                {
                        count=0;
                        
                        ADC_CONTR=0x88+7;//开始P1.7引脚转换
                        Delay50us();   //等待AD转换完成
                        adc=ADC_RES;//读取转换结果
                        
                        adc=adc*2;      //量程增大倍数
                        adc=adc*10/51;//计算电压*10倍,消除小数点                        
                        
                        Data1=0;
                        Data2=adc/100;          //百位数据
                        Data3=adc%100/10; //十位数据
                        Data3=Data3+10;   //加10,display函数显示的数字会带小数点
                        
                        Data4=adc%10;   //个位数据      
                }
               
               
                ///////////////////////////////////////////////////////
                //显示程序模块化,只需要改变Data1/2/3/4的值就可以控制显示内容
               
                display_time=display_time+1;
                if(display_time>3)
                {
                        display_time=0;//0、1、2、3 四个循环
                }
               
                if(display_time==0)//第0次显示第一个数码管
                {
                        B1=0;B2=1;B3=1;B4=1;      
                        display(Data1);                //显示第1位数据
                }
               
                if(display_time==1)//第1次显示第二个数码管
                {
                        B1=1;B2=0;B3=1;B4=1;      
                        display(Data2);                //显示第2位数据
                }
               
                if(display_time==2)//第2次显示第三个数码管
                {
                        B1=1;B2=1;B3=0;B4=1;      
                        display(Data3);                //显示第3位数据
                }
               
                if(display_time==3)//第3次显示第四个数码管
                {
                        B1=1;B2=1;B3=1;B4=0;      
                        display(Data4);                //显示第4位数据
                }
                        
               
      }
}



我是天才 发表于 2016-12-5 05:57:14

本帖最后由 我是天才 于 2016-12-5 06:08 编辑

大神,看看我的转化方法行不?
http://www.moz8.com/thread-82795-1-1.html我有认真完成作业哟~嘿嘿

hangmw 发表于 2016-12-5 08:28:29

好东西啊!顶!!!!!!!!

我爱萝丽爱萝丽 发表于 2016-12-5 14:11:15

我是天才 发表于 2016-12-5 05:57
大神,看看我的转化方法行不?
http://www.moz8.com/thread-82795-1-1.html我有认真完成作业哟~嘿嘿 ...

注意要先乘后除,不然损失精度

长寿烙铁 发表于 2016-12-5 21:06:02

我爱萝丽爱萝丽 发表于 2016-12-4 23:25
你还是用最简单的电阻串联分压测量电阻吧,比你这个简单10倍

恒流电路主要用于二极管测量,并且可以测量电阻。

下面是我用旧仪表改的简易数字万用表
旧仪表电路由测量芯片7106和7660升压电路组成,可用锂电池供电。
改成简易万用表,实现常用功能0.2V 20V 200V。

增加用431组成的1ma恒流电路,测量元件的压降或电阻。
还可以增加一个电阻丝,测量2A电流。

跟你学习了一些单片机知识,我感觉单片机功能强大,应该能够实现这些功能,并且实现小型化。

我是天才 发表于 2016-12-5 21:28:19

我爱萝丽爱萝丽 发表于 2016-12-5 14:11
注意要先乘后除,不然损失精度

嗯,已经改了,

我是天才 发表于 2016-12-5 23:51:57

楼主讲解下怎样才能两路adc转换呗?比如说p1.7和P1.6一起转换,得到的数据分别保存为adc1和adc2
页: 1 2 [3] 4 5 6
查看完整版本: 第十三课:扩展课!电压变成数字