《单片机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;