电路如下图请问单片机动态数码管显示C语言程序怎么写呢

电路如下图请问单片机动态数码管显示C语言程序怎么写呢,第1张

#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

code unsigned char tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//共阴数码管 0-9

unsigned char Dis_Shiwei;//定义十位

unsigned char Dis_Gewei; //定义个位

//

/ 延时函数 /

//

void delay(unsigned int cnt)

{

while(--cnt);

}

//

/ 主函数 /

//

main()

{

TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时

TH0=0xd8;

TL0=0xf0;

IE= 0x82; //打开中断

TR0=1; //打开定时开关

while(1)

{

P0=Dis_Shiwei;//显示十位

P2=0;

delay(300); //短暂延时

P0=Dis_Gewei; //显示个位

P2=1;

delay(300);

}

}

//

/ 定时器中断函数 /

//

void tim(void) interrupt 1 using 1

{

static unsigned char second,count;

TH0=0xd8; //重新赋值

TL0=0xf0;

count++;

if (count==100) //100x10ms=1S,大致延时时间

{

count=0;

second++; //秒加1

if(second==100)

second=0;

Dis_Shiwei=tab[second/10];//十位显示值处理

Dis_Gewei=tab[second%10]; //个位显示处理

}

1、最开始,我们先打开keil。

2、接着,我们要定义好库函数,想要实现动态数码灯,这个步骤是很重要的。

3、接着,我们加上一条循环语句。

4、最后,我们把先前定义的延时语句delayms写好。

5、最后,点击这里进行编译,生成一个hex文件。

6、如果这里无错误警告的话,就说明我们的程序写对了,那我们就可以点亮动态数码管了。

兄弟,你刚学的吧,不知道你是大学生还是非大学生的,如果是大学生的话我觉得我不应该回答了,俺只是说方法,不会给什么程序的,当然并不是程序简单我就不写,不是这样的,而是你要弄清电路的工作原理,弄清程序和电路的关系,弄清的硬件,结合程序看就应该能弄清楚了。

数码的显示方式:静态和动态

静态简单,动态是用扫描技术,进行扫描的,就是显示的数据是一样的,不过利用的扫描后,就造成显示的数据不一样了,原因是显示的速度是非常快的,人的眼是分辨不出的。而你的电路采用的静态显示,那么就是数码的共极部分,当然proteus里的数码应该是共阴极的吧,而阳极是送显示的数据,这样显示的方式是静态显示

P0 P2是数码管送显示的数据,当然这两数码管一个显示个位,一个显示十位,那么你要对显示的数据进行处理一下,比如是要显示99:

uint a,b;

uint k=99;

a=99/10;//这里只取十位而已,也就是9

b=99%10//这是求模,相当于数学里说的取余数

然后再将这a和b的数据指向一个数码管显示的代码数组[弄清数码管的显示就知道怎么写出显示代码了]

第一个是个位,先显示个位,数组的运用是利用下标控制的,我们用变量b控制下标。

第二个是十位,也是利用下标控制数组的。

当然这个变量k我们可以先不赋值,让它自增或自减从最大值一直减到最小,就是从99显示到0了,

当然你的电路有些浪费I/O口,两个数码管你把段全部连在一起不就行了,然后把共极各自连接I/O口,利用动态显示,你上图所示的,根本就是静态显示,浪费资源啊,当你在设计产品时是浪费I/O口的,

我认为应该是这样的,这样节省资源,控制也非常方便的,一点儿也不能,这个才是动态显示,利用动态扫描就搞定了,要不然会浪费资源的,俺的基础有限,再说也是自学的,也好久没弄51了,现在在做其经类型的MCU了,兄弟祝你学习有成。

注意要外接上拉电阻的,P0内部没带上拉电阻,要自己接上哦,俺没画上,你做实际产品时不要忘记了。

#include <reg51h>

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void show(unsigned char n);

void delay();

void main()

{

unsigned char i;

int j;

while(1)

{

for(i=0;j=100,i<100;++i)

while(j--)

show(i);

}

}

void show(unsigned char n)

{

P0=table[n%10];

P2=~0x01;

delay();

P2=0xFF;

P0=table[n/10];

P2=~0x02;

delay();

P2=0xFF;

}

void delay()

{

int i=100;

while(i--);

}

你这数组里面16组数分别为0~f的共阴数码管的编码,你说只需要数码管显示0~6,那么多余的就没有用到,或者 在别的函数里面有用到 你仔细看你的程序……

P0=table[1],意思就是说 往P0里面送table这组数里面的第2个数也就是0x06,0x06正好是共阴数码管显示1的编码。所以数码管就会显示1,同理 table[2]就是显示2的编码,需要注意的是table[0]指定的是table里面的第一个数。

以上就是关于电路如下图请问单片机动态数码管显示C语言程序怎么写呢全部的内容,包括:电路如下图请问单片机动态数码管显示C语言程序怎么写呢、51单片机显示八位数码管的C语言程序、求用51单片机接两个数码管,0-99动态显示程序(用C语言)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://www.54852.com/zz/10048289.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存