导航:首页 > 操作系统 > 单片机数码管计数

单片机数码管计数

发布时间:2022-11-28 08:55:32

⑴ 利用51单片机驱动一个8段数码管,实现0—F计数

设置一个数码管段位表ledtable,共16个,值就是共阴8 段(含小数点)数码管的段码。 8 段从上面一横开始顺时针依次为a、b、c、d、e、f、g(中间的横)和h(小数点),分别接在单片机IO口的0~7 ,例如要显示0,则段码为0011 1111 即0x3f 。 其它,你可自行推出。

程序上实现:

ORG0000H
MAIN:
MOVR0,#0;
LOOP:
MOVA,RO
MOVDPTR,#LEDTABLE
MOVCA,@A+DPTR
MOVP1,A
ACALLDELAY
INCR0
MOVA,R0
DJNEA,#16,LOOP
MOVRO,#0
AJMPLOOP
DELAY:
NOP
RET
ORG0500H
LEDTABLE:
DB3FH,....

⑵ 单片机6位数码管计数器程序问题

#include<reg52.H>//STC头文件
#defineucharunsignedchar
#defineuintunsignedint
#definetimewe3

sbitwe=P2^7;
sbit=P2^6;

unsignedlongtemp;
uintjsms=0;

ucharcodean[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
ucharcodewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

voiddelay(uinta)//1ms延时程序(12MHz10倍于51单片机速度时)
{
uinti;
while(--a!=0)
{
for(i=0;i<600;i++);
}
}

uchardisbuf[6];
voiddisplay()
{ ucharcodewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
staticuchara;
if(a>=6)a=0;
we=1;
P0=0xff;
we=0;
=1;
P0=an[disbuf[a]];
=0;
we=1;
P0=wei[a];
we=0;
a++;
}
/**********************************************/
/*主函数*/
/**********************************************/
voidmain(void)
{
temp=0;
while(1)
{
if(++jsms>=1000){
if(++temp==999999)
temp=0;
}

disbuf[0]=temp/100000;
disbuf[1]=temp%100000/10000;
disbuf[2]=temp%10000/1000;
disbuf[3]=temp%1000/100;
disbuf[4]=temp%100/10;
disbuf[5]=temp%10;
display();
delay(1);
}
}

⑶ C51单片机,控制数码管每隔3秒,循环数字1234,5678,9876,1368

用四位一体的共阴数码管,用定时器T0定时,实现3秒切换显示四组数字。仿真实现,仿真图如下

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴段码

uchar code disb[]={0xfe,0xfd,0xfb,0xf7};//位码

uchar buf[]={1,2,3,4,5,6,7,8,9,8,7,6,1,3,6,8};//显示四组数字

uchar t0n;//T0定时器中断计数

void delay()//延时子程序

{

uint y;

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

}

void display(uchar x)//显示子程序,x为显示起始位

{

uchar j;

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

{

P2=disb[j];//输出位码

P0=tab[buf[j+x]];//输出段码

delay();

}

}

void main()//主程序

{

uchar x;

TMOD=0x01;//T0方式1

TH0=0x3C;//晶振12MHz,定是50ms,时间常数,X=3CB0H

TL0=0xB0;

IE=0x82;

TR0 =1;

while(1)

{

display(x);

if(t0n>=60)

{

t0n=0;

x+=4;

if(x>12)x=0;

}

}

}

//定时器T0中断程序

void T0_ISR() interrupt 1

{

TH0=0x3C;

TL0=0xB0;

t0n++;

}

⑷ 51单片机定时器T1中断使数码管计数0—F,每秒加1,想要将if()函数写到main()函数中,如何实现。

把初始化程序 Timer1Init(); 放在while(1) 的上面,你现在这样,每次循环都初始化了,就永远也不计数了 。另外,开机是显示8,是因为,开机P0口全为1,要过1秒后开始从0开始显示,可以在while(1)上面加一行 P0=0x3f; 这样,开机就显示0了。另外,这种定时1秒,定时器最好定时长点,如50ms ,你现在是定时1ms ,这中断频率太高了,如果有其它程序就会影响主程序的执行。
还有,if 语句下面的
if(i==1000)
{
//TR1=0;//要这行,就计数一遍就停了,要不停地计数就要删掉
i=0;
P0=smgan[n++];
if(n==16) n=0;

}

⑸ 单片机程序:两位数码管记秒【加分】

1.单片机用89C51或者89C52,P0 P2进行显示数据的输出, P3.0键接按键。 数码管用共阴极数码管。
2.主要功能:按键控制,按一下计秒再按停止。技术显示从0到99循环开始。
采用定时计数器T0实现秒中断:
#include <REG52.H> //注意头文件,调试的时候你的软件里面是否有这个文件
#define pb P3_0
unsigned int int_count=0;//T0中断计数
unsigned char second=0;//秒计数
unsigned char count=0;//分支选择,计数器开和关
unsigned char reg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//共阴极数码管码值表

void Key_delay()//按键延时
{unsigned char i,j;
for(i=100;i>0;i--)
for(j=248;j>0;j--);
}
void t0() interrupt 1 using 0 //T0中断函数 4000次一个循环 一个循环一秒
{int_count++;
if(int_count==4000)
{int_count=0;
second++;
if(second>99)
second=0;
}

}
void Key_scan()//按键扫描函数
{
if(pb==1)
{Key_delay();
if(pb==1)
Key_delay();//此延时主要考虑到个人的视觉感受和按键操作合理时间
count++;
switch(count)
case 0: break;
case 1: TR0=1;break;//开定时器
case 2: TR0=0;count=0;break;
}
}

void main()
{unsigned char sacn//按键扫描变量
TMOD=0X02;//8位自动重装
TH0=0x06;
TL0=0x06;//250us中断一次
ET0=1;
EA=1;//开单片机中断
while(1)//等待中断
{if(int_count)
{sacn=int_count;
if(!(scan%40))//10ms进行一次按键扫描
Key_scan();//调用按键扫描函数
P0=seg[second/10]//10位输出
P2=seg[second%10]//个位输出
}
}
}

注意共阴极数码管的连接方式:P0P2口低位到高位分别连接到两个数码管的a到g脚,因为连接方式决定了显示数据的编码方式;P0口务必要接上拉电阻。

⑹ 单片机数码管显示的数值编码

8位数据总线,16位地址总线的CPU;具有布尔处理能力和位处理能力;采用哈佛结构,程序存储器与数据存储器地址空间各自独立,便于程序设计;相同地址的64KB程序存储器和64KB数据存储器;

0-8KB片内程序存储器(8031无,8051有4KB,8052有8KB,89C55有20KB);128字节片内数据存储器(8051有256字节);

32根双向并可以按位寻址的I/O线;两个16位定时/计数器(8052有3个);一个全双工的串行I/O接口;多个中断源的中断结构,具有两个中断优先级;片内时钟振荡器。


(6)单片机数码管计数扩展阅读:

单片机工作的三个条件分别是电源、时钟晶振、复位。当单片机不能正常工作时,我们首先就要检查这三个条件,用电压表或者万用表检测他的电源和接地脚,检测两个引脚之间的电压是不是5V左右;对于时钟晶体振荡有没有正常工作。

最好用示波器进行检测,看能否检测到相应频率的正弦波脉冲;复位检测比较简单,单片机的复位电平一般是高电平复位,单片机在接通电源的时候一般复位引脚上会出现5V左右的高电平,另外在按下复位按键时,复位引脚上也会出现高电平,用一般的电压表或者万用表都可以进行检测。

⑺ 利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开始每1秒钟加1。

共阳数码管中断程序:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]=

