模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

8190查看 | 25回复

[开源教程] 交作业——萝莉电压表&舵机测试仪 二合一

[复制链接]
发表于 2016-12-15 22:18:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 我是天才 于 2016-12-16 21:24 编辑

一直跟着罗丽大神学编程,今晚终于有时间编程了,交一个作业——电压表&舵机测试仪  二合一;   新增一个按键来切换模式,程序没有什么新内容,都是前面的内容的罗列,所以注释不是很详细,程序如下      


       接线方法:电压表接P1.6,舵机测试仪接P1.7


  • #include<reg51.h>
  • #include<intrins.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;
  • sbit out=P2^3;
  • sbit Key=P1^0;                          //按键
  • 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,dc;
  • u8 show;           //数码管显示
  • u16 ppm;
  • u16 count;          //每过1ms加一,每过20ms归零,ppm周期20ms
  • u8 mode;        //模式选择
  • bit Key_old;        //记录按键过去高低电平
  • void Delay10us()                //@12.000MHz
  • {
  •         unsigned char i;
  •         _nop_();
  •         _nop_();
  •         i = 24;
  •         while (--i);
  • }
  • void delay_n_10us(u16 n)
  • {
  •    while(n)
  •    {
  •      Delay10us();
  •          n--;
  •    }
  • }
  • void Delay50us()                //@12.000MHz
  • {
  •         unsigned char i, j;
  •         i = 1;
  •         j = 146;
  •         do
  •         {
  •                 while (--j);
  •         } while (--i);
  • }
  • void Delay1ms()                //@12.000MHz
  • {
  •         unsigned char i, j;
  •         i = 12;
  •         j = 169;
  •         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,};
  •                                           //带小数点
  • void Perform()                   //数码管显示
  • {
  •            L1=L2=L3=L4=0;
  •           if(show==0)                                
  •           {
  •             L1=1,L2=0,L3=0,L4=0;
  •                 P0=led1[a];
  •           }
  •           if(show==1)
  •           {
  •             L1=0,L2=1,L3=0,L4=0;
  •                 if(mode==0)P0=led1; //在模式0下,第二位数码管不显示小数点
  •                 if(mode==1)P0=led2; //在模式1下,第二位数码管显示小数点
  •           }
  •           if(show==2)
  •           {
  •             L1=0,L2=0,L3=1,L4=0;
  •                 P0=led1[c];
  •           }
  •           if(show==3)
  •           {
  •             L1=0,L2=0,L3=0,L4=1;
  •                 if(mode==0)P0=0x8c;        //在模式0下,数码管最后一位显示P
  •                 if(mode==1)P0=0xc1;        //在模式1下,数码管最后一位显示V
  •           }
  • }
  • main()
  • {        
  • P2M0=0xf0;                          //初始化
  • a=b=c=d=0;
  • show=0;
  • count=0;
  • L1=L2=L3=L4=0;
  • Key_old=1;
  • mode=0;
  •    while(1)
  •    {
  •           Delay1ms();
  •          if(Key==1)                 //按键按下
  •           {
  •             if(Key_old==0)
  •              {mode++;}        //模式加1
  •                   }
  •          Key_old=Key;
  •                 if(mode>1)           //模式大于1,模式归零
  •                 {mode=0;}
  •           count++;
  •            show++;
  •          if(show>3)                //数码管显示大于3,显示归零
  •                  {show=0;}
  •                     Perform();           //显示
  •         if(mode==0)                                //模式0:舵机测试仪
  •          {
  •           if(count>20)
  •        {
  •               count=1;
  •             P1ASF=0x40;
  •             ADC_CONTR=0x8e;                //adc转换引脚选择 000~111代表P1.0-P1.7        
  •             Delay50us();                                
  •             adc=ADC_RES;
  •                  ppm=adc*100/256+100;
  •                  a=ppm/100;
  •                  b=ppm%100/10;
  •                  c=ppm%10;
  •              out=1;
  •                  delay_n_10us(ppm);
  •                  out=0;
  •            }
  •              }        
  •          if(mode==1)                 //模式1:电压表
  •          {
  •           P1ASF=0x80;
  •           ADC_CONTR=0x8f;                                //         adc           实际电压
  •           Delay50us();                                        //         256                5v
  •           adc=ADC_RES;                                        //         158                3.1v
  •                                                                    //          adc                        dc
  •                   adc=adc*3;          //将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;                  //小数位
  •          }
  •    }
  • }





