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

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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
51单片机应用:8只数码管同时显示多个不同字符

51单片机应用:8只数码管同时显示多个不同字符 设计要求 单片机控制8只数码管,同时显示8个字符。例如,从左至右显示,接着显示,在接着显示,…… , , 分析及方案设计:本题可以采用扩展I/O口或直接用单片机自身的I/O口的方法实现。为节省硬件设施并使电路连线尽量简单,采用直接使用单片机自身I/O口的方式,8个数码管同时显示数字则需采用动态显示方法,初步设定以P0口给出数码管显示字段,P1口选中某一时刻动态点亮的数码管。 软件设计可以有以下几种方案: 将全部显示状态列出,放在主程序中不断循环 将显示状态放入8个数组中,每个状态循环一次后主程序重新开始循环 只设置两个数组,其中一个取值不变,为正序的从1到8的共阳极数码管段码,另一个数组中的数值不断被修改,即每次显示状态改变的时候都相应改变一次,如段码改段码。 从上述方案可以看出,若设置太多的数组或列出所有显示状态,程序虽然清晰易懂但占用程序存储空间明显较大,且用delay()函数延时的话会不断占用CPU;用两个数组和两个定时器虽然算法略复杂,但程序可以达到最简化。 详细的方案说明: 采用数码管动态显示方法。 8个数码管由P3控制位选,即决定某一时刻哪一个数码管亮,由P0发出的总线控制显示的段码。 定时器T0和T1同时工作,定时时间均为0.5毫秒,采用方式1定时,每次溢出后由软件重装初值。 设置中间变量temp,用于不断左移并给P3赋值;数组display[]为code即取之不变的数组,数组show[]中的取值变化。 每次T0计数溢出时,temp左移一次,相应的P3左移一次,数码管由第i个点亮变为第i+1个点亮,与此同时赋给P0口的值由show[i]变为show[i+1],达到动态显示的效果。 定时器T1也是每0.5毫秒计数溢出一次,但只有到1秒时才执行定时器1中断中修改数组show[]取值的程序,用变量t记录T1溢出的次数,达到200次时数组show[]中的内容开始进行修改并且t清零。假设showp[0]到show[7]中的取值分别为共阳极数码管显示1、2、3、4、5、6、7、8的段码,修改后分别变为显示2、3、4、5、6、7、8、1的段码,这样显示状态自然发生了改变。 修改show[]中的取值为本程序中细节最多的部分,设置无符号长整型变量n(无符号长整型变量的取值为0到4294967295,按1秒增加1的速度计算,在实验范围内不会溢出)为显示状态总共改变的次数,易知show[0]的值为display[p],p为n除以8的余数,从此处开始循环给show[]重新赋值。 硬件电路设计: 程序: #includereg51.h #includeintrins.h int 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中断程序控制数组show[]取值的改变,使得现实状态相应改变// unsigned char middle; //i用于T0的计时循环,取值从0到7,控制P1口位选的流水;t用于T1的循环,控制每个显示状态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的高8位 TL0=0x00; //写入定时器T0的低8位 TH1=0xee; //写入定时器T1的高8位 TL1=0x00; //写入定时器T1的低8位 EA=1; //打开总中断 ET0=1; ET1=1; //定时器中断允许位置1 TR0=1; TR1=

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档