ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:802.05KB ,
资源ID:4392663      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4392663.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C51单片机课设报告进制转换.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C51单片机课设报告进制转换.docx

1、C51单片机课设报告进制转换单片机原理课程设计报告题目:51单片机实现进制转换专业:信息工程班级:信息101学号:1004020307小组成员:1004020103指导教师:吴叶兰北京工商大学计算机与信息工程学院题目:51单片机实现进制转换1、设计目的1) 熟悉51单片机的编程;2) 熟悉单片机开发的基本焊接;3) 熟悉单片机元件的使用方法;4) 熟悉C51的软件开发环境(编程软件 Keil、烧录软件STC_ISP_v4792、 设计要求1) 按键输入数据,具有确定和清零功能;2) 1602液晶屏幕显示,具有显示输入输出和提示功能;3) 2,、8、10、16进制数可任意互相转化;3、 硬件电路

2、设计(包括电路图及说明)1) 控制模块:控制模块是由1块STC89C52 1个12MHz无源晶振、1个复位电路22uF电容、1个1k欧 姆电阻、1个8位1k欧姆排阻组成。STC89C52是 STC公司生产的一种低功耗、高性能 CMOS位微控制器,具有8K在系统可 编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传 统51单片机不具备的功能。在单芯片上,拥有灵巧的 8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能:8k字节Flash,512字节RAM 32位I/O 口线,

3、看门狗定时器,内置4KBEEPRQMIAX810 复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统 51的5向量2级中断结构),全双工串行口。另外STC89C52可降至0Hz静态逻辑操作,支 持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM定时器/计数器、串口、 中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止, 直到下一个中断或硬件复位为止。最高运作频率 35MHz 6T/12T可选。芯片实际选用的STC89C5与protues模拟电路图中的AT89C52功能基本相同,区别在于烧录程序的方式。2) 显示模块:显

4、示模块由1块1602液晶显示屏、16根数据线组成。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液 晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符, 每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为 如此所以它不能很好地显示图形(用自定义 CGRAM显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。液晶显示屏际 实际选用的是QC1602AT protues模拟电路图中的LM016功能基本相同。3)按键输入模块:按键输入模块

5、由1块4*4矩阵键盘、8根数据线组成、2个独立按键。在键盘中按键数量较多时,为了减少I/O 口的占用,通常将按键排列成矩阵形式,如图 1 所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以 连接。这样,一个端口(如 P1 口)就可以构成4*4=16个按键,比之直接将端口线用于键盘 多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成 20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键 盘是合理的。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列 线通过电阻接正电源,并将行线所接的单片

6、机的 I/O 口作为输出端,而列线所接的I/O 口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出 是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是 否有键按下了。实际电路中使用的是集成的 1块4*4矩阵键盘,跟protues模拟电路图中的16个独立按键相比体积更小,实现的功能相同。4)全局设计:通过STC89C52的 P3.0-P3.7 口读入4*4矩阵键盘的按键输入数据, STC89C52 的P0.0-P0.7先接入8位1k欧姆排阻作上拉电阻,再接入1602液晶屏幕的数据口 D01-D07, 输出数据到1602液晶屏幕,液晶

7、屏幕显示读到的数据。P2.1-P2.3 口分别接入1602的RS RW E控制读写。P2.4-P2.5 口分别接入1独立按键最为“确定”键和“清零”键。STC89C52 的RST接 VCCt源,即上点就复位。XTAL1,XTAL2接 12MHz无源晶振。4、软件设计(包括流程图及程序)1)程序流程图:2)程序代码:#in clude /#in cludesbit RS =:P2A1; /定义端口sbit RW :=卩2八2;sbit EN =:卩2八3;sbit QL =P2A4;/ 外接清零端口sbit QD =P2A5;/ 外接确定端口sbit wela=P2A7;/锁存器控制端定义un

8、sig ned int qlbz=O; un sig ned int qdbz=O;#defi ne RS_CLR RS=O#defi ne RS_SET RS=1#defi ne RW_CLR RW=0#defi ne RW_SET RW=1#defi ne EN_CLR EN=0#defi ne EN_SET EN=1#defi ne DataPort P0#defi ne KeyPort P3un sig ned char codeasc_code=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;转换成液晶显示的字符/* uS延时函数*/void DelayUs2x( u

