1. C51单片机的数码管(带小数点)哪一位对应哪一段
一般是从上面一横(8位的最低位)开始,顺时针转abcdef再一间一横为g,小数点为最高位。
2. 51单片机低四位数码管位选不影响高四位
什么是单片机?怎样学习单片机?这是单片机初学者的灵魂拷问。
下面以我个人经验来总结一下单片机入门容易掉的3个坑
第一个坑,我们传统的讲法是一开始就讲单片机内部结构,什么运算器、控制器、寄存器、RAM、ROM 、IO口等等,这种想法没有错,但是,我认为也不是很对,因为对于大多数初学者是听不懂的,反而增加了畏难情绪,甚至还容易带坑里去。
第二个坑,把二进制和单片机天然联系在一起,学到的是单片机,认识二进制,这对于已经入门的朋友来说不要紧,你可以这样理解,但是对于门外的同学,我认为这也是往坑里带,我们同学就会一直纠结,它就怎么认识二进制了呢?从本质上讲,二进制和单片机没有任何关系,所以在这里我要给单片机初学者一个忠告,同学们,忘掉二进制吧,只有忘掉二进制你才能重新开始并真正理解单片机。
第三个坑,几乎100%的学校是将C语言,单片机作为两门独立课程开设的,这人为增加的难度,非计算机专业的学习C语言都应该放到单片机环境中去学习。
很多初学者想学习单片机,但是却不知道怎么入门,该从何学起。
其实学习单片机可从以下四个阶段开展入门学习
第一阶段,学会C语言的常用语法,熟悉51单片机开发平台、软件keil的操作,了解单片机的大概原理特性,能读懂按键、数码管、跑马灯、串口的简单程序,能熟悉几个常用的外围芯片驱动。
第二阶段,这个阶段是四个阶段中最重要的阶段,很多初学者完成了第一阶段的学习,真正去面对一个小项目的时候还是无从下手,它们不知道按键、显示、通讯、应用程序之间是如何关联起来的,一旦遇到多任务项目的时候,不知道如何并行处理,它们最缺的是程序的框架思路,网上有很多热心牛人分享的程序框架思想都值得大家学习和借鉴,就是用定时中断计时,再用四位置豫剧来实现多任务的切换。
第三阶段,大家在做项目时,除了写单片机的软件,还不可避免地要跟整个电路的硬件打交道,掌握一些常用的硬件电路知识就显得尤其重要。电阻、电容、电感、二极管、三极管的应用,电压差和参考地的关系,常见的变压整流电路、常见的外围驱动电路等等,这方面优秀的电子基础教程很多,大家应该主动找这方面的资料来学习学习。
第四阶段,有了前面三个阶段的主动学习和积累,就可以去做项目了。在项目中学习,根据工作的需要来选择学习哪个厂家的单片机,根据工作的需要来决定是否需要学习汇编语言。有一些厂家的单片机并不能用C语言开发,只能用汇编语言。根据工作的需要来深入研究相关行业所需的硬件电路知识,根据工作的需要来学习相关的外围芯片驱动程序。以上就是新手入门学习单片机的四个阶段。
喜欢的帮忙收藏点个赞哦,文章内容仅代表个人观点,不喜勿喷,谢谢大家的支持与鼓励!
学习单片机,我华维林北是认真的,童鞋们有什么疑问都可以来找我,及时回复林北能得到非常实用的干货资料,能帮助辅导大家学到一些单片机相关知识而成长,华维林北会得到很大的满足感!好了,这期就说到这,我们下期见!
华维林北
3. 51单片机数码管显示8位二进制数程序,第6、7位永远都只显示0,其他位显示正常。
MOV 26H,20H ;二进制数第6位送26H单元
MOV 20H,A
RR A
ANL 20H,#01H
MOV 27H,20H ;二进制数第7位送27H单元
这26H,27H是保存第6,7位数据的,但是延时慧粗子程序又用顷闹26H,27H单元了,延时结束,这两个单元永远是0了。
DELAY: MOV 26H,#4 ;延时服务子程序
DLY1: MOV 27H,#250
DJNZ 27H,$
DJNZ 26H,DLY1
RET
这延时子程序要用29H,2AH,两个单元就好雀碧罩了,还不如用R4,R5更方便呢,也不会出错。这样的
DELAY: MOV R4,#4 ;延时服务子程序
DLY1: MOV R5,#250
DJNZ R5,$
DJNZ R4,DLY1
RET
这多好哇
4. 51单片机怎么控制四位数码管,有没有汇编程序我只能控制两位!求详解!
display:;显厅丛团示子程序
mov dptr,#numtab;送数据表
mov a,a_bit;送个位
movc a,@a+dptr;查表
mov p1,a;送p0显示 30
setb p3.7;选中第一个数码管
lcall d1ms;显示1ms
cpl p3.7;关显示
mov a,b_bit;送10位数据 35
movc a,@a+dptr;查表
mov p1,a;送p0显示
setb p3.5;选中第2个数码管
acall d1ms;显示1ms
cpl p3.5;关显扮橘示
mov a,c_bit;送100位数据
movc a,@a+dptr;查表
mov p1,a;送p0显示
setb p3.3;选中第3个数码管
acall d1ms;显示1ms 45
cpl p3.3;关显示
mov a,d_bit;送1000位数据郑盯
movc a,@a+dptr;查表
mov p1,a;送p0显示
setb p3.2;选中第3个数码管 50
acall d1ms;显示1ms
cpl p3.2;关显示
mov a,e_bit;送10000位数据
movc a,@a+dptr;查表
mov p1,a;送p0显示 55
setb p3.1;选中第3个数码管
acall d1ms;显示1ms
cpl p3.1;关显示
mov a,f_bit;送100位数据
movc a,@a+dptr;查表 60
mov p1,a;送p0显示
setb p3.0;选中第3个数码管
acall d1ms;显示1ms
cpl p3.0;关显示
ljmp c6
这个是我从我的IO驱动LCD中移植来的6位显示
5. 51单片机6位数码管显示时间
C51单片机六位数码管时钟
用数码管dot分隔时分秒
用三个按键设置时间:
SET键:小时设定->分钟设定->结束设定,小时设定状态时表示小时的两位数码管闪烁,分钟设定时表示分钟的两位数码管闪烁
CHANGE键:在小时设定状态和分钟设定状态改变数值
SET S键:秒置零
C语言代码:
//main.c
#include <REGX52.H>
typedef unsigned int UINT ;
typedef unsigned char UCHAR ;
#define KEY P2
#define KEYMASK 0x07
sbit LE1 = P2^6; //定义位控口
sbit LE2 = P2^7; //定义段控口
UCHAR KeyPressDown = 0x00;
UCHAR KeyRelease = 0x00;
UCHAR LastKey = 0x00;
UCHAR MODE ;
extern UCHAR HH;
extern UCHAR MM;
extern UCHAR SS;
extern bit T_CYCLE ;
extern void T0_Init(void); //初始化定时器,函数定义在Timer.c
UCHAR code NUM[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(UINT t) //延时t时钟周期
{
while (t--) ;
}
void H_Increase(void) //小时增1
{
if(HH<23) HH++;
else
{
HH = 0;
}
}
void M_Increase(void) //分钟增1
{
if(MM<59) MM++;
else
{
MM = 0;
H_Increase();
}
}
void S_Increase(void) //秒增1
{
if(SS<59) SS++;
else
{
SS = 0;
M_Increase();
}
}
void display(UCHAR SEG,UCHAR Digi) //显示一位数码管,SEG = 0-9数字,Digi = 第0-6位
{
LE2 = 1;
P0 = (0x01<<Digi) ;
LE2 = 0;
P0 = 0x00;
LE1 = 1;
P0 = NUM[SEG];
if (Digi==1||Digi==3) P0 &= 0x7f ; //显示分隔符
delay(50);
P0 = 0xff;
LE1 = 0;
}
void main(void)
{
P0 = 0xff;
LE1 = 0;
LE2 = 0;
T0_Init();
while(1)
{
if(MODE != 1 || T_CYCLE)
{
display(HH/10,0); //显示小时十位数
display(HH%10,1); //显示小时个位数
}
if(MODE != 2 || T_CYCLE)
{
display(MM/10,2); //显示分钟十位数
display(MM%10,3); //显示分钟个位数
}
display(SS/10,4); //显示秒十位数
display(SS%10,5); //显示秒个位数
}
}
void key_Process(void) //按键处理程序
{
UCHAR CurrKey;
KEY |= KEYMASK; //将按键对应的IO设置为输入状态
CurrKey = (~KEY) & KEYMASK;
KeyPressDown = (~LastKey) & CurrKey;
KeyRelease = LastKey & (~CurrKey);
LastKey = CurrKey;
switch(KeyRelease)
{
case 1:
if(MODE == 2) MODE = 0;
else MODE ++;
break;
case 2:
if(MODE == 1) H_Increase() ;
if(MODE == 2) M_Increase() ;
break;
case 4:
SS = 0;
break;
default: break;
}
}
//Timer.c
#include <reg52.h>
typedef unsigned int UINT ;
typedef unsigned char UCHAR ;
UCHAR HH = 14; //小时初始值
UCHAR MM = 2; //分钟初始值
UCHAR SS = 55; //秒初始值
UINT u_10ms = 0; //10ms计数
bit T_CYCLE = 0;
extern void key_Process(void);
extern void S_Increase(void);
void T0_Init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01;
//定时器赋初始值,定时时间为10ms。
TH0 = 0xd8;
TL0 = 0xf0;
TR0 = 1;
IE = 0x82;
}
void T0_INTSrv(void) interrupt 1
{
//定时器重新开始计时。
TH0 = 0xd8;
TL0 = 0xf0;
u_10ms ++;
if (u_10ms%20==0) // 200 ms
{
T_CYCLE = ! T_CYCLE; //闪烁循环
}
if (u_10ms>99) // 1000 ms = 1 second
{
u_10ms = 0;
S_Increase();
}
key_Process(); //SET按键处理
}
Proreus仿真电路:
6. 51单片机数码管显示五位数Z
1,你的数组里面的数有问题,
xx[1]=z/10000;
xx[2]=z%10000/1000;
xx[3]=z%1000/100;
xx[4]=z%100/10;
xx[5]=z%10;
2,全部显示0,也埋李雹可能是你的段位送的顺序有误,如果是锁存器的话,应该先送位,再送段,
你试下,看能不能正常显示。
3,数码管的显扰渣示,必弯帆须的一位一位的来,你想想数码管是动态扫描,不一位一位的送肯定不能正常显示地的。
希望能帮到你。
7. 51单片机静态显示可以实现6位数码管123456的显示吗
多位数码管无法实现静态显示,物理上正备它们就存在冲突。除非每一位显示的内容都相同……
如果执着于用静态显示,行卜可以用6个1位数码管,缺点是需要大量的举带毁管脚来控制(可以用串扩并方案或地址映射扩展方案,成本上得不偿失)。
8. 51单片机控制数码管显示不正常问题,为什么后面4位数码管1234和5678都是显示乱码呢该怎么改
授人以鱼不如授之以渔。先建立程序的一般结构,然后定义一个code数组,里边存放数码管显示0~9的数据,之后定义一个display显示函数,传递参数但不返回参数,然后将传递的参数(1234或5678)分解成4哥单个数,然后依次选择要显示的数码管和数据,紧接消影和简单暂时,这样一个数码管显示就完成了,之后三个跟这个一样。最后在主函数里调用这个显示函数并传递参数。
希望我的回答能帮助到你。