致敬 我爱萝丽,做数显的舵机测试仪
致敬 我爱萝丽,做数显的舵机测试仪数码管其实就是很多个发光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);
[*]
[*] //…………
[*] //…………试着自己添加显示其他数字的程序
[*]
[*]
[*]
[*]
[*]
[*] }
[*]}
复制代码
#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);
//…………
//…………
}
} #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转换的程度 看帖回帖是美德!:lol 很简单嘛,不过我不会 谢谢分享 代码不会 谢谢!学习一下,学习一下 谢谢!学习一下,学习一下 特别想做一个,要是直接有固件就好了 咱新手,弄不了代码,铬铁还是可以的 谢谢!学习一下! 各位是要程序吗?看看我这个能用不 博主的图纸可以发份不,HEX文件是否可以分享一份。 脑瓜疼! 新人报道 发表于 2021-3-4 09:20
各位是要程序吗?看看我这个能用不
这个对应的电路图是那个,也一并发上来可以吗?
谢谢楼主论坛有你更精彩! 着手搞起来,也发个贴 为了存币,看帖必回 为了存币,看帖必回 airwolf001 发表于 2021-1-9 16:07
#include
sfr P2M0=0x96; //声明 P2引脚模式寄存器
学习啦!!!!!
页:
[1]
2