

免费预览已结束,剩余28页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖南大学电气与信息工程学院本科生课程设计题目: 电子计算器课程:单片机课程设计专业:自动化班级: 学号:姓名: 同组 成员: 无指导老师: 设计时间: 2014年4月-2014年6月目录1 任务及设计要求31.1 任务31.2 要求32 系统原理框图33 硬件原理图43.1 aduc848学习板43.2 各模块原理图及其作用63.3 芯片6 3.4 电源63.5 键盘63.6 lcd160274程序和流程图75使用说明276 心得体会287参考文献28一、任务及设计要求1、任务设计一个四则运算的电子计算器,采用led或lcd显示。2、要求1)利用小键盘作为数据和命令的输入装置2)利用led或lcd作为过程和结果的输出装置3)可实现基本的数据运算,包括:加、减、乘、除、开方等4)未工作时显示北京时间,可调整5)当数据超出范围,可声音提示或报警6)可通过按键控制,随机模拟滚动显示乘法口诀表2、 系统原理框图 aduc848独立键盘lcd1602液晶显示电源通过单片机的计算、控制功能和lcd1602的显示功能,行列键盘的输入功能,可以实现一个计算器的基本功能如加、减、乘、除、乘方,开方,三角函数的功能,但由于aduc848单片机位数的限制和内存的不足,限制了显示的位数和计算功能。本计算器只能在0到32768的计数范围内正确的处理和显示得数,因为采用按键复用的设计,克服了键盘上按键不够的难题。由于内存不足和函数调用不精确等原因,在本计算器内并没有使用keil自带的math头文件来获取乘方开方的函数,而是自己编写了一个整数的乘方开方函数,在适用范围内有可以得到正确得数。同时,设计了一个简易的时间显示。在计算器进行计算的同时,时钟程序也在运行,不会因计算的过程对时间的参数造成影响。3、 硬件原理图aduc848学习板1、两路16位adc输入、可作差分输入;2、12位dac输出;3、运放lm358; 4、rs232串口;5、步进电机(5v、70欧、6线4相)接口;6、ps/2接口;7、插针11,用于选择ps/2或者红外接收头;8、红外接收头;9、线性稳压芯片7805;10、复位按键和下载按键;11、开关以及功能选择插针110(从左至右)12、4x4矩阵式键盘,左边4个可以作独立按键;13、直流电源输入;14、usb电源输入接口;15、iic接口;16、rtc ds1307;17、eeprom at24c08;18、8位数码管;19、spi接口;20、上排图形点阵lcd12864的接口、 下排lcd1602的接口;21、红外二极管;22、8路led;23、蜂鸣器;24、p3口扩展接口;25、单片机aduc848;26、p2口扩展接口;27、p0口扩展接口. 学习板原理图:各模块原理图及作用:单片机引脚分布pin14:(p1.0p1.3)作为矩阵式键盘或独立按键的输入,p1口只能用于输入,默认用于模拟输入,作为数字输入使用时应先往p1口相应引脚写0,这里可以用p0&=0xf0。若p2、p3、p0口要作为输入,则应往相应引脚写1。pin5、6:avdd、agnd,模拟电源输入。pin7、8:外部参考电压接入,pin7接agnd。片内dac有2.5v内部参考,adc有1.25v内部参考。pin9、10:(p1.4、p1.5)两路ad输入,可做差分输入,需要设置adc的寄存器。pin11、12:(p1.6、p1.7)各200ua激励电流源,可配合rtd等做应用。pin13:两路ad输入做普通输入时的电压参考端,ad输入电压不能低于此引脚电压。pin14:片内dac输出。pin15:复位引脚。pin16、17:单片机rs232接口的rxd(p3.0) txd(p3.1)。pin18:(p3.2) 外部中断0,用于红外接收和ps/2接口。pin19:(p3.3)lcd1602,lcd12864a的en引脚,控制第一位数码管。pin20、21:dvdd、dgnd数字电源输入。pin22:(p3.4)ps/2接口的data信号。pin23:(p3.5)lcd1602和lcd12864a的rw。pin24:(p3.6)lcd1602和lcd12864a的rs。pin25:lcd12864a的cs1。pin26:iic接口时钟信号。pin27:iic接口data信号。pin28:(p2.0)spi接口时钟信号。pin29:(p2.1)spi接口mosi信号、控制第6位数码管的位码。pin30:(p2.2)spi接口miso信号、控制第7位数码管的位码。pin31:(p2.3)spi接口ss信号、控制第8位数码管的位码;p2.03也作为4x4矩阵式键盘的扫描输出信号、步进电机的控制信号、数码管第数码管第6、7、8位位码。但是spi、4x4矩阵式键盘、步进电机、数码管第6、7、8位功能不能同时实现。pin32、pin33:接外部32.768khz晶振。pin34、pin35:dvdd、dgnd。pin36:(p2.4)lcd12864a的cs2。pin37:(p2.5)内部pwm模块输出,控制红外led。pin38:(p2.6)内部pwm模块输出,控制蜂鸣器。pin39:(p2.7)内部pwm模块的外部时钟输入(也可以用内部时钟)。pin40:ea,低电平有效,正常使用时拉低。pin41:psen,在此引脚电平为低时按复位键进入debug模式,可以下载和调试程序。pin42:ale。pin47、pin48:dgnd、dvdd。pin43、44、45、46、49、50、51、52:p0口、lcd1602和lcd12864的数据总线,数码管的段码。电源模块本学习板共有如下3种供电方式: (1)5v电源适配器供电(开关往上拨、插针1下面两脚接跳线帽)。将开关sw4第2、3脚接通(开关往上拨),电源网络dvdd连接到插针1第2脚的输出,将插针1的第1、2脚(插针1下面两脚)接跳线帽,dvdd直接连接到电源适配器输入端,即为5v电源适配器供电模式。(2)712v电源适配器供电(开关往上拨、插针1上面两脚接跳线帽) 将开关sw4第2、3脚接通(开关往上拨),电源网络dvdd连接到插针1第2脚的输出,将插针1的第2、3脚(插针1上面两脚)接跳线帽,dvdd连接到稳压芯片7805的输出,而7805的输入端连接到电源适配器输入端,即为712v的电源适配器经7805给学习板供电的模式。(3)usb供电(开关往下拨)。将开关sw4第1、2脚接通(开关往下拨),电源网络dvdd连接到usb电源输入端。对dvdd网络和avdd网络设了测试点,方便调试。独立键盘,用来实现数据和指令的输入。由于p1口(用于行扫描)内部无上拉电阻,为使无键按下时行信号为高电平,故将行信号接上拉电阻,电阻大小10k即可。引脚复用:p2.0p2.3为4x4矩阵式键盘列扫描信号,又复用作步进电机控制信号,spi信号、p2.1p2.3还复用为数码管第5、6、7位位码控制信号。参与复用的一项功能使用时,其他参与复用的功能则不能使用。插针配置: (1)插针10上面两脚接跳线帽,4x4矩阵式键盘输入,行扫描信号为p1.0p1.3,列扫描信号为p2.02.3。(2)插针10下面两脚接跳线帽,独立按键输入,该模式有4个独立按键可用,按键扫描所用端口为p1.0p1.3。这4个按键为4x4矩阵键盘的左边4个按键。lcd1602液晶显示屏,用来显示时间和计算数据。关键网络名和引脚名解释: (1)disctrl04:显示控制信号。(2)d0d7、db0db7:数据总线。(3)e:lcd使能信号。(4)rs:数据、指令选择信号。(5)rw:读、写选择信号。4、 程序和流程图1、流程图初始化时间显示扫描键盘计算按键?n扫描键盘 y按键?n y等号数字功能清除时间按键扫描键盘lc显示数据过大 n 按键? 报警 y n 运算方式 y y加减乘除2、程序清单1、 主函数部分#include#include#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;j25;j+) ;double add(double x,double y) /加法程序 double z; z=x+y; return(z); double sub(double x,double y) /减法程序double z; z=x-y; 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;i32768)buzzerset();ecvt(first,fp);lcdprintstring(0,2,fp);break; case 2: first=sub(end1,end2);if(first32768)buzzerset(); if(first32768)buzzerset();ecvt(first,fp);lcdprintstring(0,2,fp);break; case 4: first=div(end1,end2);if(first32768)buzzerset();ecvt(first,fp);lcdprintstring(0,2,fp);break; case 5: first=sqrt(end2);if(first32768)buzzerset();ecvt(first,fp);lcdprintstring(0,2,fp);break; case 6: first=power(end1,end2);if(first32768)buzzerset();ecvt(first,fp);lcdprintstring(0,2,fp);break; case 7: first=sin(end2);ecvt(first,fp);if(first32768)buzzerset();lcdprintstring(0,2,fp);break; case 8: first=cos(end2);ecvt(first,fp);if(first32768)buzzerset();lcdprintstring(0,2,fp);break; case 9: first=tan(end2);ecvt(first,fp);if(first32768)buzzerset();lcdprintstring(0,2,fp);break; /*first=0;*/n=0;k=-1;g=1;ans=1; f=0;break; case 100: readtime(time); switch(time3) case 1:lcdprintstring(8,1, );lcdprintstring(10,1,mon.);break; case 2:lcdprintstring(8,1, );lcdprintstring(10,1,tues);break; case 3:lcdprintstring(8,1, );lcdprintstring(10,1,weds);break; case 4:lcdprintstring(8,1, );lcdprintstring(10,1,thurs);break; case 5:lcdprintstring(8,1, );lcdprintstring(10,1,fri.);break; case 6:lcdprintstring(8,1, );lcdprintstring(10,1,sat.);break; case 7:lcdprintstring(8,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);lcdprintstring(8,2, ); /second key=getkey(); if (key=12) /*进入计算状态*/ cnt=0;t=1;key=0x80;lcdinitialize(); first=0;end1=0;end2=0;f=0;k=-1;g=1;n=0;h=0;ans=0; break; default:break; if(n=0) end1=first;else end2=first; if(key=14) /清零ac cnt=0;first=0;end1=0;end2=0;f=0;k=-1;g=1;h=0;lcdinitialize();ans=0; key=0x80; 2、 键盘模块程序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、 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+);4、 时间模块程序 /iic总线模块void iicdelay(unsigned int times);void iicstart() mde=1; mdo=1; iicdelay(2); mco=1; iicdelay(2); mdo=0; iicdelay(2);void iicstop() mde=1; mdo=0; iicdelay(2); mco=1; iicdelay(2); mdo=1;void iicack() mde=1; mco=0; mdo=0; iicdelay(2); mco=1; iicdelay(2); mco=0; iicdelay(1); mdo=1;void iicnack() mde=1; /mco=0; mdo=1; iicdelay(2); mco=1; iicdelay(2); mco=0; bit iicreadack() bit ack; mco = 0; iicdelay(2); mde=1; mdo=1; mco=1; iicdelay(2); mde=0; ack=mdi; mco=0; return ack; void iicwriteda(unsigned char da) unsigned char i; mde=1; for(i=0;i8;i+) mco=0; iicdelay(0); if(dai)&0x80) mdo=1; else mdo=0; iicdelay(2); mco=1; iicdelay(3); mco=0;unsigned char iicreadda() unsigned char da; int i; da=0; mde=1; mdo=1; mde=0; for(i=0;i8;i+) mco=0; iicdelay(3); mco=1; iicdelay(1); if(mdi=1) da=da1;da+; else da=da1; mco=0; return da;void iicdelay(unsigned int t) unsigned int i,j; for(i=0;i0;j-); void readtime(unsigned char time7) bit eatemp; unsigned char temp; eatemp=ea; cfg848|=0x01;/使用片内xram iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicstop(); iicdelay(1); iicstart(); iicwriteda(0xd1); iicreadack(); time0=iicreadda(); iicack(); time1=iicreadda(); iicack(); time2=iicreadda(); iicack(); time3=iicreadda(); iicack(); time4=iicreadda(); iicack(); time5=iicreadda(); iicack(); time6=iicreadda(); iicnack(); iicstop(); iicdelay(1); time0=(time0&0x7f)4)*10+(time0&0x0f); /second time1=(time1&0x7f)4)*10+(time1&0x0f); /minute if(time2&0x40) if(time2&0x20)temp=0x80;else temp=0x40; time2=(time2&0x1f)4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 备选公益岗位发言稿
- 学生开学典礼发言稿
- 时间的脚印微课课件
- 时间序列课件王燕
- 金蝶销售流程培训
- 2025版大型企业总部办公室设备搬迁与配置服务合同
- 2025版跨境电商玩具出口合同文本
- 2025版电子商务平台用户体验优化托管服务合同
- 二零二五年度产品发布会速记工作及保密协议
- 二零二五年度商业综合体电梯购置、安装及运营合同
- 2025云南航空产业投资集团(云南机场集团)限责任公司招聘97人管理单位笔试遴选500模拟题附带答案详解
- GA/T 761-2024停车库(场)安全管理系统技术要求
- 体彩店雇人雇佣合同6篇
- 青少年抑郁症的症状辨识
- 2024-2025学年八年级上册物理 第五章 透镜以及其应用 测试卷(含答案)
- 隧洞施工安全教育培训
- 《车船税法》课件
- 吉林大学《数据库系统原理(双语)》2021-2022学年期末试卷
- JJF 2158-2024 热量表型式评价大纲
- 客户投诉制度
- 公司领导碰头会制度
评论
0/150
提交评论