1、动力与能源学院2011级自动化专业 微控制器原理课程设计报告目 录第一部分 设计题目 2第二部分 设计要求 2第三部分 硬件设计 2 1 、 硬件设计原理 2 2 、 硬件设计电路 2第四部分 软件设计 3 1 、 软件设计思想 32 、 流程图 43 、 源程序 5第五部分 仿真功能 13第六部分 收获与总结14第七部分 附录 14一、 设计题目采用8031单片机设计键盘与显示。二、 设计要求 1. 采用4位数码管显示通过键盘所按的数;2. 设计键盘与显示硬件电路要求键盘有12个按键(09),一个确认键,一个开关键;3编写软件,要求将按键数字显示在数码管上,具体格式:按数字键n个,然后按确认
2、键,显示刚才键入的数。如果两次确认键之间按键数超过4位,则只显示按确认键最近的4位;如果两次确认键之间按键数少于4位,则显示实际按确位数;先按的键显示在高位。开关键用于显示的开关,按一开显示,再按一次关显示;4详细叙说软件设计方法。三、 硬件设计1、 硬件设计原理(1)的矩阵键盘,第1行与89C51的P3.0口相连,第2行与89C51的P3.1口相连,第3行与89C51的P3.2口相连;第1列与89C51的P3.4口相连,第2列与89C51的P3.5口相连,第3列与89C51的P3.6口相连,第4列与89C51的P3.7口相连。用来检测哪个按键被按下。(2)4个数码显示管,由89C51的P0口
3、通过两个74HC573芯片控制显示,其中P2.6通过控制一个573来控制段码输入(段选),P2.7控制另一个573从而控制位码的输入(位选)。2、 硬件电路图(1)独立矩阵键盘与8031单片机P3口的连接图:图1 (2)P0口控制数码管显示电路:图2(3)模拟仿真电路图:图3四、 软件设计1、 设计思想本题可分为两部分,一部分为键盘扫描,另一部分为显示,并且选定第三行第三列为“确定键”,第三行第四列为“显示键”。为了方便录入数据和显示,采用两个数组,一个作为接收数组,用来接收按键值,一个作为显示数组,作为动态扫描显示。采用赋值、读值的方法确定是否存在按键输入,若有按键输入,则依次按键位顺序赋给
4、接收数组高位0到9中的值(即按键值),每次有按键输入时数组左移,以保证每次数组中保留的都是最近的四个输入值。设置变量作为判定显示开关的依据,显示开时,将接收数组中的值赋给显示数组,用动态扫描的办法使数码管显示录入值。2、 流程图开始 接收按键输入显示=1?确定键?否 否 是 是接收数组值赋给显示数组接收数组初始化数码管显示数字3、 源程序(含注释) #include #define int8 unsigned char #define int16 unsigned int sbit dula=P26; /读段码,申明U1锁存器的锁存端 sbit wela=P27; /读位码,申明U2锁存器的锁
5、存端 /段码 code unsigned char seg_code=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00; int8 pre_array4=0x0a,0x0a,0x0a,0x0a;/接收按键数组 int8 hold_array=0x0a,0x0a,0x0a,0x0a;/显示数组 int8 a=0,temp; /a控制显示与否即显示键 ,n与key确定 int8 key=0xff; /key初始值 /延时程序 void delay(unsigned int x) unsigned char t; while(x-) fo
6、r(t=0;t120;t+); void main() int m; while(1) /扫描第一行是否有按键输入,若有则temp&0xf0!=0xf0,而后进入switch语句P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); /延时去抖操作 if(temp!=0xf0) /确定是否有输入 temp=P3; switch(temp) case 0xee: /第一行第一列 key=0; break; case 0xde: /第一行第二列 key=1; break; case 0xbe: /第一行第三列 key=2; break
7、; case 0x7e: key=3; break; while(temp!=0xf0) /等待按键释放 temp=P3; temp=temp&0xf0; /把最近的键盘输入值存入接收数组,保留最近四位 pre_array0= pre_array1; pre_array1= pre_array2 ; pre_array2= pre_array3; pre_array3=key; /扫描第二行是否有按键输入 P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(20); if(temp!=0xf0) temp=P3; switch(temp
8、) case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=7; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; pre_array0= pre_array1; pre_array1= pre_array2 ; pre_array2= pre_array3; pre_array3=key; /扫描第三行是否有按键输入 P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) del
9、ay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: /确定键 (此时按键为第3行第3列) /由按键存储数组到显示输出数组 hold_array0=pre_array0; hold_array1=pre_array1; hold_array2=pre_array2; hold_array3=pre_array3; /初始化for(m=0;m4;m+)pre_arraym=10; /按键接受数组准备下一轮的接收 break; case 0x
10、7b: /显示键a (此时按键为第3行第4列) a=a; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; if(key=8|key=9) pre_array0= pre_array1; pre_array1= pre_array2 ; pre_array2= pre_array3; pre_array3=key; /显示if(a) /显示键a为1输出,为0黑屏 /动态扫描法输出 dula=0; P0=seg_codehold_array0; dula=1; dula=0; wela=0; P0=0xfe; /选中第一位数码管 wela=1;
11、wela=0; delay(3); dula=0; P0=seg_codehold_array1; dula=1; dula=0; wela=0; P0=0xfd; wela=1; wela=0; delay(3);dula=0; P0=seg_codehold_array2; dula=1; dula=0; wela=0; P0=0xfb; wela=1; wela=0; delay(3);dula=0; P0=seg_codehold_array3; dula=1; dula=0; wela=0; P0=0xf7; wela=1; wela=0; delay(3); else /显示键a为
12、0,输出黑屏 dula=0; P0=seg_code10; /0x00 dula=1; dula=0; wela=0; P0=0xf0; wela=1; wela=0; delay(3); 五、功能仿真当按键的数目为n(n=4时,显示的是最近按下的四个。六、收获与总结通过本次课设,使我学会了PROTEUS软件和KEILC软件的基本使用。使我能够综合运用微型计算机技术、C语言程序设计以及数字电路、模拟电路等课程中学到的知识做一些简单的电子产品的仿真,使我对C语言有了更好的掌握和运用,用其进行软件编程更加顺手。初步掌握了KEILC和PROTEUS等软件,可以用C语言或汇编语言编写一个较完整的实用程
13、序。本次课设使我初步了解了单片机接口应用开发的全过程:分析需求、设计原理图、选用元器件、布线、编程、调试等。更重要的是,使我明白了无论是设计硬件电路还是编写相应的软件程序,我们应该时刻都要仔细认真。因为在这个过程中哪怕是出现一个小小的错误,都会导致不能仿真出正确的结果甚至根本不会出结果。课程设计的过程是一个不断学习的过程,我们需要充分利用好网络资源来解决我们在课设过程中遇到的问题,只有将遇到的问题解决好,才能真正的学到一些知识。七 、附录 元件清单: 器件 规格 数量 电阻 220 1 电阻 10k 2 电容 22pF 2 电容 10uF 2 STC89C52RC 1 晶振 11.0592MHz 1 数码管 共阴极 4 4X4矩阵键盘 1- 14 -