单片机原理与应用2_第1页
单片机原理与应用2_第2页
单片机原理与应用2_第3页
单片机原理与应用2_第4页
单片机原理与应用2_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、实 验 报 告课程名称 单片机原理与应用 实验项目 I/O口实验 指导教师 学 院 _ 专 业 班级/学号 学生姓名 实验日期 _ 成 绩 I/O口实验一、实验目的1、通过对P0、P1 和P2口的输入输出控制,掌握MCS-51系列单片机I/O口的使用,掌握I/O口的基本功能和控制方法;2、掌握8位LED数码管的动态显示和矩阵键盘动态扫描的编程方法;3、进一步熟悉C51的集成开发环境,进一步掌握C51程序设计方法。二、实验的硬件、软件平台x86计算机,AT89S52试验箱,Windows7操作系统,Keil u Vision2 三、实验内容1、用P1口,选1根口线(如P1)接按键输入,另1根口线

2、(如P0)接LED输出,8个按键分别对应控制8个LED灯,每次按键时,LED亮、灭交替变化。2、用P0和P2作8位LED数码管的位选和片选,用P1口作4x4矩阵键盘动态扫描端口,调试给出的实验程序,理解4x4键盘和8个LED数码管编程控制方法,编程实现按16个不同的键时分别在两个数码管上显示01至16。3*、在掌握按键识别和数码管显示方法的基础上,实现个位数的计算器功能,有能力同学可以扩展到万以内数的计算器功能。四、实验步骤1、关闭电源,用导线分别连接P1和JP37的8个按键, 连接P0和JP32的8位单色数码管,检查无误后打开电源。2、打开KeilC51软件,建立工程文件,编写程序并添加到工

3、程中,编译无误后运行,检查程序结果,K1每次按键时,LED1亮、灭交替变化。(注意检测按键时,为了去掉抖动,若检测到有键按下,延时10ms左右之后再判断一次,若仍为低电平,则确认键按下,否则不操作。另外注意判断键是否按下为读引脚,可以先写1再读。)3、关闭电源,用导线分别连接P0和8位数码管区的JP5作位选,连接P2和JP8作片选,连接P1和JP50做矩阵键盘输入。从00/的示例程序中下载“LED显示和键盘”示例程序,编译运行程序,检查程序结果,按下K01K0D时八个数码管显示1G。4、理解数码管和矩阵键盘动态扫描原理,仔细分析示例程序,编程实现按S1S16时在两

4、个数码管上显示0116。5、参照普通计算器功能,编程实现个位数的计算器。十六个键功能自己定义。需要实现BCD至二进制和二进制至BCD之间的转换。为了实现本项功能,务必预习,提前编程并用模拟调试排除程序错误。6*、实现万以内数的计算器,扩展至实现8位以内有效数的十进制数计算器,支持小数的四则运算,为了数码管显示须实现BCD和float数之间的相互转换。若包含头文件math.h可进一步实现更复杂数学运算,具体用法可参看头文件定义。五、注意事项1、接线或拔线之前请先断电,检查无误后再加电;2、键盘和显示是人机交互的基本方法,在后面的实验中还要用到,务必掌握。四、实验代码及注释1、通过按键控制LED#

5、include "reg52.h" /预处理伪指令sbit P1_0=P10; /把P1的第一位赋给第一个P1的第一个引脚,以下同理sbit P1_1=P11;sbit P1_2=P12;sbit P1_3=P13;sbit P1_4=P14;sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17;sbit P0_0=P00;sbit P0_1=P01;sbit P0_2=P02;sbit P0_3=P03;sbit P0_4=P04;sbit P0_5=P05;sbit P0_6=P06;sbit P0_7=P07;void main()uns

6、igned char i,k; /定义i,k两个8位16进制数 while(1) if(P1_0=0) /当P1的第一位是0for (i=0;i<200;i+)for (k=0;k<200;k+);P0_0=P0_0; /P0口的状态取反,使第一个灯亮 if(P1_1=0) /当P1的第二位是0for (i=0;i<200;i+)for (k=0;k<200;k+);P0_1=P0_1; /P0口的状态取反,使第二个灯亮。/以此类推,每小节控制一位LED if(P1_2=0) for (i=0;i<200;i+)for (k=0;k<200;k+);P0_2

