#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”以此循环等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)