1、单片机课程设计报告课 题: 电子计算器学 院: 望开新 08 级电自 08 班 200807111202报 告 人: 目录1 课题概述31.1 课题描述及实现功能31.2 按键说明32 系统的工作流程图43 系统程序设计53.1 主程序模块设计53.2 LCD 模块设计113.3 蜂鸣器模块设计133.4 键盘模块设计143.5 其他程序模块设计164 课程设计心得20望开新 08 级电自 08 班 2008071112031 课题概述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、. =各按键功能如下:望开新 08 级电自 08 班 200807111204Fuction:功能键。按下此键,显示数字 1 至 9 括号里的运算符;未按此键,显示数字。ON: 显示北京时间时,按下此键之后进入计算器状态。OFF:在计算器状态下,按下此键之后显示北京时间。Clear: 清除键。2 系统的工作流程图3 系统程序设计3.1 主程序模块设计#include#include#include#include#include#include#includeNYYN数据过大数字键 =结果报警C清除off功能键(F)扫描键盘按键?运算方式NYNY初始化时间显示扫描键盘按键?其他 开关扫描键盘按
4、键?望开新 08 级电自 08 班 200807111205#include#include#define uchar unsigned chardouble xdata First,End1,End2; /定义全局变量void 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);
5、double power(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;望开新 08 级电自 08 班 200807111209case 2: First=sub(End1,End2);if(First30000)buzzer();key=14;else ecvt(First,fp);LCDPrintString(0,2,fp);break;case 3: First=mul(End1,End2);if
6、(First30000)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: Fir
7、st=power(End1,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);b
8、reak;case 9: 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,“Tu
9、es“);break;case 3: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Weds“);break;望开新 08 级电自 08 班 2008071112010case 4: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Thurs“);break;case 5: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Fri.“);break;case 6: LCDPrintString(10,1,“ “);LCDPrintString(10,1,“Sat.
10、“);break;case 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,“:“);L
11、CDPrintNumber(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;