文章目录

  • 一、点亮数码管
  • 二、八位数码管同时从0到F
  • 三、显示学号(指定数字)
  • 四、中断机制的引入
  • 五、利用中断实现动态时钟

一、点亮数码管

首先看一下案例源码:

#include <reg52.h>sbit dula= P2^6;  //声明U1锁存器的锁存端
sbit wela= P2^7;  //声明U2锁存器的锁存端int main()
{wela= 1;  //打开U2锁存端(控制灯亮的锁存器)P0= 0xfc;  //送入位选信号(亮灯的位置,十六进制从右到左,显示的是从左到右)wela= 0;dula= 1;    //打开U1锁存端(控制灯显示的锁存器)P0= 0x07;    //送入段选信号(灯亮的数字,十六进制转二进制依次对应hgfe dcba段,h段为0其余为1则全亮)dula= 0; //关闭U1锁存端while(1);  //程序停止
}

(1)全局变量区域的sbit表示声明锁存器的锁存端,简单来说就是需要用这两个锁存端来控制段选和位选信号的保持。段选用来控制数码管上的数字,位选用来控制数码管上的位置,因此这两个索存端就是用来控制在数码管的哪个(或哪几个)位置上显示什么数。
(2)主函数中就用上了在全局声明的锁存端,wela则是控制位选(哪个位置),为1时则打开,为0时则关闭,并保持设定好了的位选。dula段选控制同理。
(3)不管是段选还是位选,都是用P0来传入信号。

二、八位数码管同时从0到F

首先提供一下从0到F的段选信号:

//0到F段选信号
uchar code table[]={0x3f, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c,0x39, 0x5e, 0x79, 0x71
};

(1)我们的本次要显示的是所有的数码管,这里是八位数码管,wela= 1; P0= 0x00; //位选信号,全亮 wela= 0;
(2)在点亮全部数码管的基础上,将这一系列的段选信号依次遍历,传入到P0中,再加上延迟函数,就能够实现动态变化了。

