51单片机8个跑马灯程序数码管显示程序

您现在的位置是: &
51单片机的数码管动态显示技术
清远职业技术学院,广东清远511510
摘 要:在实际应用中,单片机的数码管显示一般都用动态显示方式,正确、高效应用数码管动态显示技术是这类设计成功与否的一个关键问题之一。
  摘要:在实际应用中,单片机的数码管显示一般都用动态显示方式,正确、高效应用数码管动态显示技术是这类设计成功与否的一个关键问题之一。
  关键词:单片机;数码管;动态显示;数据
  在信息时代的今天,单片机技术应用越来越广泛,涉及各行各业,也渗透到人们的日常生活之中,如洗衣机、空调、冰箱等的控制系统,就可以用单片机实现。为了让人们很直观的了解相关设备当前的工作状态,很多时候需要将当前的时间、温度、工作程序等状态通过数码管显示出来,这就涉及到单片机的数码管显示技术。
  1 单片机与LED数码管动态显示接口电路
  动态显示方式是将所有数码管的8段按同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,显示数码同时传到每个数码管,但每个瞬时由位选通信号选通一个数码管,即在某一瞬时只有一个数码管显示数据,且显示时间不能太长,一般为1-10MS,依次循环扫描,轮流显示,由于人的视觉滞留效应,人们看到的是多位同时稳定显示。占用I/O端线少,电路较简单,编程较复杂,CPU要定时扫描刷新显示,一般适用于显示位数较多的场合。
  由于动态显示情况下,CPU要定时扫描刷新显示,数码管的信号在不停的通断变化,为了保证显示效果,一般会在数据端口接一个缓冲驱动芯片(如74HC244、74LS244等),而在位选通端接一个PNP三极管作驱动(如等)。(如图1)
  2 单片机控制数码管显示软件设计
  2.1创建显示代码表
  在单片机内部,各种数据都是以二进制的形式存在,但是数码管显示的数据是给人们直接读取的,是根据人们的习惯方式使某些段点亮来直接显示出1、2、3...等,如共阳数码管显示数据1,就要使数码管的b和c两端点亮,则8段代码就为0F9H,这和1的二进制代码01H是不一样,所以数码管的显示代码和二进制不是对应的,必须要建显示代码表。
  在程序设计时一般在显示程序最后定义一个显示代码表,根据数码管是共阴还是共阳,显示代码是不一样的,共阳数码管在应用时公共极COM接+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管在应用时公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
  2.2显示数码转换
  在很多运用单片机进行测量的系统中,通过传感器或A/D转换后的数据只是测量数据,并非显示数据,这些8位二进制测量数据可能包含很多位十进制数信息,因为数码管要显示出十进制信息或十六进制信息,人们才能直接看出结果。所以必须将这些测量数据转换为二进制的显示数据,才能通过查表的方式正确显示直观数据。
  因为8位二进制能表示的范围为0-255,如果测量的数据按权位展开所得的十进制数正好就是我们所需要的十进制数,则可以按照二进制转换为十进制BCD码的方式先将测量数据除以100,所得的商即是十进制数的百位,再用余数除以10,所得的商即为十位,而所得的余数就是个位,将这三位数分别用三个内存单元存储,通过查表指令读出对应的显示代码传给数码管,即可显示3位十进制数据。
  当测量的数据按权位展开所得的十进制数不是我们所需要的十进制数,就必须按照测量的要求,找出实际的数据与测量的数据之间的对应关系来进行转换。如在电压测量系统中,测量范围为0-5V,测量精度为0.02V,这样通过ADC0809转换后的数据就是8位二进制测量数据。这个数据就包含了十进制电压值得个位、十分位和百分位,必须从这8位二进制数据中拆出个位、十分位和百分位的电压值,每一位用一个数码管显示,这样才能直观的读出当前测量的电压值是几点几几伏。
  8位二进制有0-255共256个值,但是电压值却只有0-5V,此时如用二进制直接除以100、10就不能得到正确的结果,必须根据实际情况寻求另外的方法。根据电压测量的范围可以把8位二进制的0和电压的0V对应,而8位二进制的255和电压值的5V对应,这样可以近似的把0-255分成5分,每份分别对应一伏的电压,即255/5=51,每一伏电压用51个二进制值来表示,1/51=0.0196V,即一个8位二进制值所代表的电压值近似为0.0196伏。然后再按照这样的关系去除以51,得到个位电压值;再将余数与26比较(因为8位存贮单元最大值为255,如果余数大于26,乘以10后,8位存贮单元就不能存),小于26直接乘以10再除以51,所得商就是十分位电压值;如大于26则先减去26,再乘以10,然后除以51,所得商最后将结果再加上5,即得十分位电压值;将第二次除以51所得余数,按第二次除以51的方法进行计算,所得结果就是百分位电压值。