9、n sig ned char t) while(-t);/* mS延时函数 */void DelayMs( un sig ned char t)while(t-)/ 大致延时1mSDelayUs2x(245);DelayUs2x(245);/* 判忙函数 */bit LCD_Check_Busy(void)DataPort= OxFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);/* 写入命令函数 */void LCD_Write_Com(u nsig ned char com) while(LCD_Che

10、ck_Busy(); / 忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;/* 写入数据函数-*/void LCD_Write_Data( un sig ned char Data)while(LCD_Check_Busy(); /忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;/* 清屏函数-*/void LCD_Clear(void)LCD_Write_Com(0x01);DelayMs(5);/* 写入字符串函数-*/void LCD_Write_Stri ng(u

11、nsig ned char x,un sig ned char y,un sig ned char *s)if (y = 0)LCD_Write_Com(0x80 + x);elseLCD_Write_Com(0xC0 + x);while (*s)LCD_Write_Data( *s);s +;/* 写入字符函数 */void LCD_Write_Char( un sig ned char x,un sig ned char y,un sig ned char Data) if (y = 0)LCD_Write_Com(0x80 + x);elseLCD_Write_Com(0xC0 + x

12、);LCD_Write_Data( Data);/* 初始化函数 */void LCDni t(void)LCD_Write_Com(0x38); /* 显示模式设置 */DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08);/*显示关闭*/LCD_Write_Com(0x01);/*显示清屏*/LCD_Write_Com(0x06);/*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C);/*

13、显示开及光标设置*/* 按键扫描函数0,返回小键盘扫描键值 */un sig ned char KeySca n(v oid) /键盘扫描函数,使用行列反转扫描法行列值中间变量 行线输出全为0 读入列线值un sig ned char cord_h,cord_l;KeyPort=0x0f; /cord_h=KeyPort&0x0f; /if(cord_h!=0x0f) /先检测有无按键按下去抖读入列线值输出当前列线值读入行线值DelayMs(100); / if(KeyPort&0x0f)!=0x0f)cord_h=KeyPort&0x0f; / KeyPort=cord_h|0xf0; /

14、cord=KeyPort&0 xf0; /while(KeyPort&0xf0)!=0xf0); 等待松开并输出return(cord_h+cord_l); 键盘最后组合码值return(0xff); / 返回该值/*按键扫描函数1,返回确定键扫描键值 */un sig ned char KeySca nQD(void) / 键盘扫描函数if(QD != 1) /先检测有无按键按下DelayMs(100);/ 去抖if(QD != 1)while(QD = 0);/等待松开并输出qdbz=1;return(0); /返回该值/* 按键扫描函数2,返回清零键扫描键值 */un sig ned c