发表于 2022-4-8 15:08:56 | 显示全部楼层
好,谢谢楼主的 分享。
回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-8 14:20:45 | 显示全部楼层
厉害!我也想变厉害!交作业——萝莉电压表&amp;舵机测试仪  二合一 电压表,萝莉,罗丽 作者:ggssccmyzb 5843
回复 支持 1 反对 0

使用道具 举报

发表于 2021-6-19 08:51:31 | 显示全部楼层
拿分走人,感谢楼主的奉献
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-25 10:38:07 | 显示全部楼层
电路怎么接 ,如何显示啊
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-28 22:43:34 | 显示全部楼层
帮顶。。。。只看到数字。。。。
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-26 21:32:15 | 显示全部楼层

你电路图没..............................
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-26 21:02:39 | 显示全部楼层
你电路图没..............................
回复 支持 1 反对 0

使用道具 举报

发表于 2016-12-15 23:48:37 | 显示全部楼层
高人一筹
发表于 2016-12-16 00:11:48 | 显示全部楼层
学习了,。。
发表于 2016-12-16 03:05:38 | 显示全部楼层
未来的大神
发表于 2016-12-16 08:28:50 | 显示全部楼层
电阻分压是两个10K吗? 是不是接P1.7引脚?   希望能做一个小数点后保留两位数的电压表,精度差不多了
发表于 2016-12-16 08:36:57 | 显示全部楼层
未来的大神未来的大神
发表于 2016-12-16 08:52:29 | 显示全部楼层
没有实物图啊?
发表于 2016-12-16 10:25:52 | 显示全部楼层
拿分走人,感谢楼主的奉献
发表于 2016-12-16 13:02:27 | 显示全部楼层
6666666666666666666666666666666666
发表于 2016-12-16 16:19:34 | 显示全部楼层
路过,顶一个
 楼主| 发表于 2016-12-16 21:21:30 | 显示全部楼层
阿文先生 发表于 2016-12-16 08:28
电阻分压是两个10K吗? 是不是接P1.7引脚?   希望能做一个小数点后保留两位数的电压表,精度差不多了 ...

程序是adc乘3 ,所以量程是15v,需要三个电阻分压,舵机测试仪的引脚接1.7,电压表引脚接1.6
 楼主| 发表于 2016-12-16 21:25:07 | 显示全部楼层
Dk. 发表于 2016-12-16 08:52
没有实物图啊?

我以前的帖子有
发表于 2017-5-19 08:28:21 | 显示全部楼层
好帖,必须顶。。。
发表于 2017-8-16 20:22:40 | 显示全部楼层
学习,学习,学习,
发表于 2018-5-19 00:24:20 | 显示全部楼层
路过,再顶一个交作业——萝莉电压表&amp;舵机测试仪  二合一 电压表,萝莉,罗丽 作者:addison88 2165 交作业——萝莉电压表&amp;舵机测试仪  二合一 电压表,萝莉,罗丽 作者:addison88 5526
回复 支持 反对

使用道具 举报

发表于 2018-5-20 00:18:32 | 显示全部楼层
我也做了一个
回复 支持 反对

使用道具 举报

发表于 2018-5-24 23:14:53 | 显示全部楼层
顶起 谢谢楼主分享交作业——萝莉电压表&amp;舵机测试仪  二合一 电压表,萝莉,罗丽 作者:addison88 8916 交作业——萝莉电压表&amp;舵机测试仪  二合一 电压表,萝莉,罗丽 作者:addison88 5533
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!