《单片机开发板 计算器 电梯 密码锁 万年历 交通灯课程设计宝贝及程序bndv.docx》由会员分享,可在线阅读,更多相关《单片机开发板 计算器 电梯 密码锁 万年历 交通灯课程设计宝贝及程序bndv.docx(66页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、开发板实验报告设 计 课 题题:基于单片片机的简简易计算算器指 导 老 师师:班 级: 学 号: 姓 名:一 设计计内容和和目的本次实验验的任务务就是要要以511系列单单片机为为核心实实现一个个简易计计算器计计算器,它它的结构构非常简简单,外外部主要要由4*4矩阵阵键盘和和一个液液晶显示示屏构成成,内部部由一块块AT899C51单单片机构构成,通通过软件件编程可可实现简简单加减减乘除。目的:做自己己喜欢的的实验,提提高自学学能力。二 方案案论证经分析,计计算器电电路包括括三个部部分:显显示电路路、4*4键扫扫描电路路、单片片机微控控制电路路。具体体如下:) LCD显显示电路路LCD116022
2、作为一一个成熟熟的产品品,使用用简单,模模式固定定,便于于移植到到各种类类型的程程序,但但是初学学者往往往要注意意结合LLCD本本身的时时序图来来完善初初始化程程序。又又以其微微功耗、体体积小、显显示内容容丰富、超超薄轻巧巧的诸多多优点,故故采用LLCD.) 4*4键键盘扫描描电路(中断式式,扫描描式,反反转式)用户设计计行列键键盘接口口,一般般常采用用3 种方方法读取取键值。一一种是中中断式,外外两种是是扫描法法和反转转法。中断式:在键盘盘按下时时产生一一个外部部中断通通知CPPU,并并由中断断处理程程序通过过不同的的地址读取数数据线上上的状态态,判断断哪个案案件被按按下。本本实验采采用中断
3、断式实现现用户键键盘接口口。扫描法:对键盘盘上的某某一行送送低电平平,其他他行为高高电平,然然后读取取列值。若若列值中中有一位是低,则则表明该该行与低低电平对对应列的的键被按按下;否否则,扫扫描下一一行。反转法:先将所所有行扫扫描线输输出低电电平,读读列值。若若列值有有一位是是低,则则表明有有键按下下,读列值;然后所所有列扫扫描线输输出低电电平,再再读行值值。根据据读到的的值组合合就可以以查表11 得到到的键码。这个就仁仁者见仁仁智者见见智了,不不过如果果熟悉了了扫描式式,建议议果断升升级自己己的硬件件(很简简单加个个74LLS088与门),故故采用节节省CPPU的中中断式扫扫描电路路。) 单
4、单片机微微控制电电路微控制电电路就是是以ATT89CC51为为核心的的控制核核心,主主要注意意晶振电电路的接接法和复复位电路路的接法法。三 硬件件电路的的设计21 硬硬件设计计电路框框图51系列单片机系统4*4键盘LCD显示 晶振电路复位电路线路原理框图22 硬硬件设计计电路的的元件清清单器件名称称数量AT899C5111按键1774LSS08110K电电阻9电容222uF1LCD1160221晶振122MHzz1电容300pF25K电位位器123 硬硬件设计计电路图将4*44的键盘盘直接接接在P11口上,用用P0口作为为LCDD的显示示输出,PP3.22口的INNT0作作为外部部中断位位。2
5、4 硬硬件设计计的补充充说明四软件设设计程序序及描述述本程序组组成可分分为3个模块块:矩阵阵键盘模模块,LLCD显显示模块块,和运运算模块块(源程程序见底底页)开始初始化参数初始化LCD显示有键输入?读取键码LCD显示数字键清零键功能键状态清零输入数值数值送显示缓冲YN等待数值输入结果送显示缓冲根据上次功能键和输入的数据计算结果本次功能键?等待数值输入结果送显示缓冲等待数值输入结果送显示缓冲五硬软件件的调试试及方法法我个人遇遇到的主主要问题题出现在在LCDD16002上,要要不是我我自己买买了块新新的LCCD恐怕怕我的结结论,就就只能在在软件仿仿真实现现了。硬件上:在不加加芯片调调试时,LLC
6、D116022只显示示一排全全黑,一一般说明明该元件件是好的的。(但但也不一一定,我我那时就就一直认认为我的的元件没没坏);给155,166管脚分分别接上上+5vv和0vv,测试试背光是是否完好好;给VVEE接接上电位位器,检检查对比比度是否否可调;一般LCCD易出出现的现现象,我我再做实实验的时时候遇到到过以下下几种情情况:状态1 上电之之后,116022的第一一行全黑黑,即116个55x7黑黑块产生原因因:液晶晶根本就就没有进进行初始始化操作作,需要要检查连连线或者者程序。运运气不好好的情况况下就是是整块LLCD是是坏的。状态2 屏上显显示两排排灰格 产生原因因:程序序中对液液晶初始始化不
7、正正常,应应是部分分初始化化指令没没有正常常接收,建建议按照照标准初初始化步步骤调整整程序,或或者调整整指令之之间的延延时(加加大一些些试试)-补充:也有可可能是对对比度太太大,建建议优先先调整对对比度电电阻 状态3显显示乱码码这是我在在实验室室组合版版上做的的,原因因是接线线问题状状态3正确显显示 六实验结结果与性性能达标标我的计算算器只能能准确进进行得数数为09的四四则运算算。1.加法法计算2.减法法计算3.乘法法计算4.除法法计算5.字符符显示实物与仿仿真不一一致。这这就是传传说中的的BUGG了。我我不明白白。七实验改改进与心心得体会会很明显我我的计算算器处理理数据及及显示存存在太大大的
8、局限限性,我我觉得主主要还是是我对程程序中的的运算模模块理解解不深,这这点仍需需大大加加强。这个实验验给我的的感觉,硬硬件和软软件上都都不是很很难。我我的焊工工也不马马虎,即即使难看看了点,但但只要软软件能行行,就能能完美运运行。可可惜,我我就败在在LCDD16002,从从学校拿拿了两块块,幸好好最后实实在没办办法,自自己买了了一块。最最终证实实我之前前的实验验就是LLCD的的损坏。没没知识真真可怕,我我不懂真真正排查查LCDD的好坏坏。不过过也因祸祸得福,我我在磕磕磕碰碰中中,固执执的认为为LCDD是好的的,反而而使我对对LCDD初始化化,LCCD字符符显示,33种不同同的矩阵阵键盘扫扫描的
9、方方法,及及软件上上的巧妙妙技巧有有了更好好的了解解。我在在这次实实验上,感感觉收获获的更多多. 下面是源源代码:#inccludde#deffinee CCLEAARSCCREEEN LCDD_wrritee_coommaand(0x001) #deffinee uiint unssignned intt #deffinee uccharr unnsiggnedd chhar/*定定义接口口*/ #deffinee LLCDIIO P00#deffinee KKEYBBOARRD P11/保保留sbitt LCCD16602_RS=P20; sbitt LCCD16602_RW=P21; s
10、bitt LCCD16602_EN=P22; /*/codee uccharr maayuaan116=00,1,2,33,4,5,66,7,8,99,0,/,*,-,+,=;/不不错,这这个比较较明了unsiigneed ccharr coode keyycodde=00x111,0xx21,0x441,00x811,0xx12,0x222,00x422,0xx82,0x144,0xx24,0x444,00x844,0xx18,0x228,00x488,0xx88;/键盘编编码值()int i,jj,k=1,ss;/int t,tt1,tt2,aa;/voidd deelayy(ucchar
11、r);/延时时/*定定义函数数*/voidd LCCD_iinitt(vooid);/初始化化函数voidd deelayy_nmms(uunsiigneed iint n);/延延时函数数voidd LCCD_wwritte_ccommmandd(unnsiggnedd chhar commmannd);/写写入指令令函数voidd LCCD_wwritte_ddat(unssignned chaar ddat);/写入数数据函数数voidd deelayy_100ms();inittiall();uchaar kkeysscann();/键键盘扫描描函数calcc(uccharr);/计算
12、算函数uchaar nnum,temmp,kkey,keyynumm;voidd maain()/主函数数LCDD_innit();dellay_nmss(1000);whiile(1)innitiial();/有中中断KEEYBOOARDD =00xf00;/键盘的的列值全全置高电电平/*开中中断*/inittiall()EA=11;/总开关关EX0=1;/中断断方式00开启IT0=0;/*/*中断函函数*/voidd innterr0() innterrruppt 00unsiigneed ccharr n;delaay_110mss();/延延时if(IINT00=00)/没键按按下EX
13、0=0;/关中中断n=keeysccan();calcc(n);EX0=1;/开中中断KEYBBOARRD=00xf00;/键盘的的列值全全置高电电平/*/calcc(uccharr n)if(n110)/键值值小于110tt1=tt1*110+nn;LLCD_wriite_commmannd(00x000);/写命命令语句句LLCD_wriite_datt(maayuaannn);/写写数据函函数ellseif(n=10)LCCD_iinitt();t1=0;tt2=00,t=0;kk=1;elsseif(n115)t2=t1;t1=0;jj=n;LCDD_wrritee_coommaand
14、(0x000);LCDD_wrritee_daat(mmayuuann);elseeLCDD_wrritee_coommaand(0x000);LCDD_wrritee_daat(mmayuuann);swiitchh(j)casse 111:t=tt2/tt1;breeak;casse 112:t=tt2*tt1;breeak;casse 113:t=tt2-tt1;breeak;casse 114:t=tt2+tt1;breeak;if(t99)whiile(t99)s=tt%100;t=tt/100;akk=ss;k+;if(t=1;i-)LCDD_wrritee_coommaand(0
15、x000);LCDD_wrritee_daat(aai+488);/*键键盘扫描描函数*/uchaar kkeysscann()/键盘盘扫描KEYBBOARRD=00xf00;/键盘的的列值全全置高电电平delaay_110mss();/延延时if(KKEYBBOARRD!=0xff0)/有键键按下tempp=KEEYBOOARDD;/保存键键盘此刻刻的键植植delaay_110mss();/延延时if(KKEYBBOARRD=temmp)/再次次确认键键盘是否否被按下下uchaar ii;KEYBBOARRD=00x0ff;/键盘的的行值全全置高电电平delaay_110mss();/110
16、MSS时间延延时keynnum=temmp | KEEYBOOARDD;/保存键键盘的行行值whille(KKEYBBOARRD!=0x00f);/松松手检测测for(i=00;i00;i-) forr (jj=0;j110;jj+); voidd deelayy_100ms()/10MMS延时时unsiigneed ccharr i,j;for(i=00;i10;i+)for(j=00;j1200;j+);/*/ /*写写指令函函数*/ voidd LCCD_wwritte_ccommmandd(unnsiggnedd chhar commmannd) LLCDIIO=ccommmandd;
17、 LLCD116022_RSS=0; LLCD116022_RWW=0; LLCD116022_ENN=0; LLCD116022_ENN=1; ddelaay_nnms(10);/*/*写数数据函数数*/voidd LCCD_wwritte_ddat(unssignned chaar ddat)LCDIIO=ddat;LCD116022_RSS=1;LCD116022_RWW=0;LCD116022_ENN=0;delaay_nnms(1);LCD116022_ENN=1;/*/ /*初始化化函数*/voidd LCCD_iinitt(vooid)CLEAARSCCREEEN;/cllear
18、r sccreeenLCD_wriite_commmannd(00x388);/seet 88 biit ddataa trranssmisssioon mmodeeLCD_wriite_commmannd(00x0cc);/oppen dissplaay (enaablee lccd ddispplayy)LCD_wriite_commmannd(00x800);/seet llcd firrst dissplaay aaddrresssCLEAARSCCREEEN;/cllearr sccreeen/*/为了方便便初学者者学习LLCD,特特留下字字符显示示代码,电电路图与与本实验验一致。已
19、通过实物测试,绝对没问题。#inccludde unsiigneed ccharr taablee1=00x033,0xx07,0x00f,00x1ff,0xx1f,0x11f,00x1ff,0xx1f, 00x188,0xx1E,0x11f,00x1ff,0xx1f,0x11f,00x1ff,0xx1f, 00x077,0xx1f,0x11f,00x1ff,0xx1f,0x11f,00x1ff,0xx1f, 00x100,0xx18,0x11c,00x1EE,0xx1E,0x11E,00x1EE,0xx1E, 00x0ff,0xx07,0x003,00x011,0xx00,0x000,00x
20、000,0xx00, 00x1ff,0xx1f,0x11f,00x1ff,0xx1f,0x00f,00x077,0xx01, 00x1ff,0xx1f,0x11f,00x1ff,0xx1f,0x11c,00x188,0xx00, 00x1cc,0xx18,0x110,00x000,0xx00,0x000,00x000,0xx00;/心图案案unsiigneed ccharr taablee=0xx10,0x006,00x099,0xx08,0x008,00x099,0xx06,0x000;/字字符#deffinee CCLEAARSCCREEEN LCDD_wrritee_coommaand(
21、0x001) /*定定义接口口*/ #deffinee LLCDIIO P00sbitt LCCD16602_RS=P20; sbitt LCCD16602_RW=P21; sbitt LCCD16602_EN=P22; /*定定义函数数*/voidd LCCD_wwritte_ccommmandd(unnsiggnedd chhar commmannd);/写写入指令令函数voidd LCCD_wwritte_ddat(unssignned chaar ddat);/写入数数据函数数voidd LCCD_sset_xy( unnsiggnedd chhar x, unssignned cha
22、ar yy );/设设置显示示位置函函数voidd LCCD_ddsp_chaar( unssignned x,uunsiigneed ccharr y,unssignned chaar ddat);/显示一一个字符符函数voidd LCCD_ddsp_strringg(unnsiggnedd chhar X,uunsiigneed ccharr Y,unssignned chaar *s);/显显示字符符串函数数voidd LCCD_iinitt(vooid);/初始化化函数voidd deelayy_nmms(uunsiigneed iint n);/延延时函数数/*/ /*初始化化函数*
23、/voidd LCCD_iinitt(vooid)CLEAARSCCREEEN;/cllearr sccreeenLCD_wriite_commmannd(00x388);/seet 88 biit ddataa trranssmisssioon mmodeeLCD_wriite_commmannd(00x0cc);/oppen dissplaay (enaablee lccd ddispplayy)LCD_wriite_commmannd(00x800);/seet llcd firrst dissplaay aaddrresssCLEAARSCCREEEN;/cllearr sccreee
24、n/*/ /*写写指令函函数*/ voidd LCCD_wwritte_ccommmandd(unnsiggnedd chhar commmannd) LCCDIOO=coommaand; LLCD116022_RSS=0; LLCD116022_RWW=0; LLCD116022_ENN=0; LLCD116022_ENN=1; ddelaay_nnms(10);/*/*写数数据函数数*/voidd LCCD_wwritte_ddat(unssignned chaar ddat)LCDIIO=ddat;LCD116022_RSS=1;LCD116022_RWW=0;LCD116022_ENN
25、=0;delaay_nnms(1);LCD116022_ENN=1;/*/ /*设置显显示位置置*/voidd LCCD_sset_xy( unnsiggnedd chhar x, unssignned chaar yy )unsiigneed ccharr adddreess;if (y = 11) adddreess = 00x800 + x;elsee adddreess =0xxc0+ x;LCD_wriite_commmannd(aaddrresss);/*/ /*显示示一个字字符*/voidd LCCD_ddsp_chaar( unssignned x,uunsiigneed cc
26、harr y,unssignned chaar ddat)LCD_sett_xyy( xx, yy );LCD_wriite_datt(daat);/*/ /*显示字字符串函函数*/voidd LCCD_ddsp_strringg(unnsiggnedd chhar X,uunsiigneed ccharr Y,unssignned chaar *s) LCDD_seet_xxy( X, Y ); whiile (*ss) LLCD_wriite_datt(*ss); ss +; /*/ /* 延延时*/voidd deelayy_nmms(uunsiigneed iint n) unssig
27、nned intt i=0,jj=0; forr (ii=n;i00;i-) forr (jj=0;j110;jj+); /*/ /*主主函数*/voidd maain(voiid)unsiigneed ccharr i,j,kk,tmmp;LCD_iniit();delaay_nnms(1000);tmp=0x440;/设置置CGRRAM地地址的格格式字k=0;for(j=00;j8;jj+) foor(ii=0;i88;i+) LCCD_wwritte_ccommmandd(tmmp+ii); / 设置自自定义字字符的 CGRRAM 地址 deelayy_nmms(22); LCCD_ww
28、ritte_ddat(tabble11k); / 向CGGRAMM写入自自定义字字符表的的数据 k+; deelayy_nmms(22); tmmp=ttmp+8; LCCD_ddsp_strringg(1,1,LCDD TEEST );/在第一一行第一一列显示示LCCD TTESTT LCCD_ddsp_strringg(1,2,SUCCCESSSFUUL );/在第二二行第一一列显示示SUUCCEESSFFUL foor (i=00;i4;ii+) LLCD_dspp_chhar( 122+i,1,ii);/在第第一行第第12列列位置显显示心图图案的上上半部 ddelaay_nnms(1)
29、; foor (i=44;i8;ii+) LLCD_dspp_chhar( 122+i-4,22,i);/在第二二行第112列位位置显示示心图案案的下半半部 ddelaay_nnms(1); whhilee (11);/*/3.1 硬件连连接图33-1所所示为简简易计算算器的电电路原理理图。PP3口用用于键盘盘输入,接接4*44矩阵键键盘,键键值与键键盘的对对应表如如表-所所示,pp0口和和p2口口用于显显示,pp2口用用于显示示数值的的高位,ppo口用用于显示示数值的的低位。图3-11 简易易计算器器电路原原理图键值与功功能对应应表键值0123456789+-/=ON/CC功能0123456
30、789+-=清零表3-113.2 计算器器的软件件设计#inccludde /头文件件#deffinee uiint unssignned intt / #deffinee uccharr unnsiggnedd chharsbitt lccdenn=P223; /定义引引脚sbitt rss=P224;sbitt rww=P220;sbitt buusy=P07;charr i,j,ttempp,nuum,nnum_1;longg a,b,cc; /aa,第一一个数 b,第二二个数 c,得数数floaat aa_c,b_cc;uchaar fflagg,fuuhaoo;/flaag表示示是否有有符号键键按下,fuhao表征按下的是哪个符号uchaar ccodee taablee=7,8,9,00,4,5,6,00,1,2,3,00,0,0,0,00;uchaar ccodee taablee1=7,8,9,00x2ff-0xx30,4,5,6,00x2aa-0xx30,1,2,3,00x2dd-0xx30,0x011-0xx30,0,00x3dd-0xx30,0x22b-00x300;voidd deelayy(uccharr z) / 延迟迟函数uchaar yy;for(z;zz0;