




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
信电学院教学工作基本程序及规范附件23信息与电气工程学院课程设计说明书(200 /200 学年第 学期)课程名称 : 小型数字系统设计 题 目 : 数字计算器 专业班级 : 计算机3班 学生姓名 : 王尚飞 学 号: 120210310 指导教师 : 设计周数 : 设计成绩 : 2014年12月25日1、课程设计目的数字计算器的原理与设计是51单片机课程设计课题中的一个。在完成理论学习和必要的实验后,我们掌握了单片机的基本原理以及编程和各种基本功能的应用,但对单片机的硬件实际应用和单片机完整程序设计还不清楚,实际动手能力不够,因此对该课程进行一次课程设计是有必要的。单片机课程设计既巩固了课本学到的理论,还学到了单片机硬件电路和程序设计,数字计算器课程设计通过自己动手用计算机电路设计软件,编写和调试,最后仿真,来加深对单片机的认识,充分发挥我们的个人创新和动手能力,并提高我们对单片机的兴趣,同时学习查阅资料、参考资料的方法。本设计是基于51系列的单片机进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除3位无符号数字的简单四则运算,并在led上相应的显示结果。设计过程在硬件与软件方面进行同步设计。硬件选择at89c51单片机和74ls00,输入用44矩阵键盘。显示c51lcd显示。软件从分析计算器功能、流程图设计,再到程序的编写进行系统设计。选用编译效率最高的keil软件进行编程,并用proteus仿真。2.1软件方面设计2.1.1系统分析系统主要包括主程序、键盘程序、lcd显示程序、运算程序。主程序主要是用来进行初始化,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在led上作出回应。键盘程序用来实现键盘的输入功能,每个键都有其处理子程序,为此每个键都对应一个码键码。为了得到被按键的键码,使用行扫描法识别按键。lcd显示程序用来显示运算过程和运算结果。运算程序用来接收键盘输入并进行运算。2.1.2系统设计#include /#include/#include /#include /#include /#include/#include #include /*库函数*/ /#include /*字符操作函数*/ #defineuchar unsigned char#define uint unsigned int/ lcm1602a端口地址定义char xdata lcd1602cmdport _at_ 0x7cff;/e=1 rs=0 rw=0char xdata lcd1602wdataport _at_ 0x7dff; /e =1 rs=1 rw=0char xdata lcd1602statusport _at_ 0x7eff; /cs=1 rs=0 rw=1#define busy0x80 / 忙判别位code uchar exampl= counter:;/uchar tab=0123456789- ;void delay400ms(void);void delay5ms(void);void lcdwritedata( char dataw );void lcdwritecommand( uchar cmd,uchar attribc );void lcdreset( void );void display( void);void disponechar(uchar x,uchar y,uchar wdata);void eputstr(uchar x,uchar y, uchar code *ptr);void kbscan(void);/键盘扫描函数void keycl(uchar keyvol );/键值处理void left(uchar rx,uchar date);/移位函数void flagcon(void);/进入加减乘除等于相应的操做bit add,subb,mul,div,equ,flag;/加,减,乘,除, + - * / =uchar dat=0, , , , , ,;/存放数子串值uchar s12;uchar rdat;/按键次数long int lvalue,result;/左值,右值uchar num;/float result;/结果/主程序void main(void)uchar temp;delay400ms();/启动时必须的延时,等待lcm进入工作状态lcdreset(); /这也是必需的.初始化temp = 32;eputstr(0,0,exampl);/上面一行显示一个预定字符串while(1) kbscan();display();delay400ms();/显示字符串void eputstr(uchar x,uchar y, uchar code *ptr) uchar i,l=0;while (ptrl 31)l+;for (i=0;il;i+) disponechar(x+,y,ptri);/if ( x = 16 ) /x = 0; y = 1;/ 演示一行连续字符串,配合上位程序演示移动字串void display( void ) uchar i; if(equ=1) disponechar(0,1,=); for(i=0;inum;i+) disponechar(i+1,1,si); / disponechar(0,1,=); /disponechar(1,1,s0); /disponechar(2,1,s1); /disponechar(3,1,s2); /disponechar(4,1,s3); /disponechar(5,1,s4); /disponechar(6,1,s5); /disponechar(7,1,s6); /disponechar(8,1,s7); /disponechar(9,1,s8); /disponechar(10,1,s9); /disponechar(11,1,s10); /disponechar(12,1,s11); else disponechar(10,1,dat5); disponechar(11,1,dat4); disponechar(12,1,dat3); disponechar(13,1,dat2); disponechar(14,1,dat1); disponechar(15,1,dat0); / 显示光标定位void locatexy( char posx,char posy) uchar temp;temp = posx & 0xf;posy &= 0x1;if ( posy )temp |= 0x40;temp |= 0x80;lcdwritecommand(temp,0);/ 按指定位置显示数出一个字符void disponechar(uchar x,uchar y,uchar wdata) locatexy( x, y ); / 定位显示地址lcdwritedata( wdata ); / 写字符/ 初始化程序, 必须按照产品资料介绍的初始化过程进行void lcdreset( void ) lcdwritecommand( 0x38, 0);/ 显示模式设置(不检测忙信号)delay5ms();lcdwritecommand( 0x38, 0);/ 共三次delay5ms();lcdwritecommand( 0x38, 0);delay5ms();lcdwritecommand( 0x38, 1);/ 显示模式设置(以后均检测忙信号) lcdwritecommand( 0x08, 1);/ 显示关闭 lcdwritecommand( 0x01, 1);/ 显示清屏lcdwritecommand( 0x06, 1);/ 显示光标移动设置lcdwritecommand( 0x0c, 1);/ 显示开及光标设置/ 写控制字符子程序: e=1 rs=0 rw=0void lcdwritecommand( uchar cmd,uchar attribc ) if (attribc) while( lcd1602statusport & busy );/ 检测忙信号?lcd1602cmdport = cmd;/ 当前位置写字符子程序: e =1 rs=1 rw=0void lcdwritedata( char dataw ) while( lcd1602statusport & busy );/ 检测忙信号lcd1602wdataport = dataw;/ 短延时void delay5ms(void)uint i = 1552;while(i-);/长延时void delay400ms(void)uchar i = 5;uint j;while(i-)j=3267;while(j-);void kbscan(void)/键盘扫描函数 uchar line,row; p1=0xf0; if(p1&0xf0)!=0xf0) delay5ms(); if(p1&0xf0)!=0xf0) / line=p1; row=0xfe; while(row&0x10)!=0) p1=row; if(p1&0xf0)!=0xf0) line=(p1&0xf0)|0x0f);keycl(row&line);/进入处理 else row=(row1)|0x01; / return(0); /键值处理函数void keycl(uchar keyvol) uchar i; uchar k; delay400ms(); delay400ms(); switch(keyvol) case 0xeb: rdat+,k=1;srdat-1=k;left( rdat,k); break;/1 case 0xdb: rdat+,k=2;srdat-1=k;left( rdat,k); break;/2 case 0xbb: rdat+;k=3;srdat-1=k;left( rdat,k); break;/3 case 0xed: rdat+,k=4;srdat-1=k;left( rdat,k); break;/4 case 0xdd: rdat+,k=5;srdat-1=k;left( rdat,k); break;/5 case 0xbd: rdat+,k=6;srdat-1=k;left( rdat,k); break;/6 case 0xee: rdat+,k=7;srdat-1=k;left( rdat,k); break;/7 case 0xde: rdat+,k=8;srdat-1=k;left( rdat,k); break;/8 case 0xbe: rdat+,k=9;srdat-1=k;left( rdat,k); break;/9 case 0xd7: if(rdat!=0)|(mul=1)rdat+;k=0;srdat-1=k;left( rdat,k); break;/0 case 0xe7: rdat=0; add=0; subb=0;mul=0;div=0;lvalue=0;equ=0;/rvalue=0;result=0; dat0=0; for(i=1;i7;i+)dati= ; for(i=0;i12;i+)si= ; for(i=0;i15;i+)disponechar(i,1, ); disponechar(15,1,0); break;/on/c case 0x77:if(rdat!=0) add=1; subb=0;mul=0;div=0; rdat=0;lvalue=atol(s);for(i=0;i12;i+)si= ; dat0=0; for(i=1;i7;i+)dati= ; break;/+ case 0x7b:if(rdat!=0) subb=1; add=0;mul=0;div=0;rdat=0;lvalue=atol(s);for(i=0;i12;i+)si= ; dat0=0; for(i=1;i7;i+)dati= ; break;/- case 0x7d:if(rdat!=0) mul=1; add=0; subb=0; div=0; rdat=0; lvalue=atol(s);for(i=0;i12;i+)si= ; dat0=0; for(i=1;i7;i+)dati= ; break;/* case 0x7e:if(rdat!=0) div=1; add=0; subb=0;mul=0;rdat=0; lvalue=atol(s);for(i=0;i12;i+)si= ;dat0=0; for(i=1;i7;i+)dati= ; break;/ / case 0xb7:if(rdat!=0) equ=1; rdat=0; result=atol(s); for(i=0;i12;i+)si= ; dat0=0; for(i=1;i7;i+)dati= ; flagcon(); for(i=10;i15;i+)disponechar(i,1, ); disponechar(15,1,0); break;/= /移位函数void left(uchar rx,uchar date) equ=0; switch(rx) case 1:dat0=date;break; case 2:dat1=dat0,dat0=date;break; case 3:dat2=dat1,dat1=dat0,dat0=date;break; case 4:dat3=dat2,dat2=dat1,dat1=dat0,dat0=date;break; case 5:dat4=dat3,dat3=dat2,dat2=dat1,dat1=dat0,dat0=date;break; case 6:dat5=dat4,dat4=dat3,dat3=dat2,dat2=dat1,dat1=dat0,dat0=date;break; /进入加减乘除等于相应的操做void flagcon(void) if(add=1)result=lvalue+result;add=0; if(subb=1)result=lvalue-result;subb=0; if(mul=1)result=lvalue*result;mul=0; if(div=1)result=lvalue/result;div=0; num=sprintf(s,%ld,result);2.1.3系统实施下载安装keil软件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车发动机装调工设备维护与保养考核试卷及答案
- 水泥混凝土制品工知识考核试卷及答案
- 2025生物安全题库及答案解析
- 耐火制品切磨加工工技能操作考核试卷及答案
- 制球工招聘考核试卷及答案
- 纸张、书画文物修复师专项考核试卷及答案
- 链传动部件制造工质量管控考核试卷及答案
- 2025方城事业单位笔试题目及答案
- 人工影响天气特种作业操作员5S管理考核试卷及答案
- 餐饮岗前培训考试题库及答案解析
- 《混凝土结构耐久性电化学修复技术规程》
- 桥式起重机Q2练习测试题附答案
- 高级茶艺师理论知识试题
- 哈里伯顿Sperry定向钻井介绍专题培训课件
- 2021年江苏省徐州市中考生物试卷(附详解)
- JJF 1704-2018 望远镜式测距仪校准规范
- 石油化工设备维护检修规程通用设备12
- 《三角形的面积》教学设计方案
- GB/T 14667.1-1993粉末冶金铁基结构材料第一部分烧结铁、烧结碳钢、烧结铜钢、烧结铜钼钢
- 带状疱疹及带状疱疹后神经痛
- 2022年毕节市农业发展集团有限公司招聘笔试试题及答案解析
评论
0/150
提交评论