......(未完,请点击下方“在线阅读”)
特别说明:本文献摘要信息,由维普资讯网提供,本站只提供索引,不对该文献的全文内容负责,不提供免费的全文下载服务。
金月芽期刊网 201851单片机程序——数码管显示0~99
> 51单片机程序——数码管显示0~99
51单片机程序——数码管显示0~99
#include#define DataPort P0
//定义数据端口 程序中遇到DataPort 则用P0 替换#define CtrlPort P1
//定义控制端口unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9unsigned char code WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量void Delay(unsigned int t); //函数声明void Display(unsigned char FirstBit,unsigned char Num);main(){while(1){ j++; if(j==500)
//检测当前数值显示了一小段时间后,
//需要显示的数值加1,实现数据显示的变化
{ j=0; num++; if(num==100)
//用于显示0~99 num=0;} TempData[0]=DuanMa[num];
//分解显示信息,
//如要显示68,则68/10=6 68=8
TempData[1]=DuanMa[num/10]; Display(0,2);}}void Delay(unsigned int t){ while(--t);}void Display(unsigned char FirstBit,unsigned char Num){
for(i=0;i<Ni++) { DataPort=0;
//清空数据,防止有交替重影
CtrlPort=WeiMa[i+FirstBit];
DataPort=TempData[i];
//取显示数据,段码
Delay(100);
// 扫描间隙延时,时间太长会闪烁,
//太短会造成重影
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一51单片机驱动8位数码管电路图+程序
我的图书馆
51单片机驱动8位数码管电路图+程序
电路图:&JP10排线连接J12 &J21跳线跳12处测试程序&&#include&reg52.h&&typedef unsigned char BYTE;typedef unsigned int WORD;&&sbit LS138A = P2^2; & //定义138译码器的输入A脚由P2.2控制&sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制//此表为 LED 的字模, 共阴数码管 & 0-9 &-&BYTE code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};&WORD LedOut[10];//数码管数组&/**************************************************************************** && ** & & & & & & & & & &延时程序 & & & & & & & *****************************************************************************/&void Delay(WORD n){& & WORD&& & while (n--)& & {& & & & x = 250;& & & & while (x--);& & }}/**************************************************************************** && ** & & & & & & & & & &显示函数 & & & & & & & *****************************************************************************/void display(WORD num){&& & & & &WORD i,LedNumVLedNumVal= &&& &LedOut[0]=Disp_Tab[LedNumVal%00]; //万位& & LedOut[1]=Disp_Tab[LedNumVal%]; &//千位& & &LedOut[2]=Disp_Tab[LedNumVal%]; & //百位& & &LedOut[3]=Disp_Tab[LedNumVal%100/10]; &//十位LedOut[4]=Disp_Tab[LedNumVal%10]; //个位&&& & &LedOut[5]=Disp_Tab[LedNumVal%x80; &//百位带小数点& & &LedOut[6]=Disp_Tab[LedNumVal%100/10]; & //十位& & &LedOut[7]=Disp_Tab[LedNumVal%10]; & & & & & & //个位&for( i=0; i&8; i++) &//实现8位动态扫描循环{ &P0 = LedOut[i]; &//将字模送到P0口显示& & & & &switch(i) &//使用switch 语句控制位选 &也可以是用查表的方式 && & { & &case 0:LS138A=0; LS138B=0; LS138C=0; & & & & &&& &case 1:LS138A=1; LS138B=0; LS138C=0; & & & & & & && &case 2:LS138A=0; LS138B=1; LS138C=0; &&& &case 3:LS138A=1; LS138B=1; LS138C=0; &&case 4:LS138A=0; LS138B=0; LS138C=1; &case 5:LS138A=1; LS138B=0; LS138C=1; &case 6:LS138A=0; LS138B=1; LS138C=1; &case 7:LS138A=1; LS138B=1; LS138C=1; &&& & }&Delay(1);&}}&main(){&&while(1){display(12345);}&}
馆藏&130849
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢可实现功能:
启动程序数码管按照××-××-××格式显示时分秒并走时
按下C1按钮后按照××-××-××格式显示年月日
按下C3调时模式按钮时分秒/年月日静止,指示灯亮起,进入调时模式
先按C2选位按钮再按下C0加一按钮,对应的位置改变
再次按下C3按钮退出调时模式,继续走时
#include&reg51.h&#define uChar unsigned char#define uInt
unsigned int
uChar a []={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uChar b []={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uChar second=00,minute=00,hour=10,year=17,month=01,day=11,
sbit Key1 = P3^7;
//计时停止sbit Key2 = P3^6;
//调位sbit Key3 = P3^0;
//加一 sbit Key4 = P3^2;
//切换sbit LED1 = P1^7;
void Delayms(uInt t){
for(i=0;i&t;i++)
for(j=0;j&125;j++)
void Dispaly1(uChar second,uChar minute,uChar hour){
P0=a[hour/10];
Delayms(5);
P0=a[hour%10];
Delayms(5);
Delayms(5);
P0=a[minute/10];
Delayms(5);
P0=a[minute%10];
Delayms(5);
Delayms(5);
P0=a[second/10];
Delayms(5);
P0=a[second%10];
Delayms(5);
void Dispaly2(uChar day,uChar month,uChar year){
P0=a[day/10];
Delayms(5);
P0=a[day%10];
Delayms(5);
Delayms(5);
P0=a[month/10];
Delayms(5);
P0=a[month%10];
Delayms(5);
Delayms(5);
P0=a[year/10];
Delayms(5);
P0=a[year%10];
Delayms(5);
void Keyscan1(){
static uChar i=0,j=0;
if(Key1==0)
Delayms(10);
if(Key1==0)
while(!Key1);
//等待按键弹起
if(i%2==1)
if(i%2==0)
if(Key2==0)
Delayms(10);
if(Key2==0)
while(!Key2);
if(j%4==1)
if(Key3==0)
Delayms(10);
if(Key3==0)
while(!Key3);
if(second==60)
if(j%4==2)
if(Key3==0)
Delayms(10);
if(Key3==0)
while(!Key3);
if(minute==60)
if(j%4==3)
if(Key3==0)
Delayms(10);
if(Key3==0)
while(!Key3);
if(hour==24)
void Keyscan2(){
static uChar m=0,n=0;
if(Key1==0)
Delayms(10);
if(Key1==0)
while(!Key3);
if(m%2==1)
if(m%2==0)
if(Key2==0)
Delayms(10);
if(Key2==0)
while(!Key2);
if(n%4==1)
if(Key3==0)
Delayms(10);
if(Key3==0)
while(!Key3);
if(day==30)
if(n%4==2)
if(Key3==0)
Delayms(10);
if(Key3==0)
while(!Key3);
if(month==12)
if(n%4==3)
if(Key3==0)
Delayms(10);
if(Key3==0)
while(!Key3);
if(year==99)
void main(){
TMOD=0x01;
TH0=()/256;
TL0=()%256;
TR0=1; while(1) {
static uChar h=0;
if(Key4==0)
Delayms(10);
if(Key4==0)
while(!Key4);
if(h%2==1)
Dispaly2(year,month,day);
Keyscan2();
if(h%2==0)
Dispaly1(second,minute,hour);
Keyscan1();
void time0_int(void) interrupt 1{
TH0=()/256;
TL0=()%256;
if(count==100)
if(second==60)
if(minute==60)
if(hour==24)
if(day==30)
if(month==12)
if(year==99)
阅读(...) 评论()51单片机学习之陆 —— 1.4 数码管的显示
1 的结构和原理
一般而言,数码管都有10个引脚。图上好像只有9个引脚,原因是第三引脚和第8引脚是连接在一起的,所以看上去只有9个。
根据他们的公共端又可分为共阴极和共阳极。
共阴极 和 共阳极
位选:控制那个数码管
段选:控制数码管显示东西(如1 2 3)
数码管静态显示:
是共阴极的数码管
OE :输出允许端 (由于OE为高电平时输出为高阻态芯片不可控,所以设计电路是必须将OE接。)
LE : 锁存允许端
因此,我们将锁存器的LE端与某一引脚相连,再将锁存器的数据输入端(D)与单片机某组I/O 口相连,便可以控制锁存器的锁存端(LE)与锁存器的数据输入端(D)的数据状态来改变锁存器的数据输出端的数据状态
在一上电,如果没有人为控制其I/O口的状态,默认高电平
2 编写程序
P2.6 对应段选
P2.7 对应位选
假如要让第一个数码管显示8
为什么是P0口? 因为在rc上连接数码管的就是P0口
通过对P0口的操作可以直接控制数码管
即P0口的第一为置低电平。所以就第一个数码管会亮
P0 = 0x7f;
P0 = 的第八位低电平,由于共阴极不点亮dp
3 烧写程序
记得冷启动
4 补充共阴极
每一次写数码管的显示时候,都去看,有些麻烦,我们可以写一个函数
unsigned code data[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
以后要使用时,直接将函数写好。
比如我要显示4 就是 P0 = leddata[4];
code 关键字表示这个表格会存放在 代码 区。
代码区的内容,也就是你程序,最后会被烧写到中,运行中不可改变
如果不写 code,一般放在内部存储区。
单片机的内部储存较小,所以这样写可以节省点内部储存空间。
原文链接:
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点

我要回帖

更多关于 单片机数码管显示0到9 的文章

 

随机推荐