第一篇:实验四 单片机键盘输入以及数码管显示编程
仲恺农业工程学院实验报告纸
信息学院(院、系)专业班组单片机原理及接口技术课实验四单片机键盘输入以及数码管显示编程
一、实验目的1、掌握单片机键盘以及数码管显示的工作原理;
2、掌握单片机键盘以及数码管显示的编程方法。
二、实验内容
1、学习单片机键盘检测、消抖以及译码等;
2、学习单片机数码管静态以及动态的显示方式;
3、利用单片机键盘以及数码管编写程序驱动开发板上的蜂鸣器以及数码管按一定规律工作。
三、实验设备
1、STC单片机开发板;
2、PC机以及串口线。
四、实验步骤
参考实验指导书。
五、实验总结
第二篇:单片机数码管显示实验
实验一
数码管实验
一、实验目的
1.了解数码管的显示原理;2.掌握JXARM9-2440 中数码管显示编程方法
二、实验仪器
JXARM9-2440教学实验箱、ADT1000仿真器和ADT IDE集成开发环境、串口连接线、PC机。
三、实验原理
7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。
LED显示器的接口一般有静态显示与动态显示接口两种方式。
本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0 来选择相应的数码管,地址0x20006000 为数码管的数据寄存器。数码管采用共阳方式,向该地址写一个数据就可以控制LED 的显示,数据中的1对应的不亮,0对应的亮,数码管各位从高到低排列为dp-g-f-e-d-c-b-a,例如当数据寄存器是11111111时则不亮,当是01111111时则显示8,其原理图如图所示。
四、实验内容
1、编程实现:六个数码管同时正向显示0-F,然后反向显示F-0。
2、编程实现:在六个数码管上依次显示与自己姓名有关的内容,可分辨出轮流显示。
3、编程实现:在六个数码管上依次显示与自己姓名有关的内容,分辨不出轮流显示。
4*、编程实现:在每个数码管上递增显示0—9。5*、自行开发。
五、实验程序
1, /****************************************************************************/ /*文件名称: LEDSEG7.C
*/ /*实验现象: 数码管依次显示出0、1,2、„„
9、a、b、C、d、E、F
*/ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = {
/* 0
7*/
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8
A
B
C
D
E
F*/
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试
*/ /* 功能描述: 依次在7段数码管上显示0123456789ABCDEF
*/ /* 返回代码: 无
*/ /* 参数说明: 无
*/ /****************************************************************************/ void Test_Seg7(void){
int i;
*((U8*)0x20007000)=0x00;/*6个数码管都亮*/ for(;;){
/*数码管从0到F依次将字符显示出来*/
for(i=0;i<0x10;i++)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
}
/*数码管从F到0依次将字符显示出来*/
for(i=0x0f;i>0x00;i--)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
} }
// TODO } /****************************************************************************/
/* Function name : 循环延时子程序
*/ /* Description : 循环 'time' 次
*/ /* Return type :void
*/ /* Argument
: 循环延时计数器
*/ /****************************************************************************/ void Delay(int time){
int i;int delayLoopCount=10000;
for(;time>0;time--);
for(i=0;i 2, /****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象: 数码管依次显示ZHAngg,并能看出轮流显示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 在六个数码管上分别显示字母,与姓名有关 */ /* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(10000);} // TODO } /***************************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 3, /****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象: 数码管依次显示出ZHAngg,并看不出轮流显示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 在六个数码管上分别显示字母,与姓名有关 */ /* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(1);} // TODO } /***************************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 4, /****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象: 数码管依次显示出0、1,2、„„ 9、a、b、C、d、E、F */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* 0 7*/ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 依次在7段数码管各自递增显示0—9 */ /* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void){ int i;for(;;){ for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } } // TODO } /****************************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 六、实验结果与分析 实验一结果:六个数码管同时显示相同的符号,从0-F再由F-0之间的循环变换。 分析:在数码管扫描控制地址处选中六个数码管,使其同时亮,在给其数码管的数据寄存器存入不同符号对应的数值,加上相应的延迟,就 可以是轮流变换的循环的符号变换。 实验二结果:第一个数码管显示Z后,第二个显示H,接着第三个显示A,接着第四个显示n,接着第五个显示g,接着第六个显示g,接着第一个再显示Z…..如此循环。 分析:设置控制地址使其单独并且循环显示,每个数码管的数据寄存器送入不同的符号的数值,并设置较大的延迟时间即可产生该现象。 实验三结果:六个数码管一起显示“ZHAngg”。 分析:原理同实验二,只是将延迟时间改小到人眼无法分辨的地步即使一起显示。 实验四结果:第一个数码管显示0—9之后,第二个接着显示0—9,接着第三个,第四个….分析:设置循环使六个数码管循环单独显示,在每个数码管显示中再加入循环,使其递增显示0—9,设置较大的延迟,是我们可以看清实验现象。 七、实验总结与心得体会 本次试验需要了解数码管的基本工作原理,基于C语言设计编程完成实验,实验的关键在于把握实现各种现象的本质上的差异,在程序上作出修改。通过本次试验对于实验的严谨性有了进一步的体验,稍有不小心实验结果就适得其反,以后要更加用心,更加认真的做实验。 单片机数码管显示课程设计 目录引言...............设计任务和要求.............1 2.1 设计目的............1 2.2 设计意义............1总原理图及主要模块的流程图......1 3.1 总原理图及元器件清单..............1 3.2 主要流程图..........1性能测试与分析.............35 结论与心得..........4致谢...........4 参考文献.............4 单片机数码管显示课程设计引言 从上世纪70年代第一批单片机问世,短短二三十年时间,单片机技术已经成为计算机技术的一个重要分支,广泛运用到工业控制、仪器、仪表、消费产品,汽车、办公自动化和通信等领域。因此,单片机技术已经成为电子、测控、自动化、通信等许多工科专业学生的必备技能。 我用AT89C51芯片来设计一个简单的数码管显示。此设计给出了源代码,通过仿真测试,其性能指标达到了设计要求。 关键词:单片机,AT89C51,数码管设计任务和要求 2.1 设计目的1.学习基本理论在实践中综合运用的初步经验,掌握模拟电路设计的基本方法、设计步骤,培养综合设计与调试能力。 2.了解AT89C51这个芯片的使用和性能指标测试方法。 3.培养实践技能,提高分析和解决实际问题的能力。 2.2 设计意义 为了更好地熟悉和掌握单片机的基本功能和编程,掌握数码管动态扫描显示原理及实现方法。自我动态扫描显示电路驱动程序的编写方法。通过课程设计,达到理论与实际应用相结合,提高学生对微机硬件结构的软件设计方法的理解,使学生能够根据实际应用,初步实现硬件及软件的设计,对硬件开发有更深层的认识,为今后打软硬件开发,打下坚实的基础。总原理图及及主要模块的流程图 3.1 总原理图及元器件清单 (1)我用Proteus 7 professional来画出我设计的总原理图,如图3-1。 如图3-1 此电路图就用到AT89C51这个芯片,和一个数码管。 3.2 主要流程图(四号宋体加粗) 1.主程序的流程图 图3.2-1主流程图 2.子程序的流程图 图3.2-2子流程图性能测试与分析 主程序和子程序都存放在AT89C51单片机中。主程序的功能是:显示数字。子程序的功能有:延时。程序代码: ORG 0000H;初始化 LJMP START;转入主程序 ORG 0010H;初始化 START: CLR P2.7;P2.7←00H MOVR0,#00H;R0←00H MOV R2,#10;R2←10 MAIN: MOV DPTR,#TAB;DPTR←TAB MOV A,R0;A←(RO) MOVC A,@A+DPTR;A←((A)+(DPTR)) MOV P0,A;P0←(A) LCALL DELAY;调用延时程序 INC R0;RO←(R0)+1 DJNZR2,MAIN;判断 JMP START;循环 DELAY:;延时程序 MOV R3,#11 D1: MOV R4,#100 D2: MOV R5,#100 DJNZ R5,$ DJNZ R4,D2 DJNZ R3,D1 RET TAB: DB 00101000B;0 DB 11101011B;1 DB 00110010B;2 DB 10100010B;3 DB 11100001B;4 DB 10100100B;5 DB 00100100B;6 DB 11101010B;7 DB 00100000B;8 DB 10100000B;9 END 我用Proteus 7 professional 软件来测试我设计的电路图。当运行时,数码管显示0。如图4-1。 图4-1 当221ms后,数码管显示1。如图 4-2.图4-2 我的程序是一个循环的,一直到显示9,之后又重新开始显示0。在此不一一列出来。 为了能在实际在到应用,我用开发板来验证我所设计的电路图。其结果如下: 图4-3显示1 图4-4显示8 从仿真的结果可以看出,我的设计是满足我设计的要求的。结论与心得 通过单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。使之不断地战胜别人,超越前人。同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。 这个设计过程中,我遇到过许多次失败的考验,就比如,我在软件上仿真软件上能实现其功能,但是把它写进开发板就无法运行,我不停地找原因。最后我找到了答案,这样我明白,做设计不但是软件可以运行,用在硬件上一样是那么重要的。我做的这个设计主要是用AT89C51这个芯片来实现,这个芯片具有很多优点,程序简单易读,结构清楚,最重要的是成本低。很适合我们学生用来学生。在做这个设计的过程中,我也了解到了自己的不足,在日后的学习中,我还需加倍努力学习。 参考文献) [1]梁炳东.单片机原理与应用。北京:人民邮电出版社,2009 [2] [3]http://wenku.baidu.com/album/view/702db2c7aa00b52acfc7cae7 致谢(小三号 宋体 加粗) 在此次课程设计中,我遇到不懂的问题,老师和同学都帮我,让我把问题顺利地得到解决,最后完成此次课程设计报告。从中我学到了很多东西,在此,谢谢我的老师和同学,感谢你们在我遇到难题的时候帮我解答。 实验五 按键及七段数码管实验 一、实验目的1、熟悉keil软件; 2、掌握矩阵式按键的原理; 3、掌握七段数码管显示的原理; 4、掌握STC单片机的按键及数码管程序编写及下载; 二、实验要求 1、编写矩阵式按键的读取程序、七段数码管的动态显示程序,并将程序结合在一起,产生某一按键按下,显示对应键值的程序。 2、编写串行通信的发送及接收程序,实现串行口跟PC及的通信,并在PC机上用串口调试工具观察实验结果; 3、利用keil软件调试程序,并产生.hex文件; 4、将.hex文件利用STC单片机下载工具下载到单片机最小系统中,并观察LED灯的显示状态; 5、提交实验报告,报告包含程序及LED的显示结果。 三、实验内容 1、打开keil软件,熟悉软件的菜单、工作界面及工具。然后按照keil的编程步骤编写程序(创建工程----选择单片机AT89C51----新建源文件----保存为C程序----编写完整的C51程序----将文件添加到工程----编译并修改错误----连接产生.hex文件)。 2、打开STC下载软件,将keil生成的.hex文件打开,下载到最小系统板,测试程序并观察实验结果。 3、按键及七段LED的程序,实现更多的LED与按键结合的效果。 四、实验说明 1、程序中使用的按键及LED灯的IO端口要与自己的单片机最小系统板对应; 2、按键程序注意抗消抖; 3、思考计算器程序如何实现; 成都理工大学工程技术学院 单片微机原理及应用课程设计 《一位LED数码管显示0-9》 学生姓名: 学 号: 专 业: 班 级: 指导教师: 完成日期: 目 录 一 实验目的与任务…………………………………2 二 实验要求…………………………………………2 三 实验内容…………………………...……………2 四 元器件清单………………………………………2 五 LED数码管的结构及工作原理…………………2 六 关于PLC控制LDE介绍………………………4 七 原理图绘制说明…………………………………5 八 流程图绘制以及说明……………………………9 九 电路原理图与仿真………………………………10 十 源程序……………………………………………12 十一 心得体会………………………………………12 十二 参考文献………………………………………13 一、实验与任务 结合实际情况,编程设计、布线、程序调试、检查与运行,完成一个与接近实际工程项目的课题,以培养学生的实际操作能力,适应生产一线工作的需要。做到能检查出错误,熟练解决问题;对设备进行全面维修。通过实训对PLC的组成、工作原理、现场调试以及基于网络化工作模式的基本配置与应用等有一个一系列的认识和提高。 利用51单片机、1个独立按键及1位7段数码管等器件,设计一个单片机输入显示系统,要求每按一下独立按键数码管显示数据加1(数码管初始值设为0,计到9后再加1,则数码管显示0)。 本次设计采用12MHz的晶体振荡器为单片机提供振荡周期,外加独立按键,复位电路和显示电路组成。 二、实验要求 1、了解七段LED数码管的结构、分类以及数码管的显示码。 2、学习1位LED数码管静态显示与动态显示的编程方法。 3、掌握可编程序控制器技术应用过程中的一些基本技能。 4、了解可编程控制器的装备、调试的全过程。 三、实验内容 1、练习设计、连接、调试控制电路; 2、学习PLC程序编程; 四、元器件清单 从PROTUES库中选择元器件(1)AT89C51;单片机。(2)RES、RX8;电阻、8排阻。 (3)7SEG-COM-CAT-BLUE;带公共端共阴极七段蓝色数码管。(4)CAP/CAP-ELEC;电容、电解电容。(5)CRYSTAL:晶振。 五、LED数码管的结构及工作原理 led数码管(LED Segment Displays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位0,1,2,3,4,5,6,8,10位等等....,led数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图2是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。颜色有红,绿,蓝,黄等几种。led数码管广泛用于仪表,时钟,车站,家电等场合。选用时要注意产品尺寸颜色,功耗,亮度,波长等。下面将介绍常用LED数码管内部引脚图1 图1 10引脚的LED数码管 图2 LED数码管引脚定义 LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。 A、静态显示驱动: 静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O埠进行驱动,或者使用如BCD码二-十进位*器*进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5×8=40根I/O口来驱动,要知道一个89S51单片机可用的I/O口才32个呢。故实际应用时必须增加*驱动器进行驱动,增加了硬体电路的复杂性。B、动态显示驱动: 数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划“a,b,c,d,e,f,g,dp ”的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。 透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O口,而且功耗更低。 六、关于PLC控制LED介绍 PLC可编程控制器:它采用一类可编程的存储器,用于其内部存储程序、执行逻辑运算、顺序控制、定时、计数与算数操作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。 用PLC控制LED直接进行数据显示,可以降低成本,使得数据显示直观。传统数显有两种方法: 1、由PLC编制程序进行译码,来控制显示a-g段; 2、利用 译码组合电路产生a-g各段译码信号实现LED数码管显示。前一种方法逻辑译码关系复杂,后一种方法译码电路冗长,都不利于显示的实现。传统数显逻辑译码关系复杂,而用PLC的位组合元件和译码功能指令方法来实现LED数显.前一种方法将表示十进制数的4位BCD码的位元件成组使用,形成位组合元件数显;后一种方法用7段译码指令把指定元件的低4位对应的十六进制数译码后,驱动数显.这两种方法逻辑简单,易于理解,便于实现。 设计任务:LED数码管显示:0到9 七、原理图绘制说明 本次设计主要用到单片机AT89C51、晶振时序电路。AT89C51是一种带4KB闪烁可编程可擦出只读存储器的低电压、高性能CMOS微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微处理器,为很多嵌入式控制系统提供了一种灵活性高且廉价的方案,AT89C51的管脚分配(如图1)。 图1 AT89C51芯片及管脚图 AT89C51单片机主要由4个输入输出端口(P0口、P1口、P2口、P3口)及个控制引脚组成的,本次设计用到P1、P2的部分引脚,及18、19脚外接晶振电容为单片机提供时钟,9管脚为复位引脚,外接复位电路。 晶振时序电路:XTAL1和XTAL2分别为片内反相放大器的输入和输出端,当单片机采用外部时钟信号时,前者接地,后者引入外部输入信号,本次设计采用12M的石英晶体振荡器为单片机提供时钟(如图2)。 图2 AT89C51的晶振时序电路图 本次设计的原理图是在PROTEUS ISIS中绘制的,其工作界面分为原理图编辑窗口(Editing window)、预览窗口(Overview window)和工具栏。 1、新建*.dsn 打开绘图界面后,首先新建一个绘图文件,选择“【文件】——【新建设计】”,并保存成.dsn型文件。 2、绘制原理图 6(1)添加元器件:元件拾取共有两种办法,一种是按类别查找和拾取元件,另一种是直接查找和拾取元件。我采用的是前一种方法,元件通常以其英文名称或器件代号在库中存放。我们在取一个元件时,首先要清楚它属于哪一大类,然后还要知道它归属哪一子类,这样就缩小了查找范围,然后在子类所列出的元件中逐个查找,根据显示的元件符号、参数来判断是否找到了所需要的元件。双击找到的元件名,该元件便拾取到编辑界面中了。右侧列表中自上而下分别为元件图形和元件封装。具体如图3所示: 图3 分类拾取元件示意图 (2)元件的放置 在原理图编辑区的蓝色方框内,单击鼠标左键即完成元件的释放。具体如图4所示: 图4 元件的放置示意图 (3)电路连线 PROTEUS的连线是非常智能的,它会判断你下一步的操作是否想连线从而自动连线,而不需要选择连线的操作,只需用鼠标左键单击编辑区元件的一个端点拖动到要连接的另外一个元件的端点,先松开左键后再单击鼠标左键,即完成一根连线。如果要删除一根连线,右键双击连线即可。根据设计完成连线后即可得到完整的电路原理图,具体如图5: 图5 连线后的完整电路原理图 八、流程图绘制以及说明 主程序设计说明 主程序主要分为四部分,包括复位电路部分、独立按键的判别部分、单片机控制主程序部分和译码显示部分,模块流程图如图6所示: 图6 数码管显示程序流程图 九、电路原理图与仿真 1、Hex文件的导入过程 在仿真前,须先在KEIL4中生成.HEX文件。编译完源程序并且没有错误后,选择“Project-Options for Target ‘Target1’-Output”,在“Create HEX File”前面的空挑勾,再“确定”,即可生成HEX文件,如图7所示 : 图7 生成HEX文件示意图 在进入PROTEUS ISIS中,双击AT89C51芯片,出现如图8所示的对话框。在“Program File”一项中查找“seg.hex”文件的路径并加上该文件即可开始仿真,如图8所示: 图8 keil的seg.hex文件载入单片机的示意图 2.在导入hex文件后,便可运行该设计系统,打开仿真开关,显示如图 十、源程序清单 org 0000h sjmp main org 000bh sjmp t0_isr org 0030h main:clr a mov dptr,#table movc a,@a+dptr mov p0,a mov tmod,#01h mov th0,#0d8h mov tl0,#0efh setb et0 setb ea setb tr0 pd: cjne r0,#100,$ inc dptr clr a movc a,@a+dptr cjne a,#00h,aaa mov dptr,#table ;如果花样数据完应重新循环 clr a movc a,@a+dptr aaa: mov p0,a mov r0,#00h sjmp pd t0_isr: clr tr0 mov th0,#0d8h mov tl0,#0efh inc r0 setb tr0 reti table:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00h end 十一、心得体会 通过此次课程设计,使我更加扎实的掌握了有关单片机知识,用汇编语言在KEIL4中编程,在PROTEUS中绘制原理图并进行仿真,通过对这两个软件的学习,了解了其功能的强大,掌握了AT89C51的内部结构及工作原理,对于我们以后的 学习和实践有很大的指导意义,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。此次设计也让我明白了团队精神的重要性,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。 十一、参考文献 [1]高钦和.可编程控制器应用技术与设计实例.北京:人民邮电出版社,2004 [2]虞鹤松编.可编程序控制器原理及应用.南京:东南大学出版社,1995 [3]田庭主编.常用可编程序控制器编程器及编程软件使用手册.北京:机械工业出版社,1994第三篇:单片机数码管显示课程设计
第四篇:单片机实验五 按键及七段数码管实验
第五篇:《一位LED数码管显示0-9》