收藏 分享(赏)

51单片机应用:8只数码管同时显示多个不同字符.doc

上传人:cjc2202537 文档编号:1315877 上传时间:2018-06-23 格式:DOC 页数:4 大小:51KB
下载 相关 举报
51单片机应用:8只数码管同时显示多个不同字符.doc_第1页
第1页 / 共4页
51单片机应用:8只数码管同时显示多个不同字符.doc_第2页
第2页 / 共4页
51单片机应用:8只数码管同时显示多个不同字符.doc_第3页
第3页 / 共4页
51单片机应用:8只数码管同时显示多个不同字符.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、51 单片机应用:8 只数码管同时显示多个不同字符设 计 要 求单片机控制 8只数码管,同时显示 8个字符。例如,从左至右显示“12345678”,接着显示“23456781” ,在接着显示“34567812” , “81234567”, “12345678” ,分析及方案设计:本题可以采用扩展 I/O口或直接用单片机自身的 I/O口的方法实现。为节省硬件设施并使电路连线尽量简单,采用直接使用单片机自身 I/O口的方式,8 个数码管同时显示数字则需采用动态显示方法,初步设定以 P0口给出数码管显示字段,P1 口选中某一时刻动态点亮的数码管。软件设计可以有以下几种方案:a) 将全部显示状态列出,

2、放在主程序中不断循环b) 将显示状态放入 8个数组中,每个状态循环一次后主程序重新开始循环c) 只设置两个数组,其中一个取值不变,为正序的从 1到 8的共阳极数码管段码,另一个数组中的数值不断被修改,即每次显示状态改变的时候都相应改变一次,如从12345678的段码改为 23456781的段码。从上述方案可以看出,若设置太多的数组或列出所有显示状态,程序虽然清晰易懂但占用程序存储空间明显较大,且用 delay()函数延时的话会不断占用 CPU;用两个数组和两个定时器虽然算法略复杂,但程序可以达到最简化。详细的方案说明:1) 采用数码管动态显示方法。2) 8个数码管由 P3控制位选,即决定某一时

3、刻哪一个数码管亮,由 P0发出的总线控制显示的段码。3) 定时器 T0和 T1同时工作,定时时间均为 0.5毫秒,采用方式 1定时,每次溢出后由软件重装初值。4) 设置中间变量 temp,用于不断左移并给 P3赋值;数组 display为 code即取之不变的数组,数组 show中的取值变化。5) 每次 T0计数溢出时,temp 左移一次,相应的 P3左移一次,数码管由第 i个点亮变为第 i+1个点亮,与此同时赋给 P0口的值由 showi变为 showi+1,达到动态显示的效果。6) 定时器 T1也是每 0.5毫秒计数溢出一次,但只有到 1秒时才执行定时器 1中断中修改数组 show取值的程

4、序,用变量 t记录 T1溢出的次数,达到 200次时数组 show中的内容开始进行修改并且 t清零。假设 showp0到 show7中的取值分别为共阳极数码管显示 1、2、3、4、5、6、7、8 的段码,修改后分别变为显示2、3、4、5、6、7、8、1 的段码,这样显示状态自然发生了改变。7) 修改 show中的取值为本程序中细节最多的部分,设置无符号长整型变量 n(无符号长整型变量的取值为 0到 4294967295,按 1秒增加 1的速度计算,在实验范围内不会溢出)为显示状态总共改变的次数,易知 show0的值为 displayp,p 为 n除以 8的余数,从此处开始循环给 show重新赋

5、值。硬件电路设计:程序:#include#includeint i,t,m,a;unsigned long n;unsigned char code display=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80;unsigned char show=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80; /数组 display的取值不变,数组 show的取值每次显示状态改变时均改变一次,T0 中断程序只管流水使得位选从 0到 7时依次显示 show中从 0到 7的取值/unsigned char temp; /定时器 T1中断程序控制

6、数组 show取值的改变,使得现实状态相应改变/unsigned char middle; /i用于 T0的计时循环,取值从 0到 7,控制 P1口位选的流水;t 用于 T1的循环,控制每个显示状态(12345678 或 23456781等)的时间,1s改变一次,即 t的取值从 0到 200/n记录显示状态改变的次数,每次改变时 m从 0到 7为数组 show循环赋值,a 为中间变量,保证第 n次显示状态时 show的第 0个取值恰好为 n除以 8的余数被记录下来/void main()TMOD=0x11; /设置定时器 T0、T1 均为方式 1工作TH0=0xee; /写入定时器 T0的高

7、8位TL0=0x00; /写入定时器 T0的低 8位TH1=0xee; /写入定时器 T1的高 8位TL1=0x00; /写入定时器 T1的低 8位EA=1; /打开总中断ET0=1; ET1=1; /定时器中断允许位置 1TR0=1;TR1=1; /定时器开始工作i=0;temp=0x01;P3=temp; /给变量设定初值P0=showi; /第一个数码管开始显示数字 1while(1) /空的循环作为主程序,中断返回后回到主程序;void t0int(void) interrupt 1 /定时器 T0中断服务程序TH0=0xee; /给 T0重新装入 16位初值,重新开始计数TL0=0x

8、00;i+; /预备动态点亮下一个数码管if(i=8) /判断 i的数值,若超过 0到 7的范围,清零i=0;temp=_crol_(temp,1); /给即将动态点亮的数码管位选加高电平P3=temp; /位选从 P3送出,数码管被选中P0=showi; /P0发送总线信息为改点亮的数码管的编码,第 i个数码管显示 showi void t1int(void) interrupt 3 /定时器 T1的中断服务程序,内容为数组 show的改写,从而改变显示状态TH1=0xee;TL1=0x00; /定时器 T1重新装初值if(t200) /判断 t的数值,若 t200,即没到 1秒钟,显示状态

9、不改变,t 增一计数;若 t到 200,开始修改显示状态t+;elset=0; /定时器 T1计数溢出 200次,到达时间 1秒钟,t清零重新开始 1秒钟计时n+; /n为总的显示状态改变次数,每次改变显示状态,n加 1a=n%8; /a为 n除以 8的余数,记录不断变化数组 show应取的第一个值在不变的数组 display中的位置for(m=0;m8;m+)if(a8) /若 a小于 8,displaya赋值给 show0,displaya+1赋值给 show1.middle=displaya;/middle做中间变量,在数组 display和 show之间传递数值showm=middle; /每次赋值之后 a加 1a+;else /a的值需要不断进行判断,若 a到达 8则将 a清零,否则数组出错a=a-8;middle=displaya;showm=middle;a+;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报