历史上的今天
返回首页

历史上的今天

今天是:2025年10月19日(星期日)

正在发生

2022年10月19日 | STC89C52单片机 点亮两个数码管,可以显示 00——10 共 11 个数字

2022-10-19 来源:csdn

手动显示

#include //包含51头文件

#include //包含移位标准库函数头文件


#define uint unsigned int

#define uchar unsigned char


sbit DU = P2^6;//数码管段选

sbit WE = P2^7;//数码管段选


//共阴数码管段选表0-9

uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};


/*====================================

函数 : delay(uint z)

参数 :z 延时毫秒设定,取值范围0-65535

返回值 :无

描述 :12T/Fosc11.0592M毫秒级延时

====================================*/

void delay(uint z)

{

uint x,y;

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

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


/*====================================

描述 :两位共阴数码管动态显示

====================================*/

void display(uchar num1, uchar num2)

{

/*第一位显示*/

P0 = 0XFF;//清除断码

WE = 1;//打开位选锁存器

P0 = 0XFE; //1111 1110

WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器

P0 = tabel[num1];//

DU = 0;//锁存段选数据

delay(1);


/*第二位显示*/

P0 = 0XFF;//清除断码

WE = 1;//打开位选锁存器

P0 = 0XFD; //1111 1101

WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器

P0 = tabel[num2];//

DU = 0;//锁存段选数据

delay(1);

}


void main()//main函数自身会循环

{

while(1)

{

display(0, 0); //数码管显示函数

}

}  


说明:

由于传参的缘故,显示 00——10 共 11 个数字只需要调用

自定义的函数void display(uchar num1, uchar num2)

依次传入:


display(0 ,1);

display(0 ,2);

display(0 ,3);

display(0 ,4);

display(0 ,5);

display(0 ,6);

display(0 ,7);

display(0 ,8);

display(0 ,9);

display(1 ,0);


所以以上其它代码不再复制。


自动显示

#include //包含51头文件

#include //包含移位标准库函数头文件


#define uint unsigned int

#define uchar unsigned char


sbit DU = P2^6;//数码管段选

sbit WE = P2^7;//数码管段选

uchar count = 0; // 控制数码管显示的变量

uchar i = 0;  // 控制循环次数的变量


//共阴数码管段选表0-9

uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};


/*====================================

函数 : delay(uint z)

参数 :z 延时毫秒设定,取值范围0-65535

返回值 :无

描述 :12T/Fosc11.0592M毫秒级延时

====================================*/

void delay(uint z)

{

uint x,y;

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

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


/*====================================

描述 :两位共阴数码管动态显示

====================================*/

void display(uchar num1, uchar num2)

{

/*第一位显示*/

P0 = 0XFF;//清除断码

WE = 1;//打开位选锁存器

P0 = 0XFE; //1111 1110

WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器

P0 = tabel[num1];//

DU = 0;//锁存段选数据

delay(1);


/*第二位显示*/

P0 = 0XFF;//清除断码

WE = 1;//打开位选锁存器

P0 = 0XFD; //1111 1101

WE = 0;//锁存位选数据

DU = 1;//打开段选锁存器

P0 = tabel[num2];//

DU = 0;//锁存段选数据

delay(1);

}



/*====================================

变量 count:负责控制点亮哪2个数码管,例如count 为1 则点亮 01 数码管

描述 :由于同时点亮2个数码管,需要2个数码管不断的循环才能实现2个数码管同时点亮

所以在这里将数码管显示在单片机的代码封装起来,来让我们调用。

====================================*/

void singlechip_show_num(uchar count){  

switch(count){ // 通过 switch case 语句对 数码管的数值进行精准的管理

    case 0 :

       display(0 , 0);

       break; 

    case 1 :

       display(0 , 1);

       break;

case 2 :

       display(0 , 2);

       break;

case 3 :

       display(0 , 3);

       break;

case 4 :

       display(0 , 4);

       break;

case 5 :

       display(0 , 5);

       break;

case 6 :

       display(0 , 6);

       break;   

case 7 :

       display(0 , 7);

       break; 

case 8 :

       display(0 , 8);

       break;

case 9 :

       display(0 , 9);

       break;

case 10 :

       display(1 , 0);

       break;      

}

}


void main()//main函数自身会循环

{

while(1)

{

for (i = 0; i < 200; i++){   // 使点亮的数码管循环 200 次,保证人眼能够看到的数码管是同时显示的。

singlechip_show_num(count);   // 调用数码管显示函数

}


count++; //每次循环200次结束, count 变量自身+1,单片机显示+1后的数值


if(count == 11){ // 当count 变量 等于11时,我们把变量再重新初始化为0,从0重新开始计数循环

count = 0;

}

}

}  


效果显示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


推荐阅读

史海拾趣

问答坊 | AI 解惑

正弦脉宽调制(SPWM)波的基本要素

               项目简介 江苏省常熟市    吴栋梁 个人原创的《超音频宽频带功率正弦波逆变电源》系电力电子变流技术(SPWM)类的电源引擎, 资质情况为国内领先水平,持 ...…

查看全部问答>

ARM内核结构简介

ARM内核结构简介…

查看全部问答>

如何用createwindow创建不带右上角"X"的窗口

就合普通的dialog样式一样,出现OK按钮,点击关闭,而不是出现\"X\"按钮点击最小化…

查看全部问答>

F2812 的IFR究竟是写0清除状态位还是写1清除

F2812 的IFR究竟是写0清除状态位还是写1清除? F2812的资料介绍中 Note部分:To clear an IFR bit, you must write a one to it, not a zero. 在寄存器各位Description中:Write a 0 to this bit to clear it to 0 and clear the interrupt reques ...…

查看全部问答>

T0中断和外部中断0不能同时使用吗

用汇编写了个程序,两个中断同时使用时,程序不响应,设置优先级后还是不响应。但是单个中断调试时有用,想问下大家这个问题该怎么解决,谢谢了 程序如下 ORG 0000H LJMP RESET            // &n ...…

查看全部问答>

LM3S 比较器详解

申请团购LM3S开发板,找了个比较器资料…

查看全部问答>

PIC仿真问题

用protues仿真PIC16F73的多机通讯时,用两个单片机可以通讯,三个就不能通讯了,不知为什么?哪位大侠能够指点一下?多谢!…

查看全部问答>

请网友不要再乱发论坛里已经有的文章和资料,纯粹浪费空间和读者时间

看看论坛里充斥着发了多次的文章和资料,实在没有意思!请网友不要再乱发论坛里已经有的文章和资料,纯粹浪费空间和读者时间…

查看全部问答>

太辛苦啦。。

我室友治本大叔。。天天苦战到晚上2点。。我的眼睛也都被点阵闪的花了。。。 辛苦呀。。。 伤不起呀。。。 …

查看全部问答>