




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
吴俊 08级电自08班 20080711121单片机课程设计报告课 题: 电子计算器学 院: 报 告 人: 目录1 课题概述31.1 课题描述及实现功能31.2 按键说明32 系统的工作流程图43 系统程序设计53.1 主程序模块设计53.2 LCD模块设计113.3 蜂鸣器模块设计133.4 键盘模块设计143.5 其他程序模块设计164 课程设计心得201 课题概述1.1 课题描述及实现功能本课题是基于ADuC848单片机的电子计算器设计。由于本实验所需的单片机开发板已经确定,相应的硬件部分已经做好,所以我们只需要根据硬件原理图进行软件设计。软件设计部分采用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)ClearFuction0.=各按键功能如下:Fuction:功能键。按下此键,显示数字1至9括号里的运算符;未按此键,显示数字。ON: 显示北京时间时,按下此键之后进入计算器状态。OFF:在计算器状态下,按下此键之后显示北京时间。Clear: 清除键。2 系统的工作流程图NYYN数据过大数字键 =结果报警C清除off功能键(F)扫描键盘 按键?运算方式NYNY初始化时间显示扫描键盘 按键?其他开关扫描键盘 按键? 3 系统程序设计3.1 主程序模块设计#include#include#include#include#include#include#include#include#include#define uchar unsigned chardouble xdata First,End1,End2; /定义全局变量void delay(int n) /延时程序int i,j; for(i=0;in;i+) for(j=0;j=y) z=x-y; else z=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 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; case 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(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: First=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);break; 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,Tues);break; 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; case 6:LCDPrintString(10,1, );LCDPrintString(10,1,Sat.);break; case 7:LCDPrintString(10,1, );LCDPrintString(10,1,Sun.);break; default:break; LCDPrintNumber(0,1,2,time5); /month LCDPrintString(2,1,/); LCDPrintNumber(3,1,2,time4); /day LCDPrintString(5,1,/); LCDPrintNumber(6,1,2,time6); /year LCDPrintNumber(0,2,2,time2); /hour LCDPrintString(2,2,:); LCDPrintNumber(3,2,2,time1); /minute LCDPrintString(5,2,:); LCDPrintNumber(6,2,2,time0); /second key=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) /清零AC First=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);void LCDWait(unsigned char CiShu);void LCDDelay();void LCDInitialize();void LCDPrintString(unsigned char x,unsigned char y,unsigned char *string);void LCDPrintNumber(unsigned char x,unsigned char y,unsigned char WeiShu,unsigned int number);unsigned char ReadState();void LCDInitialize() LCDDelay();LCDWrite(0,0x38); /*设置16*2显示,5*7点阵,8位数据接口*/LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x38);LCDDelay();LCDWrite(0,0x08); /*关显示,不显示光标,光标不闪烁*/LCDDelay();LCDWrite(0,0x01); /*显示清屏,数据指针清零,所有显示清零*/LCDDelay();LCDWrite(0,0x06); /*读或写一个字符后地址指针加一,且光标加一,整屏显示不移动*/LCDDelay();LCDWrite(0,0x0c); /*开显示,不显光标,光标不闪*/void LCDWrite(bit cd,unsigned char DATA) /*cd=0,写命令;cd=1,写数据*/LCDWait(20);LCD_RS=cd;LCD_RW=0;LCD_EN=0;LCDData=DATA;LCD_EN=1;LCD_EN=0;void LCDPrintString(unsigned char x,unsigned char y,unsigned char *string) /*写字符串*/unsigned char address;address=x+(y-1)*0x40+0x80; /*指针定位,x为列,y为行*/LCDWrite(0,address);while(*string!=0)LCDWrite(1,*string);string+;void LCDPrintNumber(unsigned char x,unsigned char y,unsigned char WeiShu,unsigned int number)unsigned char address; /*写数字,最大为6位数,x列,y行,位数,数字*/unsigned char j,temp5;address=x+(y-1)*0x40+0x80;LCDWrite(0,address);temp0=(number%100000)/10000+48;temp1=(number%10000)/1000+48;temp2=(number%1000)/100+48;temp3=(number%100)/10+48;temp4=number%10+48;for(j=5-WeiShu;j5;j+)LCDWrite(1,tempj); void LCDWait(unsigned char CiShu)unsigned char i;for(i=0;iCiShu;i+)if(ReadState()&0x80)continue;else break; unsigned char ReadState() /*读状态*/unsigned char temp;P0=0xff;LCD_EN=0;LCD_RS=0;LCD_RW=1;LCD_EN=1;temp=LCDData;LCD_EN=0;return temp; void LCDDelay()unsigned int a;for(a=0;a1000;a+);3.3 蜂鸣器模块设计void buzzer() unsigned char i,j,k,l; for(k=0;k8;k+) for(i=0;i100;i+) for(j=0;j10;j+) P2|=0x40;/*P2.6=1*/ delay(3); P2&=0xbf;/*P2.6=0*/ delay(4); for(l=0;l100;l+) delay(100); for(i=0;i100;i+) for(j=0;j5;j+) P2|=0x40;/*P2.6=1*/ delay(6); P2&=0xbf;/*P2.6=0*/ delay(8); for(l=0;l100;l+) delay(100); void delay(unsigned int x) unsigned int m,n; for(m=0;mx;m+) for(n=0;n10;n+); 3.4 键盘模块设计void KeyDelay(unsigned int KeyJsTime); /按键扫描头文件unsigned char GetKey();unsigned char GetKey()unsigned char temp;P1&=0xf0;P2&=0xf0; temp=P1&0x0f;if(temp!=0x0f)KeyDelay(666666) ;if(temp=(P1&0x0f)P2|=0x0e;switch(P1&0x0f)case 0x0e:return 12;case 0x0d:return 13;case 0x0b:return 14;case 0x07:return 15;case 0x0f:break;default:return 0x80;P2&=0xf0;P2|=0x0d;switch(P1&0x0f)case 0x0e:return 3;case 0x0d:return 6;case 0x0b:return 9;case 0x07:return 11;case 0x0f:break;default:return 0x80;P2&=0xf0;P2|=0x0b;switch(P1&0x0f)case 0x0e:return 2;case 0x0d:return 5;case 0x0b:return 8;case 0x07:return 0;case 0x0f:break;default:return 0x80;P2&=0xf0;P2|=0x07;switch(P1&0x0f)case 0x0e:return 1;case 0x0d:return 4;case 0x0b:return 7;case 0x07:return 10;case 0x0f:break;default:return 0x80; return 0x55;void KeyDelay(unsigned int KeyJsTime)unsigned char temp;unsigned int JsKeyDelay;for(JsKeyDelay=0;JsKeyDelayKeyJsTime;JsKeyDelay+)temp+;3.5 其他程序模块设计1.浮点数转字符串程序#include#include#includechar ecvt( double m,char *str); int a16; char ecvt( double m,char *str)int x,i,j,temp,tmp,num,n,p; x=m;p=1; tmp=x; num=0; while(x) anum=x%10; if(anum+=0) p=p*1; else p=p*0; x/=10; if(p!=1) for(i=num-1,j=0;i=0;i-) strj+=ai+0; else strnum+=0; strnum=.;n=num; temp=(m-tmp)*10000; while(temp) anum+=temp%10; temp/=10; for(i=n+3,j=n+1;i=n;i-) strj+=ai+0; if(an!=0) strn+5=0; elseif(an+1!=0) strn+4=0; elseif(an+2!=0) strn+3=0; elseif(an+3!=0) strn+2=0; else strn=0; for(i=0;i16;i+) ai=0; return(*str); 3.sin程序#include#includedouble sin(double y);double sin(double y)double xdata x,s,fm,t,t1; double xdata fs; int n=1;/项数 x=3.14*y/180; s=0,fs=x,fm=1,t1=1;/求和、分子、分母、精度、t1表示符号位 t=fs/fm;/精度赋值while(fabs(t)=1e-6)/循环条件s=s+t;/求和n+;/基数增加fs=fs*x*x;/新分子fm=fm*(2*n-2)*(2*n-1);/新分母t1=t1*(-1);/符号位一正一负t=t1*(fs/fm);/精度s=(double)s;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 焊接材料制造工适应性考核试卷及答案
- 外贸咨询采购计划方案
- 公司线上活动策划方案案例
- 建筑方案设计的表现方法
- 春节促销活动策划方案超市
- 农村建房工程质量管理
- 美容策划活动方案编辑软件
- 驾校嘉年华活动策划方案
- 石狮心理咨询方案
- 营销方案考试题库
- 《足球裁判员培训》课件
- 《农产品种植技术培训》课件
- 道路危险货物运输安全标准化制度汇编
- 特殊教育机构学生出勤管理规定
- 2024年秋九年级化学上册 第3单元 物质构成的奥秘 课题3 元素 第1课时 物质是由元素组成的说课稿 (新版)新人教版
- 微商基础培训课件
- ISO9001:2024版质量手册资料
- 2024年高校红十字应急救护大赛理论考试题库(含答案)
- 2023-2024年社会工作者之初级社会综合能力考试题库
- 餐厅厨房装修改造工程施工组织设计方案
- 食品生产监管能力大比武理论考试题及答案
评论
0/150
提交评论