{

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x83,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};

uint num,a;

uchar ,shi,ge;

void init();

void delay(uint);

void display(uchar,ucharshi,ucharge);

uint fb();

uint fs();

uint fg();

void main()

{

init();

while(1)

{

display(fb(),fs(),fg());

}

}

void init()

{

num=0;

a=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void display(uchar,ucharshi,ucharge)

{

P1=0xfd;

P0=table[];

delay(1);

P1=0xfb;

P0=table[shi];

delay(1);

P1=0xf7;

P0=table[ge];

delay(1);

}

void timeoff() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65526-50000)%256;

a++;

if(a%20==0)

{

num++;

if(num==999)

{

num=0;

}

}

}
void delay(uint z)
{

uint x,y;

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

for(y=110;y>0;y--);

}

uint fb()

{

=num/100;

return ;

}

uint fs()

{

shi=num%100/10;

return shi;

}

uint fg()

{

ge =num%100%10;

return ge;

}

(7)单片机数码管计数扩展阅读

2个可编程定时/计数器·5个中断源,2个优先级(52有6个)

一个全双工串行通信口

外部数据存储器寻址空间为64kB

外部程序存储器寻址空间为64kB

逻辑操作位寻址功能·双列直插40PinDIP封装

单一+5V电源供电

CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;

RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;

ROM:用以存放程序、一些原始数据和表格;

I/O口:四个8位并行I/O口,既可用作输入,也可用作输出

T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;

五个中断源的中断控制系统;

一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;

片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。

参考资料来源:网络-51单片机



⑻ 单片机上数码管的位码是怎样计数出来

位码选择就是对应你的几个(一般是六个或者八个)数码管的哪几个亮,与段码区分开来,至于怎么确定位码就要看你连接位码用的是哪几个io端口了,然后一一对应起来,想点亮那个数码管就改变对应的那一个二进制位的电平就可以了。。。。

⑼ 单片机数码管动态显示0-100

给你简单的修改了一下,如果你的数码管编码没错,应该可以显示 0~99的
没添加百位显示,所以只有 0~99

//数码管动态显示+1,显示范围0-100,定时时间1s
#include<reg52.h>

sbit la=P2^6; //定义段选信号
sbit wela=P2^7; //定义位选信号

char aa,temp,,shi,ge;
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(int z); //延迟函数声明
void display(char d); //显示函数声明
void init(); //初始化函数声明
/*******************************************************************************/
/*******************************************************************************/
void main()
{
init(); //调用初始化子函数
while(1)
{
display(temp); //调用显示子函数
}
}
/*******************************************************************************/
/*******************************************************************************/
void delay(int z) //延迟子函数
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************************************************************************/
/*******************************************************************************/
void display(char d) //显示子函数
{
char d1,d2;
d2=d%10; //取个位 %求余
d1=(d/10)%10; //取十位

P0=table[d2]; la=0; delay(10); la=1;//个位显示

P0=table[d1]; wela=0; delay(10); wela=1;//十位显示
}
/*******************************************************************************/
/*******************************************************************************/
void init() //初始化子函数
{
la=0;
wela=0;
temp=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*******************************************************************************/
/*******************************************************************************/
void timer0() interrupt 1 //中断处理子函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重载初值
aa++;
if(aa==20) //判断定时是否到达1s
{ aa=0; temp++ ; }
if(temp==100) //限制temp变化的范围,使之不超过100
{ temp=0; }
}
/*******************************************************************************/
/*******************************************************************************/
/*/////////////////////////////////////////////////////////////////////////////*/

⑽ 利用51单片机和3位数码管实现10分钟内的简易计时器

修改如下:
#include<reg51.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbitkey1=P2^7;
sbitkey2=P2^6;
sbitweiH=P3^0;
sbitweiM=P3^1;
sbitweiL=P3^2;
uintnum=0,ge=0,shi=0,fen=0,k;//num用来计数,ge为各位显示,shi为十位显示,fen为分钟显示

voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}

ucharkey1scan(void)
{if(key1==0)
{delayms(10);
if(key1==0)
{while(!key1);
return1;
}
return0;
}

ucharkey2scan(void)
{if(key2==0)
{delayms(10);
if(key2==0)
{while(!key2);
return1;
}
}
return0;
}

voidshowtime()interrupt1//时间显示
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
num%=3;
switch(num)
{
case0:
weiL=1;//显示秒的个位
P1=0xff;
P1=table[ge];
delayms(5);
weiL=0;
break;
case1:
weiM=1;//显示秒的十位
P1=0xff;
P1=table[shi];
delayms(5);
weiM=0;
break;
case2:
weiH=1;//显示分钟,只显示0-9
P1=0xff;
P1=table[fen];
delayms(5);
weiH=0;
break;
}

voidmain()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
num=0;
while(1)
{
if((key1scan()==1)&&(key2scan()!=1))break;//按键1按下,按键2未按下开始计时
}
while(1)
{
delay(1000);
ge++;
if(ge>9)
{
ge=0;
shi++
if(shi>5)
{
fen++;
if(fen>9)fen=0;
}
}
showtime();
}
}

阅读全文

与单片机数码管计数相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:962
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:144
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:736
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:484
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163