课程设计(论文)-基于单片机的计算机设计.doc_第1页
课程设计(论文)-基于单片机的计算机设计.doc_第2页
课程设计(论文)-基于单片机的计算机设计.doc_第3页
课程设计(论文)-基于单片机的计算机设计.doc_第4页
课程设计(论文)-基于单片机的计算机设计.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录一、设计总体思路,基本原理和框图11.1 设计总体思路11.2基本原理11.3设计框图11.3.1硬件原理图11.3.2软件流程图2二、单元函数设计22.1 单片机模块22.2键盘控制模块22.3 LCD显示模块3三、程序调试与结果43.1加法调试43.2幂运算调试43.3报错调试4四、总结与体会5附录5参考文献22一、设计总体思路,基本原理和框图1.1 设计总体思路本电路设计采用AT89S52单片机为核心,利用晶振产生频率为1HZ的时钟脉冲信号,利用液晶屏LCD1602显示计算信息,通过对AT89S52单片机的编程控制液晶屏LCD1602的显示。显示计算和简易计算的信息同在LCD1602,通过按键切换选。1.2基本原理1602LCD液晶显示AT89C51单片机模块矩阵键盘 图1-11.3设计框图1.3.1硬件原理图 图1-21.3.2软件流程图 图1-3二、单元函数设计2.1 单片机模块本次设计采用AT89C51单片机,以下为其标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操 作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位2.2键盘控制模块本次设计使用的是PROTUES中的KEYPAD键盘。使用此键盘的难度在于它的数据是分散的,并且不是由小到大排列的,这就要求我们在编写程序的时候对键值进行处理。首先给键盘低4位的其中一位低电平,例如11111110,这样键盘的第一行全为低电平。如果第一行有键按下,例如7键按下则为低电平,同时第一列为低电平,此时键盘的8为就变为11101110。我们只要将这些数据转化为7这个数,就可以将它送到液晶显示。如此循环,键盘的每一行每一列只要有键按下都可以接收到。2.3 LCD显示模块 图2-1如图2-1,我们使用的液晶是LCD1602,RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器;RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器;E端为使能端,D0D7分别为8位双向数据线。 图2-2图2-2是液晶的工作时序,它有两个工作状态,如下:当我们要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0D7,最后E引脚一个高脉冲将数据写入。 当我们要写入数据字,在1602上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0D7,最后E引脚一个高脉冲将数据写入。除此之外,我们还可以对液晶进行显示初始化,对它是否使用光标、是否闪烁等进行控制。三、程序调试与结果3.1加法调试 图3-13.2幂运算调试 图3-23.3报错调试 图3-3四、总结与体会 开始做课程设计时,我们首先需要将硬件设计做出来,在硬件设计好的基础上进行软件设计这样就方便多了。着手软件设计时要有一个整体的思路,即主程序,有了整体思路就开始着手于分模块的设计,如LCD显示程序、键盘程序等。每个模块出来后都需要配合主程序进行仿真验证程序是否能正常运行。这次的设计尽管还不是很完善,但我已经非常开心了,至少有了自己的思路再去实践,再在实践的过程中收获,这是课堂上所没有的欣喜。 在课程设计的过程中遇到的各种知识不总是在书上能找到的,所以我们必须自己查找相关资料,利用图书馆或网络搜索,这是一个比较辛苦的过程,你必须从无数的信息中分离出对你有用的,然后加以整理,最后吸收并用到设计中来。通过这点,我收益很大。课程设计是从整体到部分的过程,然而一切并不都是如此的。因为有时候你整体设计好了,然而在设计部分的时候却可能影响到整体,然后又要作出调整,在不断的调整中才慢慢把设计做出来。有时候你还必须把自己前面做的东西全部推翻,然后重新再来。 经过两个星期的课程设计,确实让我收获很多,学到了很多,特别要谢谢老师的指导及严格要求,虽然在设计过程中很累,但是一看到自己做出来的成果,就什么疲劳都没有了。附录#include #include #define uint unsigned int #define uchar unsigned char #define ZERO 0.00001sbit row1=P30;sbit row2=P31;sbit row3=P32;sbit row4=P33;sbit RS=P10; /1602的数据/指令选择控制线 sbit RW=P11; /1602的读写控制线 sbit EN=P12; /1602的使能控制线sbit FB=P17;uint temp=0,key=0; /地址中间变量,按键uint func=0,flag=0; / 功能键标志,符号键标志double numb1=0,numb2=0; /第一操作数,第二操作数uint errorMark=0,fuhao=0; 、/错误标志位,符号标志uint equalMark=0; 、 /等号标志double result; /结果unsigned long intPar, deciPar; /整数部分,小数部分uchar addrCount=0; /地址计数器,跟踪光标uchar flag2=0uchar code showTable=0123456789+-*/=; / +(10) -(11) *(12) /(13) =(14) (16)uchar code showRt=ROOT;uchar code errorTable=Error; /延时函数void Delay(uint n) uint x,y; for(x=n;x0;x-) for(y=110;y0;y-); /1602写命令函数void WriteCmd(uchar cmd) RS=0; RW=0; P2=cmd; Delay(3); EN=1; EN=0; /1602写数据函数void WriteData(uchar dat) RS=1; RW=0; P2=dat; Delay(3); EN=1; EN=0; /1602初始化void LcdInitial() WriteCmd(0x38); WriteCmd(0x0c); WriteCmd(0x06); WriteCmd(0x01); /错误显示void ShowError() int i; errorMark=1; addrCount=0; WriteCmd(0x01); WriteCmd(0x80); for(i=0;i5;i+) WriteData(errorTablei); /清屏void Clear() if(errorMark=1) WriteCmd(0x01); errorMark=0; numb1=0; numb2=0; if(equalMark=1) WriteCmd(0x01); equalMark=0; numb1=0; numb2=0; /显示结果void ShowResult() WriteCmd(0x80+0x4f); WriteCmd(0x04); intPar = (unsigned long)fabs(result); deciPar = (unsigned long)(fabs(result) - intPar)*1000); if(fabs(result)=ZERO) WriteData(0x30); else if(deciPar!=0) while(deciPar!=0) WriteData(0x30+deciPar%10); deciPar=deciPar/10; WriteData(0x2e); if(intPar=0) WriteData(0x30); else while(intPar!=0) WriteData(0x30+intPar%10); intPar=intPar/10; if(result1) ShowError(); flag=0; else if(key=16) int j=0; for(j=0;j4;j+) WriteData(showRtj); else WriteData(showTablekey); /数据处理void DataPro() WriteData(showTablekey); if(flag=0) numb1=numb1*10+key; flag2=0; else numb2=numb2*10+key; flag2=1; /row1void KeyScan();void Row1Judge() /row1(7 8 9 / ) P3=0xff; row1=0; temp=P3; temp=temp&0xf0; if(temp!=0xf0) Delay(2); temp=P3; temp=temp&0xf0; if(temp!=0xf0) switch(temp) case 0xe0: key=7; func=0; addrCount+; break; case 0xd0: key=8; func=0; addrCount+; break; case 0xb0: key=9; func=0; addrCount+; break; case 0x70: key=13; func=0; addrCount+; break; Clear(); if(key10) DataPro(); else ShowFlag(); fuhao=1;/表示除号 /row2void Row2Judge() /row2(4 5 6 * ) P3=0xff; row2=0; temp=P3; temp=temp&0xf0; if(temp!=0xf0) Delay(2); temp=P3; temp=temp&0xf0; if(temp!=0xf0) switch(temp) case 0xe0: key=4; func=0; addrCount+; break; case 0xd0: key=5; func=0; addrCount+; break; case 0xb0: key=6; func=0; addrCount+; break; case 0x70: key=12; func=0; addrCount+; break; Clear(); if(key10) DataPro(); else ShowFlag(); fuhao=2; /row3void Row3Judge() /row3(1 2 3 - ) P3=0xff; row3=0; temp=P3; temp=temp&0xf0; if(temp!=0xf0) Delay(2); temp=P3; temp=temp&0xf0; if(temp!=0xf0) switch(temp) case 0xe0: key=1; func=0; addrCount+; break; case 0xd0: key=2; func=0; addrCount+; break; case 0xb0: key=3; func=0; addrCount+; break; case 0x70: key=11; func=0; addrCount+; break; Clear(); if(key0 & key10) DataPro(); else switch(key) case 10: ShowFlag(); fuhao=4; break; case 14: EqualPro(); break; case 15: ShowFlag(); fuhao=5; break; case 16: ShowFlag(); fuhao=6; break; /键盘扫描函数void KeyScan() WriteCmd(0x80+addrCount); Row1Judge(); Row2Judge(); Row3Judge(); Row4Judge(); if(func = 1) WriteCmd(0x80+0x40); WriteData(F); WriteData(n); WriteCmd(0x80+addrCo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论