(单片机程序设计)51单片机控制2位一体单片机数码管动态显示实现00到23

单片机、电路板
连接器、接插件
其他元器件
51单片机数码管动态显示程序
51单片机数码管动态显示程序
单片机数码管动态显示程序实验,数码管显示一般分静态显示及动态显示两种驱动方式,静态显示占用口线比较多,本文介绍的是如何实现数码管动态显示,应该说数码管动态显示是单片机外部指令输出的重要途径,因此如何设计数码管以及数码管的工作原理、数码管显示的方法、数码管显示的抗干扰设计等在单片机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种数码管动态
数码管动态显示程序实验,数码管显示一般分静态显示及动态显示两种驱动方式,静态显示占用口线比较多,本文介绍的是如何实现数码管动态显示,应该说数码管动态显示是单片机外部指令输出的重要途径,因此如何设计数码管以及数码管的工作原理、数码管显示的方法、数码管显示的抗干扰设计等在单片机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种数码管动态显示的工作原理与读取方式。   s1 bit p0.0 ;数码管位定义   s2 bit p0.1   s3 bit p0.2   s4 bit p0.3   s5 bit p0.4   s6 bit p0.5   s7 bit p0.6   s8 bit p0.7   LED_data equ p2 ;数码管数据定义   org 00程序开始   主程序开始处   org 030主程序从30H开始   main: MOV sp,#30设置堆栈   调用初始化程序   lcall pro_8调用数码管显示程序   返回   ;********* 初始化程序 **************   rest:MOV a,#00清寄存器   MOV b,#00清寄存器   MOV p0,#0 ;禁止数码管显示   MOV p2,#255 ;   MOV p1,0禁止LED显示   禁止蜂鸣器   返回   ;******** 数码管显示程序 ***************   pro_8led:   MOV b,#32 ;一共显示32个数字   clr psw.3 ;重新设置寄存器组   setb psw.4 ;   MOV r0,#00数据显示从0开始   MOV r1,#01数码管从第1个开始   loop:MOV p0,r1 ;点亮当前数码管   MOV a,r0 ;准备第一个数据   MOV dptr,#tab_获得表头   MOVc a,@a+得到第一个数据   MOV led_data,输出到显示数据口    500 ms 延时    1 s 延时   inc r0 ;准备下一个数据   MOV a,r1 ;准备下一位数码管   设置下一个数码管   jc c1 ;8位全部显示,转移   MOV r1,否则,设置下一位   djnz b,32个数没有显示完,返回显示   否则返回主程序   c1: MOV r1,#1 ;8位显示完,重新开始循环   设置显示位   djnz b,32位显示完则返回重新显示   否则返回到主程序   ;************* 数码管显示 *******************************   ;************* 软件延时 500ms *****************************   delay: 保存原来的寄存器内容   clr psw.3 ;   clr psw.4 ; 设置新的寄存器组   MOV r0,#2 ; 延时参数1   MOV r1,#250 ; 延时参数2   MOV r2,#2 ; 延时参数3   dl1:djnz r0,dl1 ; 延时循环1   MOV r0,#250 ;   dl2:djnz r1,dl1 ; 延时循环2   MOV r0,#240 ;   MOV r1,#248 ;   dl3:djnz r2,dl1 ; 延时循环3    定时精度调整    恢复原来的寄存器    返回   ;**********************************************************   ;**********************************************************   ;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16   ; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推   tab_nu:   db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8 数字0-7 不带小数点代码   db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8 数字8-f 不带小数点代码   db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78 数字0-7 带小数点代码   db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0 数字8-f 带小数点代码
上一篇:已经是第一篇
型号/产品名
深圳市福田区新亚洲文佳新电子商行
深圳市赛恒电子科技有限公司
华强电子网测试账号-huangxiaobo怎样用keil编写4位数码管显示1234的程序
我的图书馆
怎样用keil编写4位数码管显示1234的程序
为了帮助网友解决“怎样用keil编写4位数码管显示1234”相关的问题,中国学网通过互联网对“怎样用keil编写4位数码管显示1234”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:怎样用keil编写4位数码管显示1234的程序,具体解决方案如下:解决方案1: 你具体哪一步不会呢。 追问: 我就是不懂编程,老师让我们做4位LED数码管动态显示设计,用Keil和protues两个软件 回答: keil是汇编软件生成hex文件,然后加载到proteus里面就可以仿真了。你是不懂代码怎么写呢,还是不会用软件呢 追问: 两个软件都差不多会用了,就是不会写那个程序,你能不能帮帮我呢? 回答: /***************************************************************************标题:&数码管的显示效果:&显示1234,从这个例子可以学习多位数码管的动态显示技术******************************************************************************///头文件:#include 'reg51.h'//变量定义:unsigned char table[]=&&&{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};&&&&&//表:共阳数码管 0-9 //引脚定义:&&sbit SMG_q = P1^0;&//定义数码管阳级控制脚(千位)sbit SMG_b = P1^1;&//定义数码管阳级控制脚(百位)sbit SMG_s = P1^2;&//定义数码管阳级控制脚(十位)sbit SMG_g = P1^3;&//定义数码管阳级控制脚(个位)//函数声明:void delay(void); //延时子函时//主函数,C语言的入口函数:&&void main(void)& {&unsigned char i=0;&//作为查表的索引号&while(1)&&&//不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,&{&//数码管显示 1234,可自行修改&&SMG_q=0;&&//选择千位数码管&&P0=table[1];&//查找'1'定义好的数码管段值与P0口输出,显示相应的1&&delay();&&//加入短暂延时&&P0=0XFF;&&//清除数码管显示,因是共阳型,所以不是0&&SMG_q=1;&&//关闭千位数码管&&SMG_b=0;&&//选择百位数码管&&P0=table[2];&//查找'2'定义好的数码管段值与P0口输出,显示相应的2&&delay();&&//加入短暂延时&&P0=0XFF;&&//清除数码管显示,因是共阳型,所以不是0&&SMG_b=1;&&//关闭百位数码管&&&&SMG_s=0;&&//选择十位数码管&&P0=table[3];&//查找'2'定义好的数码管段值与P0口输出,显示相应的2&&delay();&&//加入短暂延时&&P0=0XFF;&&//清除数码管显示,因是共阳型,所以不是0&&SMG_s=1;&&//关闭十位数码管&&SMG_g=0;&&//选择个位数码管&&P0=table[4];&//查找'2'定义好的数码管段值与P0口输出,显示相应的2&&delay();&&//加入短暂延时&&P0=0XFF;&&//清除数码管显示,因是共阳型,所以不是0&&SMG_g=1;&&//关闭个位数码管&}}//延时子函数,短暂延时void delay(void){&&&unsigned char i=10;&while(i--);} 追问: 额,我在那个Keil软件里就写这个吗?全部都要写吗? 回答: 恩,不清楚再问我。 追问: 后面的中文注释也要输进去啊,那我是不是可以直接复制啊? 回答: 后面的中文是注释,不参加编译,只是为了你看着方便。你全部复制下来,一个字都不用改的。不清楚再问我 追问: 我能不能加一下你的QQ啊,我好像有好多问题的,怕说不清楚,拜托啦 回答: 看来你的C语言也没学好。 追问: 就是没学过啦,老师都让我们自学呢,可是我又比较笨啊,额,帮帮忙啦,加一下QQ啦,我不会骚扰你的啊 回答: 留下你的,我加你吧 追问: 太感谢你啦,我的QQ是 解决方案2: 这是用C编的:共阴数码管#include&reg52.h&#define uint unsigned int#define uchar unsigned charsbit dula=P2^6;sbit wela=P2^7;uint temp=1234;uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;void play(uint);void delay(uint);void main() {while(1) {play(temp); }}void play(uint temp){dula=1;P0=table[temp/1000];dula=0;P0=0 wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[temp%];dula=0;P0=0 wela=1;P0=0wela=0;delay(5);dula=1;P0=table[temp%];dula=0;P0=0wela=1;P0=0wela=0;delay(5);dula=1;P0=table[temp%10];dula=0;P0=0wela=1;P0=0wela=0;delay(5);}void delay(uint z){uint x,y;for(x=z;x&0;x--)for(y=110;y&0;y--);}解决方案3: 刚刚认识keil软件怎么学才能学的好哦。。 有什么好书货好资料推诚下吗。 谢谢。 通过对数据库的索引,我们还为您准备了:问:尽量给代码 我是初学者 还有不懂的那些硬件的接法 解读器 还有数码管怎...答:#include #include sbit wei=P1^0; sbit duan=P1^1; int w[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; int i, void main() { TMOD=0X01; TH0=()/256; TL0=()%256; EA=1; ET0=1; TR0=1; tt=0; i=0; temp...===========================================问:尽量给代码 我是初学者 还有不懂的那些硬件的接法 解读器 还有数码管怎...答:很难么?有没有解码器哦,没解码器,用程序来解码。共阴还是共阳。基础还是得你自己去学习。===========================================问:尽量给代码 我是初学者 还有不懂的那些硬件的接法 解读器 还有数码管怎...答:MOV 31H,#01H MOV 32H,#02H MOV 33H,#03H MOV 34H,#04H MOV 35H,#05H MOV 36H,#06H ACALL D0 JMP $-2 D0: MOV R0,#31H MOV R2,#B MOV DPTR,#TAB D1: ORL P1,#B MOV A,@R0 MOVC A,@A DPTR MOV R3,#8 D2: RLC A MOV P3.2,C SETB P...===========================================问:我写的程序如下,第一行四个键盘,摁了没用,数码管没反应,其他的12个...答:第一行四个键盘,摁了没用,数码管没反应, ---- 是 1234 这四个按键吗? 程序,太长。 四行按键的程序,好像都是雷同的,应该没有什么问题。 键盘,是自己焊接的吗? 是不是某一个引脚,虚焊?===========================================问:#include&reg51.h& //#include&INTRINS.H& unsigned char a,b,c,d; unsi...答:/***************显示子程序**********************/ void display(unsigned char bai,unsigned char shi,unsigned char ge,unsigned char xs) { P3=dispbitcode[0]; P0=dispcode[bai]; //显示佰位 delay(5); P3=dispbitcode[1]; P0=dispcode[sh...===========================================问:#include&reg51.h&sbit a=P3^0;sbit b=P3^1;sbit c=P3^2;sbit d=P3^3;un...答:#include sbit a = P3^0; sbit b = P3^1; sbit c = P3^2; sbit d = P3^3; unsigned char code dcode[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay1ms(unsigned int x) { while(x--) for (j = 0...===========================================问:三个按键分别为开始、暂停、加\减。当系统复位后,初试时间为00.00.00,...答:我可以写C语言程序,名是联系 方式===========================================问:让89处1单片机驱动四位数码管,显示 1234.求电路图及程序!!!急!!!...答:下列程序经过实验,可以满足题目要求. ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV 70H, #04H MOV 71H, #03H MOV 72H, #02H MOV 73H, #01H ;------------------------------- M_LOOP: LCALL DISP AJMP M_LOOP ;------------------------------- DI...===========================================很难么?有没有解码器哦,没解码器,用程序来解码。共阴还是共阳。基础还是得你自己去学习。===========================================里边存放数码管显示0~9的数据,之后定义一个display显示函数,传递参数但不返回参数,然后将传递的参数()分解成4哥单个数,然后依次选择要显示的数码管和数据,紧...===========================================希望对你有帮助!呵呵俺又来了怎么还没有调试好呀俺来帮你调试吧 先看看错误的现象:是不是笔画混乱要显示1却显示的好像是8呀===========================================呵呵 俺又来了 怎么还没有调试好呀 俺来帮你调试吧 先看看错误的现象: 是不是笔画混乱 要显示1 却显示的好像是8呀=========================================== MAIN: MOV DPTR, #TABLE MOV R0, #00H MOV R1, #01H START: MOV A, R0 MOVC A, @A DPTR MOV P2, A MOV P1, R1 MOV A, R1 RL A MOV R1, A C...=========================================== n2=N/100%10; n3=N/10%10; n4=N%10; P1_0=0; //P1_0 P1_1 P1_2 P1_3分别为四位的位选,P0为断选, P0=table[n1]; //table为数码管八...===========================================方法一:两个HD7279,正好可以驱动16个数码管,电路简单,不占单片机资源 方法二:74HC154译码扫描,或者两个P口扫描,需要16个三极管驱动或者两片ULN2003之类的,比较占用...===========================================是显示问题,和DS18B20无关。你先做一个简单的四位数码管显示,如显示1234,可以了再找测温程序 的问题。===========================================这是可以的,分别让两个四位数码管显示四位数,合在一起就是八位数。原理:两个四位数码管的数据针脚分别相连后,与P0口相连;位选针脚分别与P3口相连,这样就实现了用两个...=========================================== dis_buf[5]=350.5/100; //得出百位3 count=350.5%100;//得出余数50.5 dis_buf[6]=50.5/10; //得十位 dis_buf[7]=50.5%10; //得余数0.5 dis_buf[8]=0.5/1; //得个位0 dis_buf[8]=0.5%...===========================================
猜你感兴趣:
淘宝热门折扣推荐:
喜欢该文的人也喜欢&>&基于51单片机的数码管显示时钟电路图与c程序
基于51单片机的数码管显示时钟电路图与c程序
上传大小:1.18MB
基于51单片机的数码管显示时钟电路图与c程序 有原理图和PCB 源代码 调试成功,保证好用。
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有6条
很有借鉴价值,楼主辛苦了,谢谢!
是4位数码管,可以参考使用的
有些帮助,是4位数码管。
综合评分:
积分/C币:3
综合评分:
积分/C币:3
无敌猥琐星
综合评分:
积分/C币:3
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
基于51单片机的数码管显示时钟电路图与c程序
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
zhangweikeven
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
基于51单片机的数码管显示时钟电路图与c程序51单片机开发系列三_数码管动态扫描显示
51单片机开发系列三
数码管动态扫描显示
数码管由于发光亮度强,指示效果好,非常适合于电梯楼层等数值显示应用中。对于一位数码管,可以采用静态显示,但实际应用中都是需要显示多位数值,数码管模块也只能动态显示,因此笔者在这里简单分析一下数码管动态扫描驱动的实现。
1. 数码管原理概述
数码管由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。数码管根据内部接法又可分成共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管(如下图SM*10501),共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管如下图(SM*20501)。以共阳数码管为例,要想显示数字2,需把A、B、G、E、D段点亮,即公共端接上正电源,ABGED段阴极拉低,其余段拉高即可显示数字2。
2. 硬件设计
笔者此处以四位一体共阳数码管显示为例讲解其大概的硬件设计。
微控制器的IO口均不能流过过大的电流,LED点亮时有约10ms的电流,因此数码管的段码输出不要直接接单片机IO口,应先经过一个缓冲器74HC573。单片机IO口只需很小的电流控制74HC573即可间接的控制数码管段的显示,而74HC573输出也能负载约10ms的电流。设置数码管段的驱动电流为ID=15ma,这个电流点亮度好,并且有一定的裕度,即使电源输出电压偏高也不会烧毁LED,限流电阻值
R = (VCC- VCE – VOL – VLED) / ID
VCC为5v供电,VCE为三极管C、E间饱和电压,估为0.2v, VOL为74hc573输出低电平时电压,不同灌电流,此值不一样,估为0.2v,具体查看规格书,VLED为红光驱动电压,估为1.7v,根据上式可算出限流电阻为R = 200R。
数码管需接收逐个扫描信号,扫描到相应数码管时,对应的段码数据有效,即显示这个数码管的数值。笔者采用三线八线译码器74HC138来产生对应的扫描线信号。
当各个段码均点亮时,电流约15max8=90ma流过数码管公共端,74HC138无法直接驱动这个电流,需加三极管驱动,由于74HC138输出低电平有效,此处只有PNP三极管适合作为驱动。三极管基极电流设为2ma即可让三极管饱和,最大驱动电流远大于90ma。基极偏置电阻阻值
Rb =(VCC - VEB – VOL) / IB
VCC为5v供电,VEB为三极管E、B间的导通电压0.7v,VOL为74hc138输出低电平时电压,可根据规格书估为0.3v,故Rb = 2k即可。
图2-1 四位一体数码管原理图
3. 驱动实现
数码管段码接P0口,位码接P2口第0~2位。对于LED显示器都是有一个刷新频率的,同样对于数码码动态扫描也需要一个扫描频率。扫描频率下限为50HZ,低于一定的扫描频率,显示会闪烁。频率过高,则亮度较差且占用cpu资源。一般整个数码管扫描一遍时间为约10ms较合适(即扫描频率100HZ),我们用的是四位数码管,每个数码管点亮时间为2ms,扫描一遍时间为8ms。为保证这个刷新频率,通过是通过定时器来周期性进行数码管刷新。笔者在此以四位一体数码管实现秒表计数显示为例来作代码开发。
数码管动态显示功能实现模块文件DigitalTubeTable.c内容如下:
#include "reg52.h"
#include"DigitalTube.h"
// 数值相对应的段码,共阳极
static unsigned char codeDigitalTubeTable[12]= { // 共阳LED段码表
0xc0, 0xf9, 0xa4, 0xb0, 0x99,0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xbf
"9" "不亮"
// 每个数码管需一个字节的内存保存对应数码管数据
static unsigned charFrameBuffer[DigitalTubeNumber];
unsigned char*DigitalTube_GetBuffer()
return FrameB
void DigitalTube_Scan()
static unsigned char Select = 0; // 记录扫描的选择线
unsigned char C
// 从对应选择线中找到显存数据,并得到相应的段码
Code = DigitalTubeTable[FrameBuffer[Select]];
// 段码实际输出到数码管接口
DigitalTube_Data(Code);
// 位选实际输出到数码管接口
DigitalTube_Select(Select);
Select++; // 进入到下一位选扫描
if (Select &= DigitalTubeNumber) {
Select = 0;
// 所有数码管已扫描,从第一个数码管再次开始扫描
我们在数码管模块头文件DigitalTube.h中实现模块的接口访问宏实现,使之方便移植及修改接口配置。模块头文件同时也引出模块的接口函数,void DigitalTube_Scan(void)为数码管刷新函数,需周期性调用刷新数码管显示。unsigned char *DigitalTube_GetBuffer(void)用来获得数码管显存,从而更新数码管显存数据。其内容如下:
#ifndef __DigitalTube_H__
#define __DigitalTube_H__
#ifdef __cplusplus
extern "C" {
// 数码管模块中的个数,最大为8
#define DigitalTubeNumber
// 输出数码管位选
#defineDigitalTube_Select(Select) {P2 = (P2&0xf8) + (Select);}
// 输出数码管段码
#define DigitalTube_Data(Dat)
{P0 =(Dat);}
// 数码管刷新函数,必须保证以一定周期调用刷新
void DigitalTube_Scan(void);
// 获得数码管显存,以作显示的数据更新
unsigned char*DigitalTube_GetBuffer(void);
#ifdef __cplusplus
#endif /*__DigitalTube_H__*/
外部模块通过引入数码管的模块头文件DigitalTube.h来实现调用数码管驱动函数,简单测试调用(秒表数码管显示计数)实现如下:
#include"reg52.h"
#include"DigitalTube.h"
// 以定时器时间为计时标准,记录时间间隔
static volatile unsignedint SystemTick = 0;
// 定时器2ms中断处理进行数码管刷新
void T0_Interrupt()interrupt 1
TH0 = () / 256;
TL0 = () % 256;
SystemTick++; // 记录时间间隔
DigitalTube_Scan();
//刷新数码管
void T0_Init()
TMOD = 0x01; // 定时器0工作方式1
// 2ms计时中断(12M)
TH0 = () / 256;
TL0 = () % 256;
ET0 = 1; // 定时器T0中断允许
EA = 1; // 总中断允许
void main()
unsigned char *pB
// 定时器初始化
T0_Init();
// 获得数码管显存,以作更新数据显示
pBuffer = DigitalTube_GetBuffer();
// 数据管显存初始化显示0
for (i=0; i&DigitalTubeN i++) {
pBuffer[i] = 0;
// 开启定时器进行计时以及数码管刷新
while(1) {
// SystemTick读数到500时为1s间隔到
if (SystemTick & 500) {
SystemTick =0; // 重新计秒
// 更新数码管秒表计数显存
for (i=0; i&DigitalTubeN i++) {
pBuffer[DigitalTubeNumber-1-i]++;
if (pBuffer[DigitalTubeNumber-1-i] &10) {
// 未到10,不用进位更新高位显存,退出
// 到10,这一位清0,并继续循环更新高位显存
pBuffer[DigitalTubeNumber-1-i] =0;
此章节的Keil工程,包含源码,Preteus仿真,包含仿真电路,可直接查看效果,DigitalTube.rar。
没有更多推荐了,}

我要回帖

更多关于 单片机数码管 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信