15、har KeySca nQL(void) / 键盘扫描函数if(QL != 1) /先检测有无按键按下DelayMs(100);/ 去抖if(QL != 1)while(QL = 0);/等待松开并输出qlbz=1;return(0); /返回该值/* 按键值处理函数,返回扫键值 */un sig ned char KeyPro(void)switch(KeySca n()case 0x7e:return 1;break;/0 按下相应的键显示相对应的码值case 0x7d:retur n 2;break;/1case 0x7b:retur n 3;break;/2case 0x77:retu

16、r n 4;break;/3case 0xbe:retur n 5;break;/4case 0xbd:retur n 6;break;/5case 0xbb:retur n 7;break;/6case 0xb7:retur n 8;break;/7case 0xde:retur n 9;break;/8case 0xdd:retur n 0;break;/9case 0xdb:retur n 10;break;/acase 0xd7:retur n 11;break;/bcase 0xee:retur n 12;break;/ccase 0xed:retur n 13;break;/dca

17、se 0xeb:retur n 14;break;/ecase 0xe7:retur n 15;break;/fdefault:retur n 0xff;break;/* 主函数 */void ma in (void)un sig ned int i,j,k,kk,J z,nu m, n,t1,t2,a,b,x,y;un sig ned char jin zhishu12,ji nzhishu22;un sig ned char dushu16;un sig ned char dushu216;LCDni t();wela=1;P0=0Xff;wela=0; 关闭数码管LCD_Write_Co

18、m(0x0F);光标开,光标闪烁开while LCD_Clear();/*下为输入部分A1:jin zhishu11=;jin zhishu12=;LCD_Write_Stri ng(O,O,E nter IN system);i=0;while(qdbz=O)Jz=KeyPro();if(Jz!=Oxff)LCD_Write_Char(i,1,asc_codeJz);jin zhishu1i=asc_codeJz;i+;KeySca nQD();KeySca nQL();if (qlbz=1)qlbz=0; LCD_Clear(); i=0; j=0;goto A1;if(i=2) qdbz

19、=1;qdbz=0;LCD_Write_Stri ng(0,1, );依次显示输入字符a=10;if (jin zhishu10=1&jin zhishu11=0)else if (jin zhishu10=2&jin zhishu11=)else if (jin zhishu10=8&jin zhishu11=)else if (jin zhishu10=1&jin zhishu11=6)elseLCD_Write_Stri ng(0,0,Wro ng IN system);while(qdbz=0)KeySca nQD();qdbz=0;goto A1;A2:for(i=0;i16;i+)

20、dushu2i=;dushui=;LCD_Write_Stri ng(0,0,E nter IN number);i=0;while(qdbz=0)num=KeyPro();if(nu m!=0xff)LCD_Write_Char(i,1,asc_code nu m);dushu2i=num;i+;KeySca nQD();a=2;a=8;a=16;依次显示输入字符KeySca nQL();if (qlbz=1)qlbz=0; LCD_Clear(); i=0; j=0;goto A2;if(i=15) qdbz=1;n=i;qdbz=0;LCD_Write_Stri ng(0,1, );A3

21、:jin zhishu21=;jin zhishu22=;LCD_Write_Stri ng(0,0,E nter OUT system);i=0;while(qdbz=0)Jz=KeyPro();if(Jz!=0xff)依次显示输入字符LCD_Write_Char(i,1,asc_codeJz); jin zhishu2i=asc_codeJz;i+;KeySca nQD();KeySca nQL();if (qlbz=1)qlbz=0; LCD_Clear(); i=0; j=0;goto A3;if(i=2) qdbz=1;qdbz=O;LCD_Write_Stri ng(0,1, );

22、if (jin zhishu20=1&jin zhishu21=O) b=10; else if (jin zhishu20=2&jin zhishu21= ) b=2; else if (jin zhishu20=8&jin zhishu21= ) b=8; else if (jin zhishu20=1&jin zhishu21=6) b=16; elseLCD_Write_Stri ng(0,0,Wro ng OUT system); while(qdbz=0)KeySca nQD();qdbz=0;goto A3;/*下为运算部分n=n-1;t2=dushu20;for(j=0;j =

23、b;j+)y=x%b;x=x/b;dushuj= asc_codey;y=x;dushuj= asc_codey; k=j;kk=j;for(i=0;i=kk;i+,k-)dushu2i=dushuk;for(i=0;i=kk;i+)dushui=dushu2i;/*下为输出部分LCD_Write_Stri ng(0,0,The OUT number);LCD_Write_Stri ng(0,1, );LCD_Write_Stri ng(0,1,dushu);while(qdbz=0)KeySca nQD();KeySca nQL();qdbz=0;5、调试过程(包括出现的问题及解决的方法,以

24、及要改进的地方,体会)1) 硬件调试:焊接最小系统板完成之后就开始测试是否有焊接错误,首先是检验单片机的底座针脚是 否联通,通过LED丁测试证明了所有的底座针脚焊接无误。接着开始焊接排阻,电容,晶振 等器件。最后引出两个针脚插座作为 VCC和GND勺插口。接下来焊接独立按键和 VCC GND莫 块,完成后通过LED丁测试按键效果,证明焊接无误。焊接工作完成后开始连线,连接控制模块和显示模块,连接控制模块和按键模块,连接 各模块VCC GND口至U VCC和GND勺专用插口。烧录入液晶显示范例程序,按键显示范例程序,测试硬件部分正常。2) 软件调试:先编写子函数程序:延时函数、判忙函数、写入命令

25、函数、写入数据函数、清屏函数、 写入字符函数、写入字符穿函数、LCD初始化函数、4*4矩阵按键扫描函数、确定/清零键扫 描函数、矩阵按键值处理函数。最后开始编写进制转换的主函数程序。通过 Keil编译软件编译,用STC_ISP_v479烧录程序到单片机,利用学习开发板的集成按键、显示屏模块测试代码。最先遇到的问题是读入按键值的问题,由于需要循环扫描的速度很快,实时监听键盘, 多导致不能在同一个循环同时保持 LCD的单个字符输出。最后为了让 LCD的逐一输出正常, 在实时扫描的循环体内内嵌入一个判断语句,把 LCD输出语句放入判断内,这样既保证了键盘的实时监听,也保证了 LCD显示屏的单个字符逐

26、一正常输出。接下来遇到的问题是键盘接收到的字符不能直接用于显示,由于读到的是有按键值处理 函数的返回值,而显示的值却是要求 ASCII型字符。所以最后决定在开头编写转码函数表, 把返回的1-16char型数字转成ASCII型的“0-9”“A-F”。如此就使得LCD能够显示所希望得 到的字符。但再往下进行进制转换的具体实施发现,转成的ASCII码无法进行加减乘除运算, 而原先的返回值是char型,也不确定是否能进行运算,同时也开始考虑int型变量是否需要 使用。最后经查阅资料发现,无论是char还是int型,都能直接被读取为机器语言进行运算, 唯一区别是char型是1个字节,int型是2个字节的

27、变量。于是通过字符型数组储存读到的按键返回值,并进行运算通过之前积累的编程经验,采用的转进制方法是通过把所有进制数都转成十进制数作为 中间数,然后在把中间数转为需要的进制数。实施的初步阶段没有什么大问题,但是遇到大 于255的10进制数的时候,发现运算出现了溢出,再次查阅资料发现了 char型变量最多能够表示0-255的10进制数,于是将此部分运算的中间变量设为int型,这样能够容纳的范围 就变成了 0-65535.最后是输出运算的结果让 LCD这其中也费了一番功夫,把底层运算的结果转成能够在 LCD上显示的ASCII型又用到了转码过程。到此软件调试基本告一段落,期间遇到的细节上 的小问题数不胜数,最后在经过无数次修改程序烧录调试后得到了圆满解决。最终软件调试成功时的烧录统计次数:127&实验结果(将运行结果拍照)输入2进制输入2进制数100011110输出8进制输出8进制数436最终实物连线图

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1