1、单片机课程设计报告课 题: 电子计算器学 院: 吴俊 08 级电自 08 班 200807111212报 告 人: 目录1 课题概述31.1 课题描述及实现功能31.2 按键说明32 系统的工作流程图43 系统程序设计53.1 主程序模块设计53.2 LCD 模块设计113.3 蜂鸣器模块设计133.4 键盘模块设计143.5 其他程序模块设计164 课程设计心得20吴俊 08 级电自 08 班 2008071112131 课题概述1.1 课题描述及实现功能本课题是基于 ADuC848单片机的电子计算器设计。由于本实验所需的单片机开发板已经确定,相应的硬件部分已经做好,所以我们只需要根据硬件原
2、理图进行软件设计。软件设计部分采用 C语言进行编写。根据要求设计的电子计算器的功能如下:1)利用小键盘作为数据和命令的输入装置;2)利用 LCD显示过程和结果;3)实现的运算包括:正实数的加、减、乘、除、开方、乘方、三角函数运算(sin、cos、tan);4)未工作时显示北京时间;5)当数据超出范围,可声音提示或报警。1.2 按键说明本系统采用 44矩阵键盘作为输入部分,实现数据输入功能。本系统规定的键盘上的各按键功能如下所示:1(+) 2(-) 3(*) ON4(/) 5(sqrt) 6(power) OFF7(sin) 8(cos) 9(tan) ClearFuction 0 . =各按键
3、功能如下:Fuction:功能键。按下此键,显示数字 1至 9括号里的运算符;未按此键,显示数字。ON: 显示北京时间时,按下此键之后进入计算器状态。吴俊 08 级电自 08 班 200807111214OFF:在计算器状态下,按下此键之后显示北京时间。Clear: 清除键。2 系统的工作流程图3 系统程序设计3.1 主程序模块设计#include#include#include#include#include#include#include#include#include#define uchar unsigned chardouble xdata First,End1,End2; /定义全
4、局变量NYYN数据过大数字键 =结果报警C清除off功能键(F)扫描键盘按键?运算方式NYNY初始化时间显示扫描键盘按键?其他 开关扫描键盘按键?吴俊 08 级电自 08 班 200807111215void delay(int n) /延时程序int i,j;for(i=0;i=y) z=x-y;elsez=y-x;return(z);double mul(double x,double y) /乘法程序double z;z=x*y;return(z);double div(double x,double y) /除法程序double z;z=x/y;return(z);double pow
5、er(double x,int y) /乘方程序double z;int i;z=1;for(i=1;i30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;case 2: First=sub(End1,End2);if(First30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;吴俊 08 级电自 08 班 200807111219case 3: First=mul(End1,End2);if(First30000
6、)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;case 4: First=div(End1,End2);if(First30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;case 5: First=sqrt(End2);if(First30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;case 6: First=power(En
7、d1,End2);if(First30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;case 7: First=sin(End2);if(First30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;case 8: First=cos(End2);if(First30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;case 9
8、: First=tan(End2);if(First30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;First=0;n=0;k=-1;g=1; f=0;break;case 100:ReadTime(time);switch(time3)case 1: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Mon.“);break;case 2: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Tues“);break;
9、case 3: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Weds“);break;case 4: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Thurs“);break;case 5: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Fri.“);break;吴俊 08 级电自 08 班 2008071112110case 6: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Sat.“);break;cas
10、e 7: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Sun.“);break;default:break; LCDPrintNumber(0,1,2,time5); /monthLCDPrintString(2,1,“/“);LCDPrintNumber(3,1,2,time4); /dayLCDPrintString(5,1,“/“);LCDPrintNumber(6,1,2,time6); /yearLCDPrintNumber(0,2,2,time2); /hourLCDPrintString(2,2,“:“);LCDPrintNumbe
11、r(3,2,2,time1); /minuteLCDPrintString(5,2,“:“);LCDPrintNumber(6,2,2,time0); /secondkey=GetKey();if (key=12) /*进入计算状态*/t=1;key=0x80;LCDInitialize(); First=0;End1=0;End2=0;f=0;k=-1;g=1;n=0;h=0; break;default:break;if(n=0)End1=First;else End2=First;if(End1|End230000)buzzer();key=14;if(key=14) /清零 ACFirst=0;End1=0;End2=0;f=0;k=-1;g=1;h=0;LCDInitialize();key=0x80; 3.2 LCD 模块设计sbit LCD_RS = P36;sbit LCD_RW = P35;sbit LCD_EN = P33;sfr LCDData=0x80;void LCDWrite(bit cd,unsigned char input);