/*让8个数码管同时点亮,
依次显示0到F,时间间隔为0.5秒*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int//锁存器与全局变量
sbit dula= P2^6;
sbit wela= P2^7;
uchar num;
//0到F段选信号
uchar code table[]={0x3f, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c,0x39, 0x5e, 0x79, 0x71
};
void delay(uint);  //函数声明void main()
{wela= 1;P0= 0x00;  //位选信号,全亮wela= 0;while(1){for(num=0; num<16; num++) //16个数循环显示{dula= 1;P0= table[num];      //段选信号,依次取数组中的值dula= 0;delay(500);      //延时0.5秒}}
}void delay(uint x)  //延时x毫秒的函数
{uint i,j;for(i=x; i>0; i--){for(j=110; j>0; j--) ;}
}

三、显示学号(指定数字)

稍微想一下就明白了,只要我们将依次将各个学号数字所对应的段选信号通过P0传入,位选信号我们都不用变,就可以在数码管上显示所对应的数字了。

/*显示学号*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delayms(uint x);  //延时函数声明//U1和U2锁存器的锁存端
sbit dula = P2^6;
sbit wela = P2^7;
//学号的段选信号
uchar code table[]={0x5b, 0x3f, 0x06, 0x6f,
0x66, 0x5b, 0x7d, 0x3f
};//存放位选信号
uchar D[]= {0xfe, 0xfd, 0xfb, 0xf7,
0xef, 0xdf, 0xbf, 0x7f
};void main()
{uint i;while(1){for(i=0; i<sizeof(table); i++){dula= 1;P0= table[i];  //送入段选信号dula= 0;P0= 0xff;  //送位选数据前关闭数码管的显示,防止位选锁存器混乱wela= 1;P0= D[i];  //送入位选信号,只亮一位,但由于视觉残留效应,会觉得是同时亮着的wela= 0;delayms(2);  //(必须有延时)延时2毫秒,对于人眼的视觉暂留根本看出来在跳 }}
}//延时x毫秒的函数
void delayms(uint x)
{uint i,j;for(i=x; i>0; i--){for(j=110; j>0; j--) ;}
}

四、中断机制的引入

首先理解一下中断是什么,举个例子:我本来在上课,突然有电话打来,我去接了个电话,然后继续回来上课。在这个例子中,我去接电话就是在执行一个中断请求,执行完该中断之后,我会继续回到课堂上,继续断点位置的讲课,而不是从头开始讲课,这也就是中断的好处了。

1、中断允许控制位
EA:中断允许总开关控制位。(1:所有中断请求被允许;0:所有中断请求被屏蔽)

  • ES:串行口中断允许控制位。(1:允许串口中断;0:禁止串口中断)
  • ET1:定时器/计数器T1的溢出中断允许控制位。(1:允许T1溢出中断;0:禁止T1溢出中断)
  • EX1:外部中断1中断允许位。(1:允许外部中断1中断;0:禁止外部中断1中断)
  • ET0:定时器/计数器T0的溢出中断允许控制位。(1:允许T1溢出中断;0:禁止T1溢出中断)
  • EX0:外部中断0中断允许位。(1:允许外部中断1中断;0:禁止外部中断1中断)

注意:除了EA总中断控制,以上中断类型中EX0即外部中断0的等级是最高的,就是0;从下往上依次递减,ES串行口中断等级为4,即最低的。

2、中断请求方式的选择

  • IT0(TCON.0),外部中断0触发方式控制位。
    当IT0=0时,为低电平触发方式。
    当IT0=1时,为边沿触发方式(下降沿有效)。
  • IE0(TCON.1),外部中断0中断请求标志位。
  • IT1(TCON.2),外部中断1触发方式控制位。
  • IE1(TCON.3),外部中断1中断请求标志位。
  • TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
  • TF1(TCON.7),定时/计数器T1溢出中断请求标志位。

3、中断服务的必要操作
(1)中断初始化

 EA=1;//打开总中断开关
EX0=1;//开外部中断0
IT0=0/1;//设置外部中断的触发方式
//便是以上中断方式TOCN的选择

(2)写中断服务函数

void int0 () interrupt 0  //外部中断0,即最高级别的中断,所以为0{//do anything that you want
}

3、外部中断0简单案例

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delayms(uint z);
void display();//锁存器
sbit wela= P2^7;  //位选
sbit dula= P2^6;  //段选
//0到9的段选信号
uchar code table[]={0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
};void main()
{//主函数变量uint i;//初始化中断方式IT0= 0;  //低电平触发中断0//中断基础设置EA= 1;  //开总中断EX0= 1;  //允许外部中断0PX0= 1;  //外部中断0为高优先级while(1){for(i=0; i<=6; i++){wela= 1;P0= 0xbF;wela= 0;dula= 1;P0= table[i];dula= 0;delayms(10000);}    }
}void display() interrupt 0
{uint i;uchar temp= P0;for(i=0; i<10; i++){wela= 1;P0= 0x7F;wela= 0;dula= 1;P0= table[i];dula= 0;delayms(10000);}P0= temp;
}void delayms(uint z)
{uint i, j;for(i=z; i>0; i--)for(j=0; j<110; j--)  ;
}

五、利用中断实现动态时钟

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned charvoid time_init();
void delay(uint x);
void display(uchar addr, uchar sign);
void write_addr(uchar addr);
void write_data(uint sign);
void timer();
void dis_gang();sbit dula = P2^6;
sbit wela = P2^7;
code uchar table[]={0x3F, 0x06, 0x5B, 0x4F, 0x66,0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //0-9段选
uint sign[6]={0, 0, 0, 0, 0, 0};  //用来显示数据的位置,不包括横杠uint second=0;
uint minute=0;
uint hour=0;
uint n=0;  //用来计数判断的中间变量void time_init()
{TMOD = 0x02;ET0 = 1;   //可用定时器0TR0 = 1;   //运行定时器0TH0 = 156;TL0 = 156;EA = 1;
}void display(uchar addr, uint j)    //传入段选下标和位选信号
{//送段选数据,点亮数码管 dula= 1;P0= table[j];dula= 0;P0= 0xff;  //关闭数码管,防止打开位选锁存器时原来的段选数据通过位选造成混乱 //送位选数据 wela= 1; P0= addr;wela= 0;delay(1);     //等待会触发中断,执行后一位的计数dis_gang();
}void dis_gang()      //在数字交界显示横杠
{wela = 1;P0 = 0xDB;  //第3位和第6位wela = 0;dula = 1;P0 = 0x40;  //一个杠dula = 0;delay(1);
}   void delay(uint x)
{uint i, j;for(i=x; i>0; i--)for(j=110; j>0; j--) ;
}void main()
{time_init();while(1){display(0x7F, sign[0]);display(0xBF, sign[1]);display(0xEF, sign[2]);display(0xF7, sign[3]);display(0xFD, sign[4]);display(0xFE, sign[5]);}
}void timer() interrupt 1
{n++;if(n==10000){n=0;second++;if(second==60){second=0;minute++;if(minute==60){minute=0;hour++;if(hour==24){hour=0;}}}sign[0]= second%10;  //获得秒个位的下标sign[1]= second/10;  //获得秒十位sign[2]= minute%10;sign[3]= minute/10;sign[4]= hour%10;sign[5]= hour/10;}
}

蓝桥杯51单片机之数码管从点亮到动态时钟的实现【单片机开发初学者必掌握】相关推荐

  1. 蓝桥杯51单片机之独立按键控制数码管【单片机开发初学者必学会】

    文章目录 一.写在前面 二.无中断控制数码管 三.外部中断控制数码管 一.写在前面 关于数码管的控制与显示,在文章51单片机之数码管从点亮到动态时钟的实现[单片机开发初学者通俗易懂]已经有详细介绍了, ...

  2. avr单片机led数码管六位动态显示时分秒c语言程序,AVR单片机控制8段LED数码管同时显示 - AVR单片机8位数码管显示的程序实现(两种方法介绍)...

    AVR单片机控制8段LED数码管同时显示 这是一个简单的供单片机入门学习者练习用的8段LED数码管控制汇编程序,控制一个两位的数码管同时显示字符(动态刷新).用AVR- Studio-4 开发,在AV ...

  3. avr单片机led数码管六位动态显示时分秒c语言程序,AVR单片机8位数码管显示的程序实现(两种方法介绍)...

    描述 本文为大家介绍两个AVR单片机8位数码管显示的程序实现. AVR单片机595驱动8位数码管的显示的电路实现 主程序代码 #include > #include //GCC中的延时函数头文件 ...

  4. 蓝桥杯51单片机之利用中断同时控制流水灯、数码管、独立按键、蜂鸣器【单片机开发初学者有趣综合案例】

    文章目录 一.流水灯与数码管 二.独立按键.数码管.流水灯.蜂鸣器 一.流水灯与数码管 流水灯不断左移,通过外部中断0来控制数码管的显示. #include <reg52.h> #defi ...

  5. 蓝桥杯51单片机之串口通信发送接收信息【单片机开发初学者串口必会】

    文章目录 一.上位机发送信号控制单片机 1.显示对应的流水灯 2.显示对应数码管 3.控制数码管显示的数字 二.两机收发信息 一.上位机发送信号控制单片机 1.显示对应的流水灯 实现现串口通信接收上位 ...

  6. 蓝桥杯51单片机学习——proteus8关于51工程文件的创建

    1.新建工程 2.选择路径 3.要设计电路,选隐含的模式 4.选择是否创建PCB板 一般不创建pcb 5.因为要进行仿真,选择固件模式 因为学习51单片机,所以选择AT89C5151控制器: 结合ke ...

  7. 蓝桥杯51单片机之利用中断实现倒计数与停表【单片机开发初学者掌握案例】

    文章目录 一.倒计数的实现 二.停表的实现 一.倒计数的实现 1.原理分析 倒计数的段选信号需要由一个数组存放起来: code uchar table[]={0x6F, 0x7F, 0x07, 0x7 ...

  8. 蓝桥杯51单片机(一)超声波模块

    使用超声波模块并通过数码管显示距离 #include<stc15f2k60s2.h> #include"intrins.h" #define somenop {_nop ...

  9. 蓝桥杯学习03-共阳数码管的静态显示

    要点:数码管的显示原理与对应段码:数码管显示的相关思维 1.原理图接口对应: [注] Y6C控制公共端com,Y7C控制段码显示: com端:公共端控制数码管数字的显示: 2.共阳数码管F3461BH ...

最新文章

  1. 《面向对象程序设计》c++第五次作业___calculator plus plus
  2. 服务端统一时间戳 boost::date_time UTC
  3. javax.xml.datatype.XMLGregorianCalendar
  4. easyui前端实现多选框_EasyUI实现下拉框多选功能
  5. 读《自己动手写操作系统》
  6. yolov3-tiny 训练一个检测器(1)
  7. burpsuite工具抓取Https数据包
  8. 用python实现爬取百度贴吧的小项目
  9. 力扣(leetcode)66.加一——c语言新手入门
  10. 需要在计算机安装msxml版本,Win7安装Office2010提示需要MSXML 6.10.1129.0组件怎么办?...
  11. 简单谈谈编程语言(二)
  12. iOS 小技能:App Extension (App Extension类型、生命周期、App Extension通信、App Extension示例)
  13. FBReader 探究 2
  14. html按钮圆弧样式,几款不错的按钮样式汇总
  15. 后现代婚礼机器人显神通_看机器人“各显神通”
  16. 小米手机android目录在哪里设置字体,在哪里修改小米手机的字体大小
  17. Mac报错:TSM AdjustCapsLockLEDForKeyTransitionHandling_ISSetPhysicalKeyboardCapsLockLED Inhibit
  18. 高效通过,PMI-ACP 备考知识突击(九阴真经版)
  19. 《你好,数智新世界》系列访谈 对话数睿数据总裁刘超|企业级无代码赋能软件产业变革...
  20. IntelliJ IDEA 如何增加运行时候的内存

热门文章

  1. dbeaver导出excel文件_vue将数据导出为excel文件就是如此简单
  2. ionic ios查看大图报错 the file to show is not valid image,or could not be loaded
  3. volatile指令重排_学会了volatile,你变心了,我看到了
  4. linux精简版远程登录,Linux下如何定制SSH来简化远程访问
  5. shell正则表达式截取字符串_从CVE20208816聊聊shell参数扩展
  6. 浙江师范大学c语言函数实验答案,浙江师范大学《C语言程序设计》考试卷
  7. .net mysql 序号_MYSQL如何自动为查询数据的结果编上序号详解
  8. oceanbase mysql模式安装了obproxy之后的连接方法
  9. 每个做DBA的孩纸都是上辈子被drop的db
  10. Git 操作总结整合篇