51单片机制作进制转换器论文

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于STC89C51单片机的进制转换器此设计是一个将0~15这16个数字转换为二进制、八进制、十进制和十六进制的进制转换器。它是由51单片机、独立按键、4x4矩阵按键和4x8段共阴极数码管组合在一起,进而实现进制转换的功能的。独立按键是用来选择进制模式的,矩阵按键则是用来输入需要转换的数字的,4个8段数码管是用来显示转换结果的。一、设计思路与总体方案进制转换器基本原理的逻辑框图如下所示:由上图可以看出,由独立按键控制进制模式选择,将选择的模式传给单片机,然后再将所要转换的数通过矩阵按键输入至单片机,单片机将数字转换完毕后,通过数码管显示出来,之后再按一下所选模式按键,退出当前进制转换模式,进入重新选择模式状态,再通过按下独立按键,选择其他模式。矩阵按键STC89C514X8段数码管独立按键进制模式选择数字输入系统方框图二、设计流程图2.1主函数流程图否检测是否相同独立按键按下转换键值进制数码管显示按键消抖松手检测调用矩阵键盘扫描子程序退出该进制模式松手检测按键消抖确定哪个独立按键按下进入相应进制转换模式开始检测是否有按键按下否是是2.2矩阵按键检测流程图三、总体设计与调试由第二节的主程序框图、子程序框图我们可以清楚地了解进制转换器的功能和操作流程,再由第一节的系统方框图可以了解它的基本电路设计。下面是用proteus模拟仿真软件所做的整体电路图:开始检测是否有按键按按键消抖列检测结束行检测读取键值松手检测否是四、设计总结总结:刚开始做这个设计的时候我们都不知道怎么下手,脑子里只能想到一些零零散散的程序,不知道该如何拼接,使它们实现自己想要的功能。当时的想法很好,很快就想出了要做一个进制转换器,但一想到怎么开始就无从下手了。最后在我们的讨论中,渐渐理清思路,明白了该怎么拼接程序,知道了该怎么嵌套子程序,怎么将键盘扫描和数码管显示结合起来。经过讨论后,我们将程序基本写完,进行调试。在调试过程中,出现了很多问题。烧录好程序后,在进行第一次模式选择时,可以进入进制转换,并显示,但我们发现如果想换一种进制模式时,按其他独立按键则无效,回到程序我们发现进入一个循环后,无法跳出,只能在里边循环,导致无法选择其他进制模式。我们思考后加入了再按一次原来的独立按键跳出循环的语句,便实现了可以选择其他模式的功能。解决了这一问题后,进制转换器便可以实现我们想要的功能了。通过本次设计,使我们对已学过的数码管动态显示、矩阵键盘的扫描以及独立按键的应用等知识有了更深一步的了解,也让我们能够更熟练的运用这些知识,锻炼和培养了自己利用已学知识来分析和解决实际问题的能力,通过本次设计对我们以后的学习有很大的帮助。缺点:1、在选择完一个进制转换模式后,不能直接切换到另一种进制转换模式,需先按下原来的进制模式按键才能退出原来的进制模式。2、在上一个进制转换模式退出后不能对输入数字清零,进入下一模式后,会自动显示原来数字对应当前进制的数字。五、附录5.1元件清单名称数量STC89C51单片机14X8段数码管14X4矩阵键盘1独立按键45.2数码管数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。4x8段数码管引脚图5.3矩阵键盘行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。5.4主程序/********************************************************************设计名:进制转换器*使用的IO:数码管使用P0口段选,P2口位选,键盘使用P3.0、P3.1、P3.2、P3.3*实验效果:将0-15数字进行进制转换********************************************************************/#includereg51.h#defineGPIO_DIGP0//宏定义段选#defineGPIO_KEYP1//宏定义键盘sbitW1=P2^0;//位选sbitW2=P2^1;sbitW3=P2^2;sbitW4=P2^3;sbitK1=P3^0;sbitK2=P3^1;sbitK3=P3^2;sbitK4=P3^3;voiddelay(unsignedintms)//延时函数{unsignedinti,j;for(i=0;ims;i++)for(j=0;j100;j++);}unsignedcharcodeDIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//十六个数字0123456789AbCdEF的显示码unsignedcharKeyValue;//用来存放读取到的键值voidKeyDown();//检测按键函数/*********************************************************************函数名:main*函数功能:主函数********************************************************************/voidmain(void){while(1){intflag=1;if(K1==0)//进行二进制转换{delay(10);if(K1==0){while(K1!=0);//松手检测while(flag==1){KeyDown();GPIO_DIG=DIG_CODE[KeyValue/8];W1=0;delay(1);W1=1;GPIO_DIG=DIG_CODE[KeyValue%8/4];W2=0;delay(1);W2=1;GPIO_DIG=DIG_CODE[KeyValue%8%4/2];W3=0;delay(1);W3=1;GPIO_DIG=DIG_CODE[KeyValue%8%4%2];W4=0;delay(1);W4=1;if(K1==0){delay(10);if(K1==0){while(K1!=0);flag=0;break;}}}}}elseif(K2==0)//进行八进制转换{delay(10);if(K2==0){while(K2!=0);while(flag==1){KeyDown();GPIO_DIG=DIG_CODE[KeyValue/8];W3=0;delay(1);W3=1;GPIO_DIG=DIG_CODE[KeyValue%8];W4=0;delay(1);W4=1;if(K2==0){delay(10);if(K2==0){while(K2!=0);flag=0;break;}}}}}elseif(K3==0)//进行十进制转换{delay(10);if(K3==0){while(K3!=0);while(flag==1){KeyDown();GPIO_DIG=DIG_CODE[KeyValue/10];W3=0;delay(1);W3=1;GPIO_DIG=DIG_CODE[KeyValue%10];W4=0;delay(1);W4=1;if(K3==0){delay(10);if(K3==0){while(K3!=0);flag=0;break;}}}}}elseif(K4==0)//进行十六进制转换{delay(10);if(K4==0){while(K4!=0);while(flag==1){KeyDown();GPIO_DIG=DIG_CODE[KeyValue];W4=0;delay(1);W4=1;if(K4==0){delay(10);if(K4==0){while(K4!=0);flag=0;break;}}}}}}}/*********************************************************************函数名:KeyDown*函数功能:检测有按键按下并读取键值********************************************************************/voidKeyDown(void){chara=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{delay(10);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{//测试列GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07):KeyValue=0;break;case(0X0b):KeyValue=1;break;case(0X0d):KeyValue=2;break;case(0X0e):KeyValue=3;break;}//测试行GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70):KeyValue=KeyValue;break;case(0Xb0):KeyValue=KeyValue+4;break;case(0Xd0):KeyValue=KeyValue+8;break;case(0Xe0):KeyValue=KeyValue+12;break;}while((a50)&&(GPIO_KEY!=0xf0))//检测按键松手检测{delay(10);a++;}}}}

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功