|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 我是天才 于 2016-12-15 22:20 编辑
萝莉电压表程序改版,将adc转换数据变为电压!
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
接线:由于使用了数组,所以需要一个完整的P口(即Px.0到Px.7全都有)先百度到四位数码管的原理图,数码管的a段接P0.0,b段接P0.1......以此类推,位选可以按照程序的定义来修改,在此就不做过多讲解了。如果是使用的stc15w408的话,可以选一个完整的p口,将段选接上,在显示时将P0改为对应的P口就好了
萝莉大神的程序讲的既简单有明了,在电压表制作课程中留下了一个作业,将adc转化为电压,楼主尽自己的微薄之力,将程序改了一下,变成了可以显示电压表,转化过程全是自己的理解,如有不正确的地方欢迎指出,共同进步。在程序中还注明了改变量程的方法,大家可以自行改变量程
引入新知识:u8 code led1[]={};新定义了一个数组,里面存上数字0到9的字模,将0到9字模编码,通过改变中括号里的值来改变显示哪一位,例如P0=led1[a];如果a的值为2,则Po=0xA4,即10100100,由于实用的是共阳数码管,所以遇到0的数码管的段位亮,于是就显示出2,下面的b和c同理,只不过b位是带小数点的,这样可以精确到小数点后一位
没有电压时显示00.0v
手机电池03.7v
像往常一样,下面奉上程序:
- #include<reg51.h>
- #define u8 unsigned char
- #define u16 unsigned int
- sbit L1=P2^7; //数码管引脚可自行更改
- sbit L2=P2^6;
- sbit L3=P2^5;
- sbit L4=P2^4;
- sfr P2M0=0x96; //P2引脚模式寄存器
- sfr P1ASF=0x9D; //P1模拟功能寄存器
- sfr ADC_RES=0xBD; //ADC转换结果寄存器
- sfr ADC_CONTR=0xBC; //ADC控制寄存器
- u8 a,b,c,d;
- u16 adc;
- u8 show;
- u16 dc;
- void Delay4ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 47;
- j = 174;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay50us() //@12.000MHz
- {
- unsigned char i, j;
- i = 1;
- j = 146;
- do
- {
- while (--j);
- } while (--i);
- }
- u8 code led1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
- //不带小数点
- u8 code led2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,};
- //带小数点
- //这个程序适用于共阳数码管,如果是按照萝莉大神的教程做的共阴数码管
- // 只需将led1[],led2[],code里的数模改成共阴的即可
- main()
- {
- P2M0=0xf0; //强推挽 11110000, 2.7, 2.6, 2.5, 2.4脚为强推挽模式
- a=b=c=d=0;
- show=0;
- L1=L2=L3=L4=0;
- while(1)
- {
- Delay4ms();
- show++;
- if(show>4)
- {show=0;}
- P1ASF=0x80;
- ADC_CONTR=0x8f; // adc 实际电压
- Delay50us(); // 256 5v
- adc=ADC_RES; // 158 3.1v
- // adc dc
-
- adc=adc*1; //将1改成2、3等等,即可获得量程为5v的2、3的倍数,此时测量电路则需使用电阻分压,即测量外接电压的1/2,1/3等等
- adc=adc*5; // 按照上面的数据,以单片机供电电压作为基准电压,将adc乘以基准电压5再对adc做如下运算即可得出实际电压
- dc=adc*10/256+adc*10%256/256; //将adc乘以10,如果外接3.1v,那么转化结果是31v,在第二个数码管加一个小数点显示的就是3.1v
-
- a=dc/100; //十位
- b=dc%100/10; //个位
- c=dc%10; //小数位
- if(show==0) //显示: X X . X v
- {
- L1=1,L2=0,L3=0,L4=0;
- P0=led1[a];
- }
- if(show==1)
- {
- L1=0,L2=1,L3=0,L4=0;
- P0=led2;
- }
- if(show==2)
- {
- L1=0,L2=0,L3=1,L4=0;
- P0=led1[c];
- }
- i
- if(show==3) //第四位显示“V”
- {
- L1=0,L2=0,L3=0,L4=1;
- P0=0xc1;
- }
- }
- }
|
| |