郭一鸣.docx
- 文档编号:9451134
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:36
- 大小:87.83KB
郭一鸣.docx
《郭一鸣.docx》由会员分享,可在线阅读,更多相关《郭一鸣.docx(36页珍藏版)》请在冰点文库上搜索。
郭一鸣
摘要:
采用单片机作为控制芯片,用C语言对其进行编程实现,输入由4*4矩阵式键盘控制,输出采用人性化的SBY12864K-ZK型液晶实现。
该计算器为多功能计算器,在未进行计算时,它是一个万年历时钟,并且带脑钟和星期显示,所以数据均可随时进行校准,校准数据采用的是独立式键盘,是将4*4矩阵式键盘的一根线拉低,然后读取与这根线交叉的4根线的所处状态来判断按键是否被按下,而这4个按键中只有3个按键用于万年历的校准和对脑钟的控制,另一个按键则用来切换进入计算模式。
对于计算这个部分采用的是矩阵键盘,10个数字键,一个小数点键,四个符号键,一个多功能键,通过判别该多功能键连续按的次数来决定该键此时的命令。
由于C语言库函数繁多,所以我采用调用C语言库函数来解决多种运算类型,这样编程更简单,运行起来也更可靠。
。
关键字:
单片机,点阵图形液晶,矩阵键盘,C语言库函数。
Abstract:
Thedesignusesasingle-chipmicrocomputerasthecontrolchip,usingCprogramminglanguageofitsinputfrom4*4matrixkeyboardcontrol,theoutputoftheuseofhumanSBY12864K-ZK-typeliquidcrystaltoachieve.Multi-functioncalculatorforthecalculator,beforethecalculation,itisacalendarclockandbellandweekswiththebrainshowedthattheremayatanytimecalibrationdata,calibrationdataisusedinstand-alonekeyboard,isa4*4matrixkeyboarddownoneline,andthenreadwiththerootofthecross-line4-linestatetodeterminewhichbuttonhasbeenpressed,whichisonlyfourkeysforthethreecalendarbuttoncalibrationandthecontrolofthebrainclock,andtheotherbuttonisusedtoswitchintothemodeofcalculation.
ForthispartofthecalculationIusedthekeyboardmatrix,10numerickeys,adecimalpointkey,foursymbolkeys,amulti-functionkeys,multi-functionthroughtheidentificationoftherowbythenumberofkeystodeterminetheorderofthekeyatthistime.Clanguagelibraryfunctionasaresultofmany,soIusedtocallClanguagelibraryfunctiontosolveawiderangeofoperatortypes,suchprogrammingismuchsimpler,itisalsomorereliable.
Keywords:
Single-chip,dot-matrixgraphicLCD,matrixkeyboard,Clanguagelibraryfunction.
。
本设计主要采用以下基本模块来实现,控制器模块,输入模块,输出模块和电源模块。
由于单片机集成了运算器电路、控制电路、存储器、中断系统、定时器/计数器以及输入/输出口电路等,所以用单片机设计控制电路省去了很多分立元器件。
由于单片机是可编程芯片,并且它可以运用C语言编写,对于一些复杂的计算功能,可以调用C语言库函数。
使编写程序变得非常简单。
所以该课题用单片机实现,不仅功能易于实现,而且精确度高,稳定性好,抗干扰能力强。
并且由于其成本低、体积小、技术成熟和功耗小等优点,且技术比较成熟。
性价比也相当高。
系统组成框图如图1-6所示。
其中单片机作为主控设备对采集输入信号后并进行处理,最后通过输出设备输出给使用者。
,该系统的结构框图如图。
图1-6、系统组成方框图
单片机各引脚功能说明
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行
校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89S52的一些特殊功能口,如表3-1所示。
表2.1AT89S52的一些特殊功能口
管脚
备选功能
P3.0RXD
(串行输入口)
P3.1TXD
(串行输出口)
P3.2/INT0
(外部中断0)
P3.3/INT1
(外部中断1)
P3.4T0
(记时器0外部输入)
P3.5T1
(记时器1外部输入)
P3.6/WR
(外部数据存储器写选通)
P3.7/RD
(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。
在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。
此电路采用12MHz的石英晶体。
时钟电路如下图2-2:
图2-2时钟电路
、单片机复位电路
复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误是系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。
RST引脚是单片机复位信号的输入端,复位信号是高电平有效,其有效时间应持续24个振荡周期(即2个机器周期)以上,若使用频率为12MHz的晶振,则复位信号持续时间应超过4
s才能完成复位操作。
复位操作有上电自动复位和按键手动复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的。
按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的。
在本设计中采用了按键电平复位方式,其复位电路如下图2-3。
主程序流程图
显示程序流程图
系统原理图
原理图
程序
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
sbitrs=P2^0;
sbitrw=P2^1;
sbiten=P2^2;
sbitpsb=P2^3;
sbitret=P2^5;
sbitrd=P3^7;
sbits=P1^0;
sbits1=P1^4;
sbits2=P1^5;
sbits3=P1^6;
sbits4=P1^7;
ucharcount,s1num;
unsignedintnin,ss;
charyue,re,qi,shi,fen,miao;
uchardshi,dfen,dmiao,ling,aa,t1,p;
ucharcommand,data0,data1,data2,com0,j,l;
unsignedcharcommand,data1,data2,com0,bb,bb0,aa,cc,i,yun;//
ucharlcdH,lcdL,key;
floatds,m,k;
ulongds0;
bitflag,flag1,flag2,flag3,flag4;
uchardisbuf[9]={0};//定义显示缓冲区//
ucharcodetable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e};
ucharcodetable1[]={0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9};//日~六//
ucharcodetable2[]={0x32,0x30,0x30,0x39,0xc4,0xea,0x30,0x35,0xd4,0xc2,0x30,0x31,0xc8,0xd5};//年月日//
ucharcodetable4[]={0xd0,0xc7,0xc6,0xda,0xc1,0xf9};//星期六//
ucharcodetabping[]={32,29,32,31,32,31,32,32,31,32,31,32};
ucharcodetabrun[]={32,30,32,31,32,31,32,32,31,32,31,32};
ucharcodexing1[]={3,6,0,3,5,1,3,6,2,4,0,2};
ucharcodexing2[]={4,0,0,3,5,1,3,6,2,4,0,2};
ucharxing[12]={0};
uchartab[12]={0};
//延时//
voiddelay(uintms)//延时250us
{
uchari;
while(ms--)
{
for(i=0;i<125;i++);
}
}
//LCD初始化//
voidlcd_int()
{
ret=0;
delay(3);
ret=1;
_nop_();
psb=1;//将PSB置1,通信方式为8BIT数据并口//
_nop_();
}
//写指令程序//
voidwrite_command(ucharcommand)
{
delay(3);
rs=0;
rw=0;
P0=command;
en=1;
_nop_();
_nop_();
en=0;
}
//写数据程序//
voidwrite_data(uchardata0)
{
delay(3);
rs=1;
rw=0;
P0=data0;
en=1;
_nop_();
_nop_();
en=0;
}
//LCD功能设置//
voidlcd_set()
{
command=0x30;//基本指令集//
write_command(command);
command=0x01;
write_command(command);
command=0x06;
write_command(command);
command=0x0c;
write_command(command);
}
//清屏程序//
voidclear_lcd()
{
command=0x01;
write_command(command);
command=0x34;
write_command(command);
command=0x30;
write_command(command);
}
voiddisplay()
{
command=com0;
write_command(command);
data2=lcdH;
write_data(data2);
data1=lcdL;
write_data(data1);
}
voiddisplay1(uchary,ucharx,uchar*p)
{
switch(y)
{
case1:
write_command(0x7f+x);break;//液晶第一行
case2:
write_command(0x8f+x);break;//0x90+(x-1)
case3:
write_command(0x87+x);break;
case4:
write_command(0x97+x);break;
default:
break;
}
while(*p)
write_data(*p++);
}
voidxiaoshu()//先判断k是否为小数,如果k为小数,就将k转化为小数//
{
uchari;
uintmg=1;
if(flag1)
{
for(i=0;i k=k/(mg*1.0); } cc=0; flag1=0; } //键扫描程序// ucharkeyscan() {ucharscancode,tmpcode; P1=0xf0;//行全为0 if((P1&0xf0)! =0xf0)//有键按下 {delay(100);//延时去抖动 if((P1&0xf0)! =0xf0)//判是否真的有键按下 {scancode=0xfe;//诼行扫描 while((scancode&0x10)! =0) {P1=scancode; if((P1&0xf0)! =0xf0)//本行有键按下 {tmpcode=(P1&0xf0)|0x0f; //返回特征字节码,为1的位即对应于行和列 return((~scancode)+(~tmpcode)); } elsescancode=(scancode<<1)|0x01;//行扫描码左移一位 } } } return(0);//无键按下,返回值为0 } disjia() { com0=0x83;lcdH=0xbc;lcdL=0xd3;display(); com0++;lcdH=0xb7;lcdL=0xa8;display(); com0=0x87; } disjian() { com0=0x83;lcdH=0xbc;lcdL=0xf5;display(); com0++;lcdH=0xb7;lcdL=0xa8;display(); com0=0x87; } discheng() { com0=0x83;lcdH=0xb3;lcdL=0xcb;display(); com0++;lcdH=0xb7;lcdL=0xa8;display(); com0=0x87; } dischu() { com0=0x83;lcdH=0xb3;lcdL=0xfd;display(); com0++;lcdH=0xb7;lcdL=0xa8;display(); com0=0x87; } voidjishu()//把ds0处理后放入显示缓冲区中// { disbuf[0]=ds0/1000000000%10; disbuf[1]=ds0/100000000%10; disbuf[2]=ds0/10000000%10; disbuf[3]=ds0/1000000%10; disbuf[4]=ds0/100000%10; disbuf[5]=ds0/10000%10; disbuf[6]=ds0/1000%10; disbuf[7]=ds0/100%10; disbuf[8]=ds0/10%10; disbuf[9]=ds0%10; } voiddisds() { uchari; com0=0x98; for(i=0;i<10;i++) { if(i%2==0){com0++;write_command(com0);} write_data(table[disbuf[i]]); } flag=0; com0=0x88;lcdH=0x20;lcdL=0x20; for(i=0;i<16;i++){display();com0++;} com0=0x87; } zhixing()//计算// { xiaoshu(); if(bb0==1) { switch(bb) { case1: ds=m+k;m=ds;k=0;break; case2: ds=m-k;m=ds;k=0;break; case3: ds=m*k;m=ds;k=0;break; case4: ds=m/k;m=ds;k=0;break; default: break; } } elseif(bb0==2) { switch(bb) { case1: m=m*3.1415926536;m=m/180.0;ds=sin(m);break; case2: m=m*3.1415926536;m=m/180.0;ds=cos(m);break; case3: m=m*3.1415926536;m=m/180.0;ds=tan(m);break; case4: m=m*3.1415926536;m=m/180.0;ds=1.0/tan(m);break; default: break; } } elseif(bb0==3) { switch(bb) { case1: ds=asin(m);ds=ds*180.0;ds=ds/3.1415926536;break; case2: ds=acos(m);ds=ds*180.0;ds=ds/3.1415926536;break; case3: ds=atan(m);ds=ds*180.0;ds=ds/3.1415926536;break; case4: ds=1.0/atan(m);ds=ds*180.0;ds=ds/3.1415926536;break; default: break; } } elseif(bb0==4) { switch(bb) { case1: ds=m*m;break;//平方// case2: ds=m*m*m;break;//立方/// case3: ds=1;for(i=0;i case4: ds=exp(m);break;//e的m次方// default: break; } } elseif(bb0==5) { switch(bb) { case1: ds=log(m);break;//自然对数// case2: ds=log10(m);break;///常用对数// case3: ds=sqrt(m);break;//开方// default: break; } } if(ds<0)display1(4,1,"-");elsedisplay1(4,1,"+"); if(ds>4294967295) { clear_lcd();display1(1,3,"得数大于");display1(2,2,"二的三十二次方");display1(4,2,"请你按复位键");delay(65000); } ds0=ds; if((ds>ds0)) { if(ds<1000){ds0=ds*1000000;jishu();disbuf[9]=disbuf[8];disbuf[8]=disbuf[7];disbuf[7]=disbuf[6];disbuf[6]=disbuf[5];disbuf[5]=disbuf[4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 郭一鸣