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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

HL单片机简单计算器程序xys.docx

1、HL单片机简单计算器程序xys /*H-L51单片机【简单计算器】程序*/*知识运用到:LED灯,蜂鸣器,LED显示器动静态显示,矩阵键盘输入,定时器*/* #include /【计算器】 键盘模式 1 2 3 4 【功能;加减乘除基本运算,两位输入四位可#define uint unsigned int / 5 6 7 8 带一位小数点输出,最大显示:99*99=9801】#define uchar unsigned char / 9 0 =sbit dula=P26; /控制数码管段选的锁存器锁存端 / + - * /sbit wela=P27; /控制数码管位选的锁存器锁存端 sbit

2、beep=P23; /蜂鸣器接口uchar num=0,temp,shu,xshu,ge,shi,bai,qian,d,e,f,g; long i,j,xiaoshu,aa; /i用于表示输入次数,j 表示输入运算符(可用于区分a、b),aa用于定时器float zh,a1,a2,b1,b2,a2a1,b2b1,c;/a2a1、 b2b1运算等于zh,由于有运算结果小数点输出,故需定义为浮点型uchar code table= /编码表table= 0,1,2,3 0x3f,0x06,0x5b,0x4f, / 4,5,6,7,0x66,0x6d,0x7d,0x07, / 8,9,A,B,0x7

3、f,0x6f,0x77,0x7c, / C,D,E,F,无显示,_,.,0x39,0x5e,0x79,0x71,0x00,0x08,0x80;/*【延迟函数】*/void delay(uint z) uint x,y; for(x=100;x0;x-) for(y=z;y0;y-); /*【中断函数】*/void jishu() interrupt 1 aa=0; /*【显示函数】*/display1(d) / 【个位显示】 P0=tabled; /将第num 个显示编码送P0 dula=1; /一个下降沿将数据锁存 dula=0; P0=0xdf; /位选通全部的数码管 wela=1; /一

4、个下降沿将数据锁存 wela=0; display2(e) P0=tablee; /【十位显示】 dula=1; dula=0; P0=0xef; wela=1; wela=0; display3(f) P0=tablef; /【百位显示】 dula=1; dula=0; P0=0xf7; wela=1; wela=0; display(g) /【千位显示】 P0=tableg; dula=1; dula=0; P0=0xfb; wela=1; wela=0; display4(shu) /【数显示】/*千百十个四位显示 xiaoshu=zh*10; xshu=xiaoshu%10; if(x

5、shu=1) /*判断是否存在小数点 if(shu/100=1)/(判断有没有百位) bai=shu/100; shi=shu%100/10; ge=shu%100%10; while(1) display(bai); delay(2); display3(shi); delay(2); display2(ge); delay(2); display2(18); delay(2); display1(xshu); delay(2); /if(shu/100 else if(shu/10=1)/(判断有没有十位) shi=shu/10; ge=shu%10; while(1) display3(

6、shi); delay(2); display2(ge); delay(2); display2(18); delay(2); display1(xshu); delay(2); /else if(shu/10 else if(shu/1=1) ge=shu/1; while(1) display2(ge); delay(2); display2(18); delay(2); display1(xshu); delay(2); /else if(shu/1 else while(1)display2(18);delay(2);display1(xshu);delay(2); /if(xshu

7、/*判断是否存在小数点 else /第一个if对应的else if(shu/1000=1)/(判断有没有千位) qian=shu/1000; bai=shu%1000/100; shi=shu%1000%100/10; ge=shu%1000%100%10; while(1) display(qian); delay(2); display3(bai); delay(2); display2(shi); delay(2); display1(ge); delay(2); /if(qian else if(shu/100=1)/(判断有没有百位) bai=shu/100; shi=shu%100

8、/10; ge=shu%100%10; while(1) display3(bai); delay(2); display2(shi); delay(2); display1(ge); delay(2); else if(shu/10=1)/(判断有没有十位) shi=shu/10; ge=shu%10; while(1) display2(shi); delay(2); display1(ge); delay(2); else display1(shu); /else /【数显示】/*千百十个四位显示display5(shi,ge) /【定时】十个位显示,用于防止死循环的动态显示 EA=1;

9、 ET0=1; TMOD=0x01; TH0=(65536-100000)/256;/0.5s计数 TL0=(65536-100000)%256; while(aa) display2(shi); delay(5); display1(ge); delay(5); TR0=1; /启动定时器TR0 display1(17); delay(300); display1(16); delay(300); display1(17); /*【蜂鸣器鸣灭函数】*/void whbeep() while(temp!=0xf0) /这段程序是检测按键是否被释放 temp=P3; /如果没有释放就一直等待并且

