蜂鸣数字计算器(共15页).doc
《蜂鸣数字计算器(共15页).doc》由会员分享,可在线阅读,更多相关《蜂鸣数字计算器(共15页).doc(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上一、课程设计内容及要求1、蜂鸣计算器设计利用普中科技HC6800-ES V2.0单片机开发板设计一款带蜂鸣器的电子计算器。主要使用开发板上的数码管、LED点阵、矩阵键盘、蜂鸣器等模块功能。开发板配有光盘,里面有各个模块的使用说明和程序范例可供参考。2、设计要求1) 上电开机或者复位键按下之后,数码管自动显示个人学号的后8位。2) 定义矩阵键盘的S1-S9代表数字按键1-9,键盘S10代表数字按键0,键盘S11-S16分别代表按键+、-、=、C,其中C按键为计算器清零按键,按下C键计算器开始新的计算。3) 计算器计算过程中,用LED点阵显示+、-、运算符号,用8位数码管
2、显示键入的数字和运算的结果。键入时依次显示并自动移位,例如18+9=27,先键入1,显示1,再键入8,1自动左移一位显示18,键入+,LED点阵显示+,键入9,数码管之前显示的18消失并重新显示为9,键入=,数码管显示运算结果27。4) 为这16个矩阵键盘的按键分配不同的蜂鸣器频率,使得按下不同的按键蜂鸣器响声不同,便于识别按键。5) 按键应具有一定的消除抖动功能。6) 所有单片机程序代码都用C语言编写,并烧写到单片机中上电自动运行。二、 设计思想蜂鸣器计算器设计包括矩阵键盘模块、数码管及矩阵LED动态显示模块、输入逻辑计算显示模块和蜂鸣器响应模块这四大模块。具体实施方法如下:1、 矩阵键盘模
3、块,四乘四的矩阵键盘,设计按键扫描函数,在定时中断中调用,调用定时器中断,中断间隔时间设置为1ms,选择P2IO口,P2.0到P2.3做输出KeyOut,P2.4做P2.7做输入KeyIn,每次在按键扫描中断中,每次让矩阵按键的一个 KeyOut 输出低电平,其它三个输出高电平,判断当前所有 KeyIn 的状态,然后再让下一个 KeyOut 输出低电平,其它三个输出高电平,再次判断所有 KeyIn,通过四次扫描,确定按下的键,再通过快速的中断不停的循环进行判断,就可以最终确定哪个按键按下了。 同时在按键模块,还需要消抖使按键稳定。通常我们采用延迟再次检测的方式消抖,但是太过消耗单片机的CUP。
4、所以为了避免通过延时消抖占用单片机执行时间,将其转化成了一种按键状态判定而非按键过程判定,只对当前按键的连续 16ms 的 4 次状态进行判断,全为0就断定对于的键按下了,全为1就断定为没有按下。2、数码管及矩阵LED动态显示模块,通过每毫秒进行动态扫描进行显示,由于数码管和矩阵LED动态显示模块都需要通过P1.3和P1.4进行选择来控制,所以在写刷新数据和符号的时候需要先在函数开始调好对应的控制位。而所需要的显示的数字和符号保存在数组中,以便需要的时候直接调用。3、输入逻辑计算显示模块,在编写程序的时候,对于这个简易计算器,以正整数的连续加减乘除为基本编程目的。在第一次输入为0-9这十个按键
5、的时候,此时设置了标记符号flag=0,直接保存到数据保存数组addflag中,若继续输入数字就把addflag乘以10再加上新输入的数字;若扫描到加减乘除这四个符号的时候,先把标记符号flag置为1,再把算数符号保存到符号标记sign中,把需要LED矩阵显示的全局符号变量tx设置为对应的数字,继续扫描到数字的时候就会把数据保存到add1(flag=1)中;如果接下来输入为等于号,就判断sign数值然后对add0和add1做对应的计算;如果输入还是计算符号,就先计算把计算结果保存到add0中,再清零add1,再继续扫描。4、蜂鸣器响应模块,由于开发板上面的蜂鸣器是无源蜂鸣器,所以需要通过输出p
6、wm脉冲来驱动蜂鸣器,同时由于脉冲频率不同对于蜂鸣器发声也不一样,所以通过一个需要传入频率参数的函数。通过该频率参数,来设置中断定时器T1,控制蜂鸣器驱动端口输出高低电平,然后在按键处理函数处判断对应需要的频率送给蜂鸣器响应函数。三、 程序流程图 1、整体流程图2、算数逻辑流程四、详细程序 1、总程序Calculator.c#include #include #include #include void main() Init();ShowNumber();/显示学号while (1) KeyDriver(); /调用按键驱动函数 /* T0中断服务函数,用于数码管显示扫描与按键扫描 */vo
7、id InterruptTimer0() interrupt 1 TH0 = 0xFC; /重新加载初值 TL0 = 0x67; LedScan(); /调用数码管显示扫描函数 KeyScan(); /调用按键扫描函数ShowPhoto(tx);/调用点阵显示函数/* T1中断服务函数,用于蜂鸣器 */ void InterruptTimer1() interrupt 3 TH1 = T1RH; /重新加载重载值 TL1 = T1RL; BUZZ = BUZZ; /反转蜂鸣器控制电平2、宏定义头文件sys.c#ifndef _sys_h_#define _sys_h_#include sys.
8、h#define uint unsigned int#define uchar unsigned charsbit ADDR0 = P10;sbit ADDR1 = P11;sbit ADDR2 = P12;sbit ADDR3 = P13;sbit ENLED = P14;sbit KEY_IN_1 = P24;sbit KEY_IN_2 = P25;sbit KEY_IN_3 = P26;sbit KEY_IN_4 = P27;sbit KEY_OUT_1 = P23;sbit KEY_OUT_2 = P22;sbit KEY_OUT_3 = P21;sbit KEY_OUT_4 = P2
9、0;sbit BUZZ = P16; /蜂鸣器控制引脚unsigned char T1RH = 0; /T0重载值的高字节unsigned char T1RL = 0; /T0重载值的低字节unsigned char tx = 0; /矩阵led显示unsigned char code LedChar = /数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E;unsigned char LedBuff6 = /数码管显示缓冲区 0xFF
10、, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF;unsigned char code KeyCodeMap44 = /矩阵按键编号到标准键盘键码的映射表 0x31, 0x32, 0x33, 0x26 , /数字键1、数字键2、数字键3、加键 0x34, 0x35, 0x36, 0x25 , /数字键4、数字键5、数字键6、乘键 0x37, 0x38, 0x39, 0x28 , /数字键7、数字键8、数字键9、减键 0x30, 0x1B, 0x0D, 0x27 /数字键0、ESC键、等号键、 除键;unsigned char KeySta44 = /全部矩阵按键的当前状态 1, 1
11、, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1;unsigned char code image68 = /符号的字模表 0xFF,0xBD,0x5A,0xFF,0xFF,0xBD,0xDB,0xE7,/笑脸 0xE7,0xE7,0xE7,0x00,0x00,0xE7,0xE7,0xE7,/加号 0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF, /减号 0x3C,0x18,0x81,0xC3,0xC3,0x81,0x18,0x3C, /乘号 0xE7,0xE7,0xFF,0x00,0x00,0xFF,0xE7,0xE7, /
12、除号0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF /等号;void Init();void ShowNumber(unsigned long num);void KeyAction(unsigned char keycode);void KeyDriver();void KeyScan();void LedScan();void OpenBuzz(unsigned int frequ);void StopBuzz();void Delay();void Buzz(unsigned int frequ);void ShowPhoto(unsigned int a
13、);#endif3、函数头文件fun.c#ifndef _fun_h_#define _fun_h_#include fun.hvoid Init()EA = 1; /使能总中断 TMOD = 0x11; /设置T0为模式1 TH0 = 0xFC; /为T0赋初值0xFC67,定时1ms TL0 = 0x67; ET0 = 1; /使能T0中断TR0 = 1; /启动T0 /* 将一个无符号长整型的数字显示到数码管上,num-待显示数字 */void ShowNumber(unsigned long num) signed char i; unsigned char buf6; for (i=
14、0; i=1; i-) /从最高位起,遇到0转换为空格,遇到非0则退出循环 if (bufi = 0) LedBuffi = 0xFF; else break; for ( ; i=0; i-) /剩余低位都如实转换为数码管显示字符 LedBuffi = LedCharbufi; /* 按键动作函数,根据键码执行相应的操作,keycode-按键键码 */void KeyAction(unsigned char keycode) static unsigned long result = 0; /用于保存运算结果 static unsigned long add2 = 0; /用于保存输入的数字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 计算器 15
限制150内