- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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=
您可能关注的文档
最近下载
- 全国生态状况调查评估技术规范——生态系统服务功能评估(HJ 1173—2021).pdf VIP
- 北师大版四年数学上册六除法《路程、时间与速度》课件.pptx VIP
- 2025年一季度专题党课讲稿讲稿:提升党性修养践行使命担当.pptx VIP
- 频率选择表面赋能多功能隐身雷达天线罩:理论、设计与应用探索.docx
- 小学一年级数学思维训练题-直接打印版.pdf VIP
- 全国生态状况调查评估技术规范——荒漠生态系统野外观测(HJ 1170—2021).pdf VIP
- DB35T 2081-2022 工程建设项目电子文件归档一体化管理技术要求.pdf VIP
- 钢筋混凝土化粪池22S702.pdf VIP
- 最全面人教版八年级上册英语第一单元知识点归纳总结.pdf VIP
- 钢结构工程施工质量验收规范.PDF VIP
文档评论(0)