10、 temp=temp&0xf0; beep=0; /蜂鸣器一直响 beep=1; /释放后关闭蜂鸣器 /*【主函数】*/*【主要通过键盘检测等技术来实现】*/void main() i=0;j=0;display4(0);while(1) P3=0xfe; /给P3.0 送低电平,其余为高电平,即1111 1110,以便检测第一列的四个键盘 temp=P3; /把P3 口数据读回来 temp=temp&0xf0;/把P3 口与11110000 相与 while(temp!=0xf0)/当有键按下刚一定不相等,于是进入/下一步检测 delay(5); /软件延时去抖动 temp=P3; temp

11、=temp&0xf0; switch(temp) /因为我们刚才是将第一行置的低,在这里再判断是第几列 case 0xe0:num=1;i+; break; /如果temp=0xee 则为第一行和第一列的交叉点,由此我们知道是矩阵键盘上的第一个键被按下,我们给num=1 case 0xd0:num=2;i+; break; case 0xb0:num=3;i+; break; case 0x70:num=4;i+; break; whbeep();/ 控制蜂鸣器的响 delay(8); /延时 while(temp!=0xf0); /软件松手检测 if(j=0) if(i=1)a2=num;a

12、2a1=a2;display1(a2a1);P1=0xfe;/如果j=0,i=1,表示第一次输入,赋值给a2-显示-开第一个灯 else a1=num;a2a1=10*a2+a1; aa=4;display5(a2,a1);TR0=0;P1=0xfe;/如果j=0,i=1,表示第二次次输入,赋值给a1-关计数器-显示-开第一个灯 else if(i=1)b2=num;b2b1=b2;display1(b2b1);P1=0xf8;/如果j=1,i=1,表示第一次输入,赋值给a2-显示-开第一个灯 else b1=num;b2b1=10*b2+b1; aa=4;display5(b2,b1);TR

13、0=0;P1=0xf8;/如果j=1,i=2,表示第二次次输入,赋值给a1-关计数器-显示-开第一个灯 /while(temp!=0xf0) P3=0xfd; /给P3.1 送低电平,其余为高电平,即1111 1101,以便检测第二列的四个键盘 temp=P3; temp=temp&0xf0; while(temp!=0xf0) delay(5); temp=P3; temp=temp&0xf0; switch(temp) case 0xe0:num=5;i+; break;/i自加作用为标记第一第二次输入,过程为i=1、2、0、1、2 。 case 0xd0:num=6;i+; break;

14、/*其实程序中的总流程为,输入a2(输入a1?),输入运算符号(用j=1234标记),输入b2(在输入b1),运算,输出*/ case 0xb0:num=7;i+; break; case 0x70:num=8;i+; break; whbeep(); delay(8); while(temp!=0xf0); if(j=0) if(i=1)a2=num;a2a1=a2;display1(a2a1);P1=0xfe; /P1=0xfe; else a1=num;a2a1=10*a2+a1; aa=4;display5(a2,a1);TR0=0;P1=0xfe; / else if(i=1)b2=

15、num;b2b1=b2;display1(b2b1);P1=0xf8; else b1=num;b2b1=10*b2+b1; aa=4;display5(b2,b1);TR0=0;P1=0xf8; /while(temp!=0xf0) P3=0xfb; /给P3.2 送低电平,其余为高电平,即1111 1011,以便检测第三列的四个键盘 temp=P3; temp=temp&0xf0; while(temp!=0xf0) delay(5); temp=P3; temp=temp&0xf0; switch(temp) case 0xe0:num=9;i+; break; case 0xd0:nu

16、m=0;i+; break; case 0xb0:num=11; break; case 0x70:num=12; break; whbeep(); delay(8); while(temp!=0xf0); if(num=13)display1(num); /运算符显示d,c,e,无显示 /while(temp!=0xf0) if(j0) switch(j) /当输入b2开始时就计算运算结果,以方便随时输出结果 case 0:zh=0;break; case 1:zh=a2a1+b2b1; break; case 2:zh=a2a1-b2b1; break; case 3:zh=a2a1*b2b1; break; case 4:zh=a2a1/b2b1; break; /if(i=3) /while(1) /void

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

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