7、=P0_2; if(P1_3=0) for (i=0;i<200;i+)for (k=0;k<200;k+);P0_3=P0_3; if(P1_4=0) for (i=0;i<200;i+)for (k=0;k<200;k+);P0_4=P0_4; if(P1_5=0) for (i=0;i<200;i+)for (k=0;k<200;k+);P0_5=P0_5; if(P1_6=0) for (i=0;i<200;i+)for (k=0;k<200;k+);P0_6=P0_6; if(P1_7=0) for (i=0;i<200;i+)f

8、or (k=0;k<200;k+);P0_7=P0_7; 2、用数码管显示十进制01至16#include <reg52.h> /预处理伪指令#include <intrins.h>#define uchar unsigned char /定义伪指令#define uint unsigned intchar code SST5163 _at_ 0x003b;uchar data dis_digit;uchar code dis_code17= 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0x

9、30,0x25,0xa9,0x26,0xa1,0xb1,0xFF; /0,1,2,3,4,5,6,7,8,9,关显示,数码管码表uchar data dis_buf8; / 显示缓冲区uchar data dis_index,key,i,j,flag;uchar data key_high, key_low;/-延时子程序void delay(uchar x) uchar j; while(x-)!=0) for(j=0;j<125;j+) ; /-键扫描子程序 void keyscan(void) uchar temp;P1=0x0F; /低四位输入 delay(1);temp=P1;

10、 /读P1口 temp=temp&0x0F; temp=(temp|0xF0); if(temp=1) key=0; else if(temp=2) key=1; else if(temp=4) key=2; else if(temp=8) key=3; else key=16; P1=0xF0; /高四位输入 delay(1);temp=P1; /读P1口 temp=temp&0xF0; temp=(temp>>4)|0xF0); if(temp=1) key=key+0; else if(temp=2) key=key+4; else if(temp=4) ke

11、y=key+8; else if(temp=8) key=key+12; else key=16; /-判断键是否按下void keydown(void) P1=0xF0;if(P1!=0xF0) keyscan(); /while(P1!=0xF0); /等待键释放 if(key!=16) /分离高低位 key_high=key/10; /对key除以十取商key_low=key%10; /对key除以十取余dis_buf1= dis_codekey_low ; /将十进制数的低位赋给dis_buf1dis_buf0=dis_codekey_high; /将十进制的高位赋值给dis_buf0

12、/i+;/if(i=8) i=0; void main()P0 = 0xff; /P0口归0P2 = 0xff; /P2口归0TMOD = 0x01;TH0 = 0xFC;TL0 = 0x17;IE = 0x82; dis_buf0 = dis_code16; /按照十六进制表示dis_buf1 = dis_code16;dis_buf2 = dis_code16;dis_buf3 = dis_code16;dis_buf4 = dis_code16;dis_buf5 = dis_code16;dis_buf6 = dis_code16;dis_buf7 = dis_code16;dis_di

13、git = 0xfe; /位选通值dis_index = 0; /当前显示的数码管和缓冲区的偏移量为0TR0 = 1; /启动定时器0key=11;while(1) /死循环 keydown();void timer0() interrupt 1/ 定时器0中断服务程序, 用于数码管的动态扫描/ dis_index - 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量/ dis_digit - 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,选通P2.0口数码管/ dis_buf - 显于缓冲区基地址TH0 = 0xFC;TL0 = 0x17;P2 = 0xff;/ 先关闭所有数码管P0 = dis_bufdis_index;/ 显示代码传送到P0口P2 = dis_digit;/位选通值, 传送到P2口用于选通当前数码管的数值dis_digit = _crol_(dis_digit,1);/ 位选通值左移, 下次中断时选通下一位数码管di

温馨提示

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

评论

0/150

提交评论