单片机C语言简易计算器.doc

上传人:豆**** 文档编号:24039885 上传时间:2022-07-03 格式:DOC 页数:22 大小:177.50KB
返回 下载 相关 举报
单片机C语言简易计算器.doc_第1页
第1页 / 共22页
单片机C语言简易计算器.doc_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《单片机C语言简易计算器.doc》由会员分享,可在线阅读,更多相关《单片机C语言简易计算器.doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date单片机C语言简易计算器单片机C语言简易计算器课程设计报告课程名称 单片机原理及应用 设计题目 简易计算器设计 专业班级 姓 名 学 号 1.项目概述中国古代最早采用的一种计算工具叫算筹。这种算筹多用竹子制成,也有用木头,兽骨充当材料的。约二百七十枚一束,放在布袋里可以随身携带。17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师

2、奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘除,乘方,开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。2.项目要求基于AT89C51单片机的简易计算器,设计要求如下:(1) 计算器至少能正常显示8位数。(2) 开机时,显示“0”(3) 计算器能对整数进行简单的加减乘除四则运算,在做除法时能自动舍去小数部分(4) 运算结果超过可显示的位数时能进行出错提示。3.小组人员组成及分工项目组成员完成课程设计的内容主函数设计 利用中断持续间时显示按键扫描录入函数计算器加减乘除四则运算4.系

3、统设计八位七段数码管1.框图设计 显示AT89C51按键录入模块(0-9 +-*/=c) 录入5.硬件设计(1)电路原理图:(2)元件清单:元件名称型号数量用途单片机AT89C511控制核心电阻10k4按键电路数码管8位共阳极1显示电路按键16按键电路6.软件设计(1)算法流程图:开始主函数结束调用运算程序录入数值判断符号录入数值-中断结束定时器赋初值送显示数据关中断中断开始显示函数 按键函数运算查值赋值给变量列扫描行扫描(2)程序清单:#include/*按键程序*/char keyscan();/*显示程序*/ void display();char dsp9=0,0,12,12,12,1

4、2,12,12,12; /初始化显示数组/*计算程序*/ void calculate(char k,char c18,char c28);/*片选*/unsigned char code Select=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;/*码选*/ unsigned char code LED_CODES=0xC0,0xF9,0xA4,0xB0,0x99, /0-40x92,0x82,0xF8,0x80,0x90, /5-90x86,0xAF,0xFF,0x7F,0xBF,; /E,r,空格,.,-/*main函数*/void main(void

5、)char i,j,k,c;char a8,b8;/*定时1ms*/TMOD=0;/TL0=-(1000/256);/TH0=-(1000%256);EA = 1; /总中断开关ET0 = 1; /开中断TR0 = 1; /启用计数器0LR:dofor(i=1;i9;i+) /数字录入循环dsp0=keyscan();if(c=2&dsp010) /此段代码验证是否有旧的计算结果在显示,且不再参与新计算dsp1=dsp0;for(j=2;j9) /旧的计算结果将参与新的计算,作为第一个数c=0;if(dsp0=0&dsp1=0&dsp2=12) /个位为0且十位为空时按下0,按键无效,跳回LR

6、等待正确输入/*goto跳转标志*/ goto LR;else if(dsp09) break; /有操作符按下,跳出数字录入循环 elsefor(j=i;j0;j-)dspj=dspj-1; /移位,以正确显示数字 if(i=9) /判断是否输入8个有效数字,是则等待操作符,否则直接判断操作符do /使用do while无论是否第一个数都取一次操作符dsp0=keyscan(); /获取操作符号if(dsp0=14|dsp010) /按下C或者第9位数字清零dsp1=0;for(i=2;i9;i+)dspi=12;c=0;while(dsp0=15)&(c=0); /等号被按下,等待新的操作

