ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:122.04KB ,
资源ID:3620415      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3620415.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(蜂鸣数字计算器.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

蜂鸣数字计算器.docx

1、蜂鸣数字计算器蜂鸣数字计算器1、2、电平,其它三个输出高电平,再次判断所有 KeyIn,通过四次扫描,确定按下的键,再通过快速的中断不停的循环进行判断,就可以最终确定哪个按键按下了。 同时在按键模块,还需要消抖使按键稳定。通常我们采用延迟再次检测的方式消抖,但是太过消耗单片机的CUP。所以为了避免通过延时消抖占用单片机执行时间,将其转化成了一种按键状态判定而非按键过程判定,只对当前按键的连续 16ms 的 4 次状态进行判断,全为0就断定对于的键按下了,全为1就断定为没有按下。2、数码管及矩阵LED动态显示模块,通过每毫秒进行动态扫描进行显示,由于数码管和矩阵LED动态显示模块都需要通过P1.

2、3和P1.4进行选择来控制,所以在写刷新数据和符号的时候需要先在函数开始调好对应的控制位。而所需要的显示的数字和符号保存在数组中,以便需要的时候直接调用。3、输入逻辑计算显示模块,在编写程序的时候,对于这个简易计算器,以正整数的连续加减乘除为基本编程目的。在第一次输入为0-9这十个按键的时候,此时设置了标记符号flag=0,直接保存到数据保存数组addflag中,若继续输入数字就把addflag乘以10再加上新输入的数字;若扫描到加减乘除这四个符号的时候,先把标记符号flag置为1,再把算数符号保存到符号标记sign中,把需要LED矩阵显示的全局符号变量tx设置为对应的数字,继续扫描到数字的时

3、候就会把数据保存到add1(flag=1)中;如果接下来输入为等于号,就判断sign数值然后对add0和add1做对应的计算;如果输入还是计算符号,就先计算把计算结果保存到add0中,再清零add1,再继续扫描。4、蜂鸣器响应模块,由于开发板上面的蜂鸣器是无源蜂鸣器,所以需要通过输出pwm脉冲来驱动蜂鸣器,同时由于脉冲频率不同对于蜂鸣器发声也不一样,所以通过一个需要传入频率参数的函数。通过该频率参数,来设置中断定时器T1,控制蜂鸣器驱动端口输出高低电平,然后在按键处理函数处判断对应需要的频率送给蜂鸣器响应函数。二、程序流程图 1、整体流程图2、算数逻辑流程四、详细程序 1、总程序Calcula

4、tor.c#include #include #include #include void main() Init(); ShowNumber(135043); /显示学号 while (1) KeyDriver(); /调用按键驱动函数 /* T0中断服务函数,用于数码管显示扫描与按键扫描 */void InterruptTimer0() interrupt 1 TH0 = 0xFC; /重新加载初值 TL0 = 0x67; LedScan(); /调用数码管显示扫描函数 KeyScan(); /调用按键扫描函数 ShowPhoto(tx); /调用点阵显示函数/* T1中断服务函数,用于蜂

5、鸣器 */ void InterruptTimer1() interrupt 3 TH1 = T1RH; /重新加载重载值 TL1 = T1RL; BUZZ = BUZZ; /反转蜂鸣器控制电平2、宏定义头文件sys.c#ifndef _sys_h_#define _sys_h_#include sys.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_

6、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 = P20;sbit BUZZ = P16; /蜂鸣器控制引脚unsigned char T1RH = 0; /T0重载值的高字节unsigned char T1RL = 0; /T0重载值的低字节unsigned char tx = 0; /矩阵led显示unsigned char code Led

7、Char = /数码管显示字符转换表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E;unsigned char LedBuff6 = /数码管显示缓冲区 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF;unsigned char code KeyCodeMap44 = /矩阵按键编号到标准键盘键码的映射表 0x31, 0x32, 0x33, 0x26 , /数字键1、数字键2、数字键3、加键 0x34, 0x35, 0x36, 0

8、x25 , /数字键4、数字键5、数字键6、乘键 0x37, 0x38, 0x39, 0x28 , /数字键7、数字键8、数字键9、减键 0x30, 0x1B, 0x0D, 0x27 /数字键0、ESC键、等号键、 除键;unsigned char KeySta44 = /全部矩阵按键的当前状态 1, 1, 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,0x0

9、0,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, /除号 0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF /等号;void Init();void ShowNumber(unsigned long num);void KeyAction(unsigned char keycode);void KeyDriver(

10、);void KeyScan();void LedScan();void OpenBuzz(unsigned int frequ);void StopBuzz();void Delay();void Buzz(unsigned int frequ);void ShowPhoto(unsigned int a);#endif3、函数头文件fun.c#ifndef _fun_h_#define _fun_h_#include fun.hvoid Init() EA = 1; /使能总中断 TMOD = 0x11; /设置T0为模式1 TH0 = 0xFC; /为T0赋初值0xFC67,定时1ms

11、TL0 = 0x67; ET0 = 1; /使能T0中断 TR0 = 1; /启动T0 /* 将一个无符号长整型的数字显示到数码管上,num-待显示数字 */void ShowNumber(unsigned long num) signed char i; unsigned char buf6; for (i=0; i=1; i-) /从最高位起,遇到0转换为空格,遇到非0则退出循环 if (bufi = 0) LedBuffi = 0xFF; else break; for ( ; i=0; i-) /剩余低位都如实转换为数码管显示字符 LedBuffi = LedCharbufi; /*

12、按键动作函数,根据键码执行相应的操作,keycode-按键键码 */void KeyAction(unsigned char keycode) static unsigned long result = 0; /用于保存运算结果 static unsigned long add2 = 0; /用于保存输入的数字 static unsigned int sign2 = 0; /用作统计前一次和当前运算符号,03依次代表加减乘除 static unsigned int flag = 0; /用于统计次数 switch(keycode) /不同按键蜂鸣器发出不同频率声音 case 0x30 : Bu

13、zz(1000);break; case 0x31 : Buzz(1500);break; case 0x32 : Buzz(2000);break; case 0x33 : Buzz(2500);break; case 0x34 : Buzz(3000);break; case 0x35 : Buzz(3500);break; case 0x36 : Buzz(4000);break; case 0x37 : Buzz(4500);break; case 0x38 : Buzz(5000);break; case 0x39 : Buzz(5500);break; case 0x26 : Bu

14、zz(6000);break; case 0x28 : Buzz(6500);break; case 0x25 : Buzz(7500);break; case 0x27 : Buzz(8000);break; case 0x0D : Buzz(8500);break; case 0x1B : Buzz(9000);break; default : break; if (keycode=0x30) & (keycode=0x39) /输入0-9的数字 if(flag = 0) add0 = (add0*10)+(keycode-0x30); /整体十进制左移,新数字进入个位 ShowNumbe

15、r(add0); /运算结果显示到数码管 else add1 = (add1*10)+(keycode-0x30); /整体十进制左移,新数字进入个位 ShowNumber(add1); /运算结果显示到数码管 else if (keycode = 0x26) /向上键用作加号,执行加法或连加运算 sign0 = sign1; /保存前一次的运算符号 sign1 = 0; /保存当前运算符号 flag = 1; tx = 1; switch(sign0) /用于连加 case 0:add0= add0+add1;break; case 1:add0= add0-add1;break; case

16、 2:add0= add0*add1;break; case 3:add0= add0/add1;break; default : break; ShowNumber(add0); /运算结果显示到数码管 add1=0; /清零add1; else if (keycode = 0x28) /向下键用作减号,执行减法 sign0 = sign1; /保存前一次的运算符号 sign1 = 1; /保存当前运算符号 flag = 1; tx = 2; switch(sign0) case 0:add0= add0+add1;break; case 1:add0= add0-add1;break; c

17、ase 2:add0= add0*add1;break; case 3:add0= add0/add1;break; default : break; ShowNumber(add0); /运算结果显示到数码管 add1=0; /清零add1; else if (keycode = 0x25) /向下键用作乘号,执行乘法 sign0 = sign1; /保存前一次的运算符号 sign1 = 2; /保存当前运算符号 flag = 1; tx = 3; switch(sign0) case 0:add0= add0+add1;break; case 1:add0= add0-add1;break

18、; case 2:add0= add0*add1;break; case 3:add0= add0/add1;break; default : break; ShowNumber(add0); /运算结果显示到数码管 add1=0; /清零add1; else if (keycode = 0x27) /向下键用作除号,执行除法 sign0 = sign1; /保存前一次的运算符号 sign1 = 3; /保存当前运算符号 flag = 1; tx = 4 ; switch(sign0) case 0:add0= add0+add1;break; case 1:add0= add0-add1;b

19、reak; case 2:add0= add0*add1;break; case 3:add0= add0/add1;break; default : break; ShowNumber(add0); /运算结果显示到数码管 add1=0; /清零add1; else if (keycode = 0x0D) /等号键,执行运算 switch(sign1) case 0: result = add0+add1; /进行加法运算 ShowNumber(result); /运算结果显示到数码管 break; case 1: result = add0-add1; /进行减法运算 ShowNumber

20、(result); /运算结果显示到数码管 break; case 2: result = add0*add1; /进行乘法运算 ShowNumber(result); /运算结果显示到数码管 break; case 3: result = add0/add1; /进行除法运算 ShowNumber(result); /运算结果显示到数码管 break; default : break; tx = 5 ; flag = 0; add0 = 0; add1 = 0; sign0=0; sign1=0; else if (keycode = 0x1B) /Esc键,清零结果 add0 = 0; a

21、dd1 = 0; sign0=0; sign1=0; flag = 0; result = 0; tx = 0 ; ShowNumber(result); /清零后的加数显示到数码管 /* 按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用 */void KeyDriver() unsigned char i, j; static unsigned char backup44 = /按键值备份,保存前一次的值 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ; for (i=0; i4; i+) /循环检测4*4的矩阵按键 for (j

22、=0; j4; j+) if (backupij != KeyStaij) /检测按键动作 if (backupij != 0) /按键按下时执行动作 KeyAction(KeyCodeMapij); /调用按键动作函数 backupij = KeyStaij; /刷新前一次的备份值 /* 按键扫描函数,需在定时中断中调用,调用间隔1ms */void KeyScan() unsigned char i; static unsigned char keyout = 0; /矩阵按键扫描输出索引 static unsigned char keybuf44 = /矩阵按键扫描缓冲区 0xFF, 0

23、xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ; /将一行的4个按键值移入缓冲区 keybufkeyout0 = (keybufkeyout0 1) | KEY_IN_1; keybufkeyout1 = (keybufkeyout1 1) | KEY_IN_2; keybufkeyout2 = (keybufkeyout2 1) | KEY_IN_3; keybufkeyout3 = (keybufkeyout3 1) | KEY_IN_4; /消抖后更新按键状态 for (i=0; i 8); /16位重载值分解为高低两个字节 T1RL = (unsigned char)reload; TH1 = 0xFF; /设定一个接近溢出的初值,以使定时器马上投入工作 TL1 = 0xFE; ET1 = 1; /使能T0中断 TR1 = 1; /启动T0/* 蜂鸣器停止函数*/void StopBuzz() ET1 = 0; /禁用T0中断 TR1 = 0; /停

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1