airwolf001 发表于 2021-1-9 15:51:33

致敬 我爱萝丽,做数显的舵机测试仪

致敬 我爱萝丽,做数显的舵机测试仪






数码管其实就是很多个发光LED,排列成一个“8”字形,控制数码管跟我们之前学习的点亮LED完全一样,只是原来是点亮一个,现在要点亮4*8=32个!


知识点(46)数码管结构

数码管的结构很简单,8个LED构成一个数字。如果想要显示“3”,只需要让A、B、C、D、G为高电平(引脚11、7、4、2、5),其余引脚为低电平即可。



单片机的引脚图:



先写一个小程序,让数字从0到9自动变化起来吧:


[*]#include<reg51.h>
[*]
[*]sfr P2M0=0x96;   //声明 P2引脚模式寄存器
[*]sfr P3M0=0xb2;   //声明 P3引脚模式寄存器
[*]
[*]
[*]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 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
[*]      }
[*]}
[*]
[*]
[*]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
[*]
[*]      B1=0;
[*]      B2=0;
[*]      B3=0;
[*]      B4=0;//四个数码管都显示
[*]
[*]
[*]      while(1)
[*]      {
[*]                DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;//显示“0”
[*]                delay_n_ms(500);                //延时0.5秒
[*]
[*]                DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;//显示“1”
[*]                delay_n_ms(500);
[*]
[*]                DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;//显示“2”
[*]                delay_n_ms(500);
[*]
[*]                DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;//显示“3”
[*]                delay_n_ms(500);
[*]
[*]                //…………
[*]                //…………试着自己添加显示其他数字的程序
[*]
[*]
[*]
[*]
[*]
[*]      }
[*]}

复制代码



airwolf001 发表于 2021-1-9 15:53:00

#include<reg51.h>

sfr P2M0=0x96;   //声明 P2引脚模式寄存器
sfr P3M0=0xb2;   //声明 P3引脚模式寄存器


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


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
      
      B1=0;
      B2=0;
      B3=0;
      B4=0;//四个数码管都显示
      
      
      while(1)
      {
                DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;//显示“0”
                delay_n_ms(500);                //延时0.5秒
               
                DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;//显示“1”
                delay_n_ms(500);
               
                DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;//显示“2”
                delay_n_ms(500);
               
                DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;//显示“3”
                delay_n_ms(500);               
               
                                        DA=0;DB=0;DC=1;DD=0;DE=0;DF=1;DG=1;DP=0;//显示“4”
                delay_n_ms(500);   
                                       
                                        DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;//显示“5”
                delay_n_ms(500);
                                       
                                        DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;//显示“6”
                delay_n_ms(500);   
                                       
                                        DA=1;DB=1;DC=1;DD=0;DE=0;DF=1;DG=0;DP=0;//显示“7”
                delay_n_ms(500);   
                                       
                                        DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;//显示“8”
                delay_n_ms(500);   
                                       
                                        DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;//显示“9”
                delay_n_ms(500);   
                                       
                //…………
                //…………
      
      
      
               
      }
}

airwolf001 发表于 2021-1-9 16:07:21

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


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
      
      
      while(1)
      {
                delay_n_ms(4);//系统周期4ms
               
                P1ASF=0x80;//设置P1.7引脚
                ADC_CONTR=0x88+7;//开始P1.7引脚转换
                Delay50us();   //等待AD转换完成
                adc=ADC_RES;//读取转换结果
               
                Data1=0;
                Data2=adc/100;          //百位数据
                Data3=adc%100/10; //十位数据
                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位数据
                }
                        
               
      }
}

以上是AD转换的程度

笑笑生 发表于 2021-1-10 16:20:05

看帖回帖是美德!:lol

新人报道 发表于 2021-1-11 06:18:19

很简单嘛,不过我不会

大海201079 发表于 2021-1-11 15:54:52

谢谢分享   代码不会

lcr24502 发表于 2021-1-20 15:17:54

谢谢!学习一下,学习一下

wx6289 发表于 2021-1-22 17:47:27

谢谢!学习一下,学习一下

haokanma77 发表于 2021-1-24 21:51:19

特别想做一个,要是直接有固件就好了

haokanma77 发表于 2021-1-24 21:52:51

咱新手,弄不了代码,铬铁还是可以的

大漠游民 发表于 2021-3-1 10:20:00

谢谢!学习一下!

新人报道 发表于 2021-3-4 09:20:20

各位是要程序吗?看看我这个能用不

wjhmike 发表于 2021-4-18 15:32:09

博主的图纸可以发份不,HEX文件是否可以分享一份。

moyouzhiba-lg 发表于 2021-4-21 08:47:47

脑瓜疼!

摸吧 发表于 2021-12-13 17:33:07

新人报道 发表于 2021-3-4 09:20
各位是要程序吗?看看我这个能用不

这个对应的电路图是那个,也一并发上来可以吗?

独行者 发表于 2021-12-14 00:57:18

谢谢楼主论坛有你更精彩!

wwee128 发表于 2022-1-8 09:05:57

着手搞起来,也发个贴

zpy88 发表于 2022-1-23 16:24:40

为了存币,看帖必回

卢东玲 发表于 2022-4-3 11:59:47

为了存币,看帖必回

飞龙在天苏 发表于 2022-5-15 21:26:36

airwolf001 发表于 2021-1-9 16:07
#include

sfr P2M0=0x96;   //声明 P2引脚模式寄存器


学习啦!!!!!
页: [1] 2
查看完整版本: 致敬 我爱萝丽,做数显的舵机测试仪