运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序

运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序,第1张

#include<reg52h>

#define

uchar

unsigned

char

#define

uint

unsigned

int

uchar

count;

uint

disnum;

sbit

dula=P2^6;

sbit

wela=P2^7;

uchar

code

tabledu[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

display(uchar,uchar,uchar);

delay(uchar);

void

main()

{

EA=1;

ET1=1;

TMOD=0x10;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

TR1=1;

while(1)

{

if(count==20)

{

count=0;

//

if(disnum==1000)

//

disnum=0;

disnum++;

}

display(disnum/100,disnum%100/10,disnum%100%10);

}

}

void

tim1()

interrupt

3

using

3

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

count++;

}

display(uchar

bai,uchar

shi,uchar

ge)

{

P0=tabledu[bai];

dula=1;

dula=0;

P0=0xfe;

wela=1;

wela=0;

delay(1);

P0=tabledu[shi];

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(1);

P0=tabledu[ge];

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(1);

}

delay(uchar

x)

{

uchar

a,b;

for(a=x;a>0;a--)

for(b=255;b>0;b--);

}

//你自己看一下,有不对的就改点别忘了给分啊

数码管显示子程序最后一行,P0=0x00; 下面应该有一个大括号 } 才对。否则显示子程序大括号不配对,而这一行就不在子程序之中,肯定是错误了。因为这一行错误,影响到主程序 void main( ),所以提示34行void 的上面有错误。

#include <reg52h>

typedef unsigned char u8;

typedef unsigned int u16;

void display(u8 x);//声明显示子函数

u8 t0n; //定时器中断次数

void main()//主程序

{

u8 n;

TMOD=0x01;

TH0 =0x3C;//晶振12M,定时50ms

TL0 =0xB0;

IE =0x82;

TR0 =1;

while(1)

{

display(n);

if(t0n>=20)//1秒到

{

t0n=0;

if(n==0)n=4;

else n=0;

}

}

}

//定时器T0中断服务程序

void T0_isr() interrupt 1

{

TH0 =0x3C;

TL0 =0xB0;

t0n++;

}

两位数码管显示38-00倒记时 8段数码管显示两位数码管显示38-00倒计时(动态扫描方式)p2做LED显示数据输出口p10;p13分别控制数码管个位数和十位数显示 8段数码管从内部接线上分共阳和共阴两种。在电路设计时应根据情况决定采用共阳或共阴,其基本原则是:若单片机IO口直接驱动数码管个段,最好采用共阳数码管,因为51单片机IO口输出高电平时输出的电流很小,数码管不会太亮;若数码管是通过驱动芯片与单片机相连的,就要看驱动芯片对数码管极性的要求啦。下面的实验采用共阳数码管。;=======================================

;constant define ;常数定义

csp equ 60h ;堆栈开始使用的位置

;=======================================

;variable define ;变量定义

vadigit equ 30h ;数码管个位数存放内存位置

vbdigit equ 31h ;数码管十位数存放内存位置

vcnt1 equ 32h ;计数器数值存放内存位置;=======================================

;Func: 程序开始

;=======================================

org 0000h

ajmp mainorg 0030h ;到0030h处避开00-30h的敏感地址

;=======================================

;Func: 程序初始化

;=======================================

main: ;初始化特殊寄存器及变量

mov sp,#csp ;指定堆栈开始使用的位置

star:

mov vcnt1,#0 ;初始化计数器,从0开始

lop1:

acall display ;调用显示子程序

inc vcnt1 ;对计数器加1

mov a,vcnt1

cjne a,#100,lop1 ;判断计数器是否满100

mov vcnt1,#0 ;满100就清零重新开始

ljmp lop1 ;不满就循环执行;=======================================

;Func: 8字型LED显示子程序

;Input: vcnt1

;=======================================

display:

mov a,vcnt1 ;将temp中的十六进制数转换成10进制

mov b,#10 ;10进制/10=10进制

div ab ;a除以b,商在a,余数在b

mov vbdigit,a ;十位在a

mov vadigit,b ;个位在b

mov dptr,#digittab ;指定查表起始地址

mov r0,#4

dpl1:

mov r1,#250 ;

dplop:

mov a,vadigit ;取个位数

movc a,@a+dptr ;查个位数的7段代码

mov p1,a ;送出个位的7段代码

clr p32 ;开个位显示

acall delayus ;显示162微秒

setb p32 ;关闭个位显示,防止鬼影

mov a,vbdigit ;取十位数

movc a,@a+dptr ;查十位数的7段代码

mov p1,a ;送出十位的7段代码

clr p33 ;开十位显示

acall delayus ;显示162微秒

setb p33 ;关闭十位显示,防止鬼影

djnz r1,dplop ;循环执行250次

djnz r0,dpl1 ;循环执行250X4=1000次

ret;=======================================

;Func: 162us延时子程序

;=======================================

delayus:

mov r7,#80 ;///2+2X80=162微秒,延时按110592MHZ计算

djnz r7,$

retorg 0600h

;=======================================

digittab: ;实验板上的7段数码管0~9数字的共阳显示代码

db 0c0h;0

db 0f9h;1

db 0a4h;2

db 0b0h;3

db 099h;4

db 092h;5

db 082h;6

db 0f8h;7

db 080h;8

db 090h;9

end

AT89C51数码管动态显示,用8位一体共阳数码管。仿真图和效果如下

程序如下

#include<reg51h>

#define uint  unsigned int

#define uchar unsigned char

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0~9的段码值

0xf1,0xbf};//J,-的段码

uchar ledram[]={10,2,11,0,6,11,2,9};//10显示J,11,显示-,其余为显示的5个数,可以改

void delay()//延时子程序

{

uint j;

for(j=400;j>0;j--);

}

void display()//显示子程序

{

uchar j,ledbit=0x01;//位码

for(j=0;j<8;j++)

{

P2=ledbit;//输出位码

P0=tab[ledram[j]];//输出段码

delay();

ledbit<<=1;//取下一个位码

}

}

void main()

{

while(1)

{

display();//调显示子程序

}

}

请采纳

以上就是关于运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序全部的内容,包括:运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序、keil 写的数码管动态显示程序报错。、【单片机程序】能让数码管动态显示“0123”一秒后再显示“4567”以此循环等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9314592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存