7、符(仅对第一个数字有效)else if(dsp0=14) /按下C清零dsp1=0;for(i=2;i9;i+)dspi=12;c=0;while(dsp0=15&c=0) /未输满8位且是第一个数字即按下等号,等待非等号操作符dsp0=keyscan(); /获取操作符号if(dsp0=14|dsp010) /按下C或者数字都进行清零,重新输入adsp0=14; /将dsp0置为14,防止因数字清零未能拦截dsp1=0;for(i=2;i9;i+)dspi=12;c=0; while(dsp0=14); /数字输入未完成即按下C,重新等待输入doif(c=0) /没有数字输入 k=dsp0;

8、 /存计算符(循环内已排除C、数字)for(i=0;i8;i+) /将第一个数存入a8ai=dspi+1;dsp1=0; /清零for(i=2;i9;i+)dspi=12;c=1; /已输入a/*goto跳转标志*/goto LR;else if(c=1) for(i=0;i8;i+) /将第二个数存入b8bi=dspi+1;c=2; /已输入bif(dsp0!=15) /b输完后操作符不是等号calculate(k,a,b);for(i=0;i8;i+) /将计算结果存入a8,a值更新ai=dspi+1;k=dsp0; /更新计算符c=1;/*goto跳转标志*/goto LR;while(

9、dsp0=15)&(c2); /直到ab输入完成且按下等号calculate(k,a,b); /进行最后计算/*goto跳转标志*/goto LR; /跳回LR,等待新一轮计算while(1); /防止程序跑飞char keyscan()char KeyL;char KeyR;char j;dodoP3=0xF0;P3=P3|0xF0;/行扫描11110000 if(P3!=0xF0)KeyL=P3;P3=0x0F;P3=P3|0x0F;/列扫描00001111KeyR=P3;while(KeyL=0xF0|KeyR=0x0F);for(j=0;j0;j-) /扫描8次for(i=7;i=0;

10、i-) /从高位到低位扫描显示P2=0;P1=LED_CODESdsp8-i;P2=Selecti;for(h=0;h0;i-) /数值转化,将代表空格的12转化为数字0,因为个位不显示空格,默认为0,所以不转化while(ai=12)ai=0;while(bi=12)bi=0;x=a4;x=10000*x;x=x+a0+a1*10+a2*100+a3*1000+a5*100000+a6*1000000+a7*10000000;y=b4;y=10000*y;y=y+b0+b1*10+b2*100+b3*1000+b5*100000+b6*1000000+b7*10000000;if(k=10)

11、/加法运算x=x+y;if(x99999999) /大于8位,显示Errr0=11; /rr1=11; /rr2=10; /Er3=12; /空格r4=12;r5=12;r6=12;r7=12;elser0=x%10;r1=(x%100)/10;r2=(x%1000)/100; r3=(x%10000)/1000;r4=(x%100000)/10000;r5=(x%1000000)/100000;r6=(x%10000000)/1000000;r7=x/10000000;if(k=11)/减法运算 if(x9999999)r0=11; /rr1=11; /rr2=10; /Er3=12; /空

12、格r4=12;r5=12;r6=12;r7=12;elser0=x%10;r1=(x%100)/10;r2=(x%1000)/100; r3=(x%10000)/1000;r4=(x%100000)/10000;r5=(x%1000000)/100000;r6=(x%10000000)/1000000;r7=x/10000000;for(i=7;i0;i-) /将有效数字的高一位转化为号if(ri=0&ri-1!=0)ri=14;break;elsex=x-y;r0=x%10;r1=(x%100)/10;r2=(x%1000)/100; r3=(x%10000)/1000;r4=(x%100000)/10000;r5=(x%1000000)/100000;r6=(x%10000000)/1000000;r7=x/10000000; if(k=12)/乘法运算i=x;x=x*y;if(y=0)x=0;else if(x99999999|x0;i-) /数值转化,将高位的无效数字0转化为空格符12if(ri=0)ri=12;else break;for(i=0;i8;i+) /将计算结果存入dsp9,显示数更新dspi+1=ri;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