




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
燕山大学课 程 设 计 说 明 书题目: 计算器实验 学院(系): 年级专业: 学 号: 学生姓名: 指导教师: 教师职称: 29燕山大学课程设计(论文)任务书院(系):电气工程学院 基层教学单位:自动化仪表系学 号090103020059学生姓名朴瑞琦专业(班级)09级仪表二班设计题目计算器实验设计技术参数1、 独立完成设计任务;2、 编程,上机调试;3、 连接硬件实验线路,实现所要求的功能;4、 完成设计,提交课程设计报告。设计要求1、 利用实验仪上提供的显示电路和键盘电路,做一个简单的计算器。2、 进一步熟悉LED显示电路和键盘扫描电路的工作原理和编程方法。3、 了解数据计算的基本方法。工作量软件编程与硬件调试相结合,绘制设计流程图,并编程进行硬件实现。工作计划第一天:明确课程设计的任务,绘制硬件电路,软件流程图;第二天:根据功能要求编写程序;第三天:熟悉伟福单片机编程环境,读程序修改软件参数和硬件地址,调试程序;第四天:进一步修改程序,查找错误,进行硬件调试;第五天:撰写课程设计报告,完成答辩。参考资料1)单片机原理及应用技术 张淑清编 国防工业出版社2)过程控制系统及仪表 邵裕森 巴筱云编3)单片机及应用 李大友编 高等教育出版社4)机械量测量 机械工业出版社指导教师签字张淑清基层教学单位主任签字谢平说明:此表一式四份,学生、指导教师、基层教学单位、系部各一份。2012年 6月 29日 摘 要 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制技术的核心,如今,它已广泛地应用到我们生活的各个领域,如电子、科技、通信、汽车、工业等。计算器在人们的日常中是比较的常见的电子产品之一,可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次课程设计的任务是利用单片机设计一个计算器,能够进行多位简单的整数加、减、乘、除的运算及具有清零的功能,同时还对其功能进行了扩展,增加了一些特殊运算及错误报警功能。它主要由MCS51单片机、A8255、数码管显示、键盘、蜂鸣器等模块组成。本计算器是将键盘输入信息经处理通过缓存输入数码管显示出来,键盘采用行列扫描式,数码管采用动态扫描方式,计算功能通过软件实现,用C语言对单片机可编程芯片进行编程,实现对计算器的设计。关键字:单片机、计算器、数码管、键盘目录摘 要3第一章 设计目标与设计方案41.1 设计目标与实现方法41.2 方案设计4第2章 硬件模块介绍62.1 运算模块62.2 输入模块72.2.1键盘的原理82.3 显示模块92.3.1 LED的显示原理92.3.2 动态显示的工作原理112.4 音频控制模块11第3章 软件设计123.1 基本功能设计123.2 扩展功能设计18第4章 硬件电路284.1 硬件电路284.2 硬件电路连线28第5章 学习心得29参考资料30第一章 设计目标与设计方案1.1 设计目标与实现方法1)设计目标:利用实验仪上提供的显示电路和键盘电路,做一个简单的计算器。2)实现方法: 为了满足设计的基本要求,可以实现基本的运算(加减乘除),数据清零的功能。另外,还对计算器的功能进行了扩展,添加了一些特殊运算和错误报警的功能。我们采用基于MCS51单片机设计计算器,并用LED 数码管显示数据,4*6 的矩阵键盘实现数据输入,设计仿真和调试要用到WAVE软件及实验箱等。1.2 方案设计根据功能要求和指标要求,本系统选用MCS 51 单片机为主控机,通过扩展必要的外围接口电路,实现对计算器的设计。具体设计方案如下:首先实现计算器的基本功能,即可以进行四则运算,对数字的大小范围要求不高,故采用可以进行三位数字的运算,选用4*6的键盘实现数据输入,用6 个LED 数码管显示数据。键盘包括数字键(09)、符号键(+、-、)、清除键和等号键,用A、B、C、D、E、F键分别代表“+”、“-”、“*”、“/”、“=”、“清零”的功能。扩展功能:用剩余八个键分别实现求方、取余、排列、比较、组合、平均数、开方、平方的功能,用8255扩展芯片及蜂鸣器实现错误报警的功能。根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各子程序,层层细化,逐步求精,最终完成一个复杂程序的设计。程序流程图如下:第2章 硬件模块介绍2.1 运算模块MCS-51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能,如图2-1所示:MCS51引脚配置图T2.2 输入模块计算器的数据输入由键盘来实现。键盘是由若干个按键组成的开关矩阵,它是最简单的单片机输入设备,通过键盘可输入数据和命令,实现简单的人机对话。键盘根据其结构不同可分为编码式键盘和非编码式键盘两种。非编码式键盘靠软件识别,节省硬件,通常采用这种键盘。根据键盘与单片机接法不同,非编码键盘又分为独立式和矩阵式两种。当系统操作较简单所需按键较少时,可采用独立式非编码键盘,而当系统操作较复杂,需要按键较多时,可采用矩阵式非编码键盘。如果采用独立按键的方式,会占用大量的I/O 口资源,故我们采用矩阵式键盘输入。采用四条I/O 线作为行线,六条I/O 线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键,这样键盘上按键的个数就为46个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率,如图21所示:图2-1 矩阵式键盘2.2.1键盘的原理如图22所示,采用列扫描法来识别按键。每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。当无按键闭合时,P10P13 与P14P17 之间开路;当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14P17 为输入状态,从行线P10P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14P17 读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。图22 键盘结构2.3 显示模块发光二极管LED 是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。因而作为典型的外围器件,LED 显示单元是反映系统输出和操作输入的有效器件。LED 具备数字接口可以方便的和大年纪系统连接;它的优点是工作电压低,响应速度快,价格低,寿命长等,因而在单片机应用系统中获得了广泛的应用,所以在此设计中我首先选用了LED作为显示器件。2.3.1 LED的显示原理LED显示器的结构及其段名如图23所示,连同小数点在内,共有8个LED灯,点亮合适的字段,即能显示09的数字和某些字符、符号。这种显示器有两种形式:一种是发光二极管的阴极连在一起的共阴极显示器,另一种是阳极连在一起的共阳极显示器。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。图23 LED段码为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字09的共阴极字形代码如下表21所示:显示字形gfgdcba段码001111113fh1000011006h210110115bh310011114fh4110011066h511011016dh611111017dh7000011107h811111117fh9110011167hA111011177hB11111007chC011100139hD10111105ehE111100179hF111000171h表2-1 09七段数码管共阴极字形代码2.3.2 动态显示的工作原理点亮显示器的方法有静态和动态两种,这里显示位数较多,采用动态显示较合适,如图24所示,所谓动态显示,就是用扫描的方法一位一位轮流点亮显示器的各位,该方法只需一个8位段输出口和一个8位扫描输出口,后者的作用是依次接通各位LED。对于显示器的每一位来说,每隔一段时间点亮一次,利用人眼的视觉暂留效应可以看到整个动态显示,但必须保证扫描速度足够快,字符才不闪烁。 图24 数码管的动态显示2.4 音频控制模块如图25所示为音频放大滤波电路,端口输入的方波经放大滤波后,驱动扬声器发声。声音的频率由端口输入时延时控制,不同频率的脉冲控制喇叭发出不同的音调。图25 音频放大滤波电路第3章 软件设计3.1 基本功能设计1、实验现象:可以实现基本的运算加减乘除以及数据清零的功能,用A、B、C、D、E、F键分别代表“+”、“-”、“*”、“/”、“=”、“清零”。2、程序流程图数据送显示缓冲子程序框图如下:开始显示位上移数值为0?数值0否是无符号位符号位显示“-”数值对10取模,送显示最低位数值除以10数值对10取模,送显示位否返回 是数据送显示缓冲子程序框图运算主程序框图如下:开始初始化参数LED显示有键输入读取键码键码是?数字键清零键功能键输入数值状态清零数值送显示缓冲根据上次功能键和输入的数据计算结果本次功能键?是?是“=”其它键计算最后结果保存结果和功能键结果送显示缓冲等待数值输入运算主程序流程图3、基本功能实现程序:#define LEDLen 6 /设置LED显示位数为六位#define PB1 2#define PB0 1xdata unsigned char OUTBIT _at_ 0x9002; / 位控制口xdata unsigned char OUTSEG _at_ 0x9004; / 段控制口xdata unsigned char IN _at_ 0x9001; / 键盘行码读回口unsigned char LEDBufLEDLen;unsigned char LEDMAP = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71; / 共阴极数码管字形代码void Delay(unsigned char CNT) / 延时子程序 unsigned char i; while (CNT- !=0) for (i=100; i !=0; i-);void DisplayLED() / 逐位显示数码管 unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; for (i = 0; i = 1; unsigned char KeyTable = 0x16, 0x15, 0x14, 0xff, 0x13, 0x12, 0x11, 0x10, 0x0d, 0x0c, 0x0b, 0x0a, 0x0e, 0x03, 0x06, 0x09, 0x0f, 0x02, 0x05, 0x08, 0x00, 0x01, 0x04, 0x07; / 键盘各键代码unsigned char TestKey() / 检查键盘是否有键按下 OUTBIT = 0; return (IN & 0x0f); unsigned char GetKey() / 得到按下键的数值 unsigned char Pos; unsigned char i; unsigned char k; i = 6; Pos = 0x20; do OUTBIT = Pos; Pos = 1; k = IN & 0x0f; while (-i != 0) & (k = 0); if (k != 0) i *= 4; if (k & 2) i += 1; else if (k & 4) i += 2; else if (k & 8) i += 3; OUTBIT = 0; do Delay(10); while (TestKey(); return(KeyTablei); / 将被按下键的代码返回给主程序 else return(0xff); / 如果没有键按下,返回清零代码0xff#define ADD 0x0a / 宏定义,各运算对应相应键的代码#define SUB 0x0b#define MUL 0x0c#define DIV 0x0d#define EQU 0x0e#define CLR 0x0fvoid DisplayResult(signed int Result) / 计算结果逐位送入显示缓冲区中 unsigned char i; if (Result = 0) / 数值大于0 / 不显示符号位 LEDBuf0 = 0; else / 在符号位显示 - LEDBuf0 = 0x40; Result = - Result; LEDBuf1 = 0; LEDBuf2 = 0; LEDBuf3 = 0; LEDBuf4 = 0; / 数值对10取模,所得结果为最低位 LEDBuf5 = LEDMAPResult % 10; Result = Result / 10; i = 4; / 如果数值除以10后不等于0,继续向高位显示 while (Result != 0) LEDBufi- = LEDMAPResult % 10; Result = Result / 10; void main() signed int Last, Result; / 定义整型变量Last,Result分别存放第一个运算数,第二个运算数和结果 unsigned char OP; unsigned char Key; / 定义字符型变量OP,Key分别存放上一运算符、当前输入键 Last = 0; / 给变量赋初值 Result = 0; OP = ADD; DisplayResult(Result); / 将0送到显示缓冲区 while (1) while (!TestKey() DisplayLED(); / 用于显示按下的数及结果 / 读取键码 Key = GetKey(); / 得到按下键的代码 if ( (Key = 0) & (Key = 9) ) / 是数字键 Result = Result*10 + Key; / 输入数值 / 数值送显示缓冲 DisplayResult(Result); / 数值送显示缓冲 else if (Key = CLR) / 是清零键 Last = 0; Result = 0; OP = ADD; / 状态清零 DisplayResult(Result); / 数值送显示缓冲 else if ( (Key=ADD) | (Key=SUB) | (Key=MUL) | (Key=DIV) | (Key=EQU) ) / 是功能键 switch (OP) /上一按键是? case ADD: Result = Last + Result; break; case SUB: Result = Last - Result; break; case MUL: Result = Last * Result; break; case DIV: Result = Last / Result; / 根据上一键进行相应的运算,计算最后结果 break; if (Key = EQU) / 功能键是= Last = 0; OP = ADD; / 重新赋初值 else / 是其它功能键 / 保存结果, 保存按键功能 Last = Result; OP = Key; DisplayResult(Result); /将结果送显示缓冲Result = 0; / 等待下一个数值输入. 3.2 扩展功能设计1、实验现象:除了可以进行加减乘除的基本运算外,还可进行求方、取余、排列、比较、组合、平均数、开方、平方运算;当输入、输出超过显示范围时,蜂鸣器会发声报警,起到提示作用。2、程序流程图:开始初始化参数LED显示有键输入读取键码键码是?数字键清零键功能键输入数值状态清零根据上次功能键和输入的数据计算结果本次功能键?是?是“=”其它键计算最后结果保存结果和功能键等待数值输入是否超范围?报警数值送显示缓冲是否超范围否是报警结果送显示缓冲否是 扩展后程序流程图3、扩展后的程序:#include #include #define mode 0x82;#define LEDLen 6 /设置LED显示位数为六位#define PB1 2#define PB0 1xdata unsigned char Control _at_ 0x8003;xdata unsigned char Speaker _at_ 0x8000;xdata unsigned char OUTBIT _at_ 0x9002; / 位控制口xdata unsigned char OUTSEG _at_ 0x9004; / 段控制口xdata unsigned char IN _at_ 0x9001; / 键盘行码读回口unsigned char LEDBufLEDLen;unsigned char LEDMAP = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71; / 共阴极数码管字形代码void Delay(unsigned char CNT) / 延时子程序 unsigned char i; while (CNT- !=0) for (i=100; i !=0; i-);void DisplayLED() / 逐位显示数码管 unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; for (i = 0; i = 1; unsigned char KeyTable = 0x16, 0x15, 0x14, 0xff, 0x13, 0x12, 0x11, 0x10, 0x0d, 0x0c, 0x0b, 0x0a, 0x0e, 0x03, 0x06, 0x09, 0x0f, 0x02, 0x05, 0x08, 0x00, 0x01, 0x04, 0x07; / 键盘各键代码unsigned char TestKey() / 检查键盘是否有键按下 OUTBIT = 0; return (IN & 0x0f); unsigned char GetKey() / 得到按下键的数值 unsigned char Pos; unsigned char i; unsigned char k; i = 6; Pos = 0x20; do OUTBIT = Pos; Pos = 1; k = IN & 0x0f; while (-i != 0) & (k = 0); if (k != 0) i *= 4; if (k & 2) i += 1; else if (k & 4) i += 2; else if (k & 8) i += 3; OUTBIT = 0; do Delay(10); while (TestKey(); return(KeyTablei); / 将被按下键的代码返回给主程序 else return(0xff); / 如果没有键按下,返回清零代码0xff#define ADD 0x0a / 宏定义,各运算对应相应键的代码#define SUB 0x0b#define MUL 0x0c#define DIV 0x0d#define EQU 0x0e#define CLR 0x0f#define qf 0xff#define qy 0x14#define jc 0x15#define bj 0x16#define zh 0x10#define pys 0x11#define kf 0x12#define pf 0x13void DisplayResult(signed int Result) / 计算结果逐位送入显示缓冲区中 unsigned char i; if (Result = 0) / 数值大于0 / 不显示符号位 LEDBuf0 = 0; else / 在符号位显示 - LEDBuf0 = 0x40; Result = - Result; LEDBuf1 = 0; LEDBuf2 = 0; LEDBuf3 = 0; LEDBuf4 = 0; / 数值对10取模,所得结果为最低位 LEDBuf5 = LEDMAPResult % 10; Result = Result / 10; i = 4; / 如果数值除以10后不等于0,继续向高位显示 while (Result != 0) LEDBufi- = LEDMAPResult % 10; Result = Result / 10; unsigned char PulseCNT;unsigned char Pulse;unsigned ToneHigh, ToneLow;code unsigned int Tone=64778;void Timer() interrupt 1 TR0 = 0; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; Speaker = Pulse; Pulse +; PulseCNT-;void main() signed int Last, Result,i; / 定义整型变量Last,Result分别存放第一个运算数,第二个运算数和结果unsigned int ttttt,x; unsigned char OP; unsigned char Key; / 定义字符型变量OP,Key分别存放上一运算符、当前输入键 Last = 0; / 给变量赋初值 Result = 0; OP = ADD; ttttt=1; x=0; Control = mode; Pulse = 0; TMOD = 0x01; / 方式 1 , 记时器 IE = 0x82; / EA=1, IT0 = 1 DisplayResult(Result); / 将0送到显示缓冲区 while (1) while (!TestKey() DisplayLED(); / 用于显示按下的数及结果 / 读取键码 Key = GetKey(); / 得到按下键的代码 if ( (Key = 0) & (Key = 9) ) / 是数字键 Result = Result*10 + Key; / 输入数值if (Result 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 发 100 个脉冲 Speaker = 0; TR0 = 0; DisplayResult(Result); / 数值送显示缓冲 else if (Key = CLR) / 是清零键 Last = 0; Result = 0; OP = ADD; / 状态清零 DisplayResult(Result); / 数值送显示缓冲 else if ( (Key=ADD) | (Key=SUB) | (Key=MUL) | (Key=DIV) | (Key=EQU) |(Key=qf)|(Key=qy)|(Key=jc)|(Key=bj)|(Key=zh)|(Key=pys)|(Key=kf)|(Key=pf) ) / 是功能键 switch (OP) /上一按键是? case ADD: Result = Last + Result; if (Result 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 发 100 个脉冲 Speaker = 0; TR0 = 0; break; case SUB: Result = Last - Result; break; case MUL: Result = Last * Result; if (Result 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 发 100 个脉冲 Speaker = 0; TR0 = 0; break; case DIV: Result = Last / Result; / 根据上一键进行相应的运算,计算最后结果 break; case qf: for (i=Result;i0;i-) ttttt= ttttt*Last; Result=ttttt; if (Result 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 发 100 个脉冲 Speaker = 0; TR0 = 0; break; case qy: Result = Last % Result; break; case jc: ttttt=Last-1; for(i=0;iResult-1;i+) Last=Last*ttttt; ttttt-; Result=Last; if (Result 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 200; while (PulseCNT != 0) ; / 发 100 个脉冲 Speaker = 0; TR0 = 0; break; case bj: if(LastResult) Result=Last; break; case zh: x=Result; ttttt=Last-1; for(i=0;iResult-1;i+) Last=Last*ttttt/x; ttttt-; x-; Result = Last ; if (Result 8; ToneLow = Tone & 0xff; TH0 = ToneHigh; TL0 = T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025【合同范本】简易租房合同协议书
- 2025房地产代理销售合同范本
- 合伙人退出合作协议书
- 停车场绿化工程合同标准文本
- 二零二五股票与股权分配协议
- 2025年粮食、棉花、化肥等农产品仓储服务项目合作计划书
- 办理协议离婚经过的程序
- 业务员协议书
- 聘用主播的合同范例
- 房地产销售代理合同样本
- 【工程项目施工阶段造价的控制与管理8100字(论文)】
- XX学校推广应用“国家中小学智慧教育平台”工作实施方案
- 非遗文化创意产品设计 课件全套 第1-5章 概述- 非遗文创产品设计案例解析
- 法律尽职调查所需资料清单
- 幼儿园中班安全教育活动《紧急电话的用途》
- 118种元素原子结构示意图
- 英语四线三格Word版
- 幼儿园行政工作制度
- 广州新华学院
- 部编版七年级下册道法期中试卷1
- 知识图谱-课件
评论
0/150
提交评论