当前位置:首页 >> 信息与通信 >>

单片机数字量输入输出实验


一、

实验目的

1. 熟悉教学板电路及其结构。 . 2. 掌握利用μVision C51 软件编辑、调试(包括仿真调试、单步调试) 、运行单片机 . μ
程序的步骤和方法,掌握利用 STC-ISP V39 软件和下载线将程序写入单片机的方 法 。

3. 通过实验熟悉 51 单片机的并行 I/O 口,并掌握它们的应用。 . 4. 掌握矩阵键盘、LED 动态显示的工作原理。 . 二、 实验设备

PC 机一台 、 实验教学板一块。

三、 实验内容
1.实验线路如附图所示, 单片机的 P0 口输出接 8 个发光二极管的阴极, 51 P2.4 经 NPN 三极管 9011 控制发光管的阳极。P3 口支持一个 8 位行列式键盘,其中 P3.4~P3.7 供键盘扫 描输出, P3.2、P3.3 作键盘扫描输入。 实验要求:编程实现键盘对发光二极管的控制,每按一个按键,使对应的二极管点亮。 2.51 单片机 P0 口输出同时接 4 个数码管的阴极,P2.0~P2.3,经 NPN 三极管 9011 接数码管的阳极,该端口用于分别控制相应数码管的导通。 实验要求:编程实现对任意按键动作的次数进行计数(最大 99 次) ,同时将计数值 实时显示。

四、实验步骤
1. 将实验板与 PC 机通过 COM 口连接。启动 PC 机,进入μVision 软件环境,选择建立 μ 新工程文件,即可开始输入源程序。 2.完成汇编、编译、连接,若有错误,则修改源程序,直至编译、连接通过为止。 3.接上实验板上的电源。 4. 运行“STC-ISP V39.EXE” ,将程序代码下载到实验板的单片机中。操作的顺序是: 1)选择单片机(MCU TYPE)型号。 如: “STC89C51RC”要与实验板上所装单片机的型号一至。 2)打开文件(Open File) 。 即把要下载到单片机的程序文件(已通过编译了的机器码文件——二进制 (.Bin)或十六进制(.Hex)的)调到“文件缓冲区” ,这时可看到右边的“文件缓冲 区” 有数字变化。 3)选择串行通信口。 选对时, 软件上的小灯会变绿。 否则小灯是灰色。 且在左下窗口提示 “出错信息” 。 4)下载:按“Download/下载”按键下载。 5)把实验板上的供电的直流电源拔掉或关掉 3 秒钟再插入或打开电源(为单片机 上电复位) 。 5.观察单片机运行情况,验证程序是否能完成题目给出的控制要求,若不能达到要求, 分析原因、查找错误,修改源程序,再次汇编、连接,重新下载、运行,直至达到题目的控 制要求。

五、遇到的问题及原因: 遇到的问题及原因 1. 实验一,把程序烧进单片机后,发现按键时,LED 灯乱亮,经检查是 LED 等亮的数

组除了问题,修改后可以正常工作。

2.在实验二中,程序烧进单片机后,有一个数码管很暗,并且有重影,修改了延时 .
之后问题结局。每按一次按键,显示数值会增加好多,后来发现是键盘扫描程序中,检测到 按键按下后,没有等待按键释放。

附件一:参考程序流程图 附件一:

实验内容 1 流程图 实验内容 2 流程图

键盘处理程序流程图

附件二: 附件二:实验程序: 实验内容1
#include <reg52.h> /*************************************************** 程序 名称:键盘 功能:采集2*4 键盘键值并在LED 灯上显示 作者:张俊淼 备注: ***************************************************/ /**************************************************/ #define uint unsigned int #define uchar unsigned char /**************************************************/ sbit feng=P2^5;//蜂鸣器控制 sbit deng=P2^4;//LED 灯总控制 sbit LED1=P2^0;//LED 数码管第一位 sbit LED2=P2^1;//LED 数码管第二位

sbit LED3=P2^2;//LED 数码管第三位 sbit LED4=P2^3;//LED 数码管第四位 sbit int0=P3^2;//外部中断0 管脚 sbit int1=P3^3;//外部中断1 管脚 /**************************************************/ uchar Buffer[4] = {0xe0, 0xd0, 0xb0, 0x70};//键盘对比数组 uchar LEDBuf[9] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, 0xff};//LED 灯编码 uchar Key=8;//键盘数值 /**************************************************/ void init(void); void delay_ms(uint x); /******************************************************************** * 名称 : main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main() { init();//初始化 while(1) { P0=LEDBuf[Key];//显示键值 } } /******************************************************************** * 名称 : init() * 功能 : 初始化 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void init(void) { EA=1; //开总中断 EX0=1; //开外部中断 0 IT0=1; //设置成边沿触发方式 EX1=1; //开外部中断 1 IT1=1; //设置成边沿触发方式 feng=0;//关蜂鸣器 deng=1;//开启LED 总控制

LED1=0;//关闭数码管第一位 LED2=0;//关闭数码管第二位 LED3=0;//关闭数码管第三位 LED4=0;//关闭数码管第四位 P3&=0x0f;//初始化键盘输入端检测 } /************************************************** * 名称 : delay_ms(uint x) * 功能 : 毫秒延时程序,对应C51 的11.0592MHZ * 输入 : 欲延时毫秒数 * 输出 : 无 **************************************************/ void delay_ms(uint x) //毫秒延时程序 { unsigned char j; while(x--) { for(j=0;j<123;j++){;} } } /**************************************************************/ /******************************************************************** * 名称 : Funint0() * 功能 : 外部中断0。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Funint0() interrupt 0 { uchar i,x; EX0=0; EX1=0; //关外部中断 0 //关外部中断 1

delay_ms(30);//延时消抖 if(int0==0)//判断按钮是否真的按下 { int0=0; P3|=0xf0;//以上两条为进一步检测作准备 x=P3&0xf0;//取P3 高四位

for(i=0;i<4;i++) { if(x==Buffer[i])Key=i;//获取键值 } while((P3&0xf0)!=0xf0);//等待按键放开 } P3=0x0f;//初始化键盘输入端检测 EX0=1; EX1=1; //开外部中断 0 //开外部中断 1

} /******************************************************************** * 名称 : Funint1() * 功能 : 外部中断1。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Funint1() interrupt 2 { uchar i,x; EX0=0; EX1=0; //关外部中断 0 //关外部中断 1

delay_ms(30);//延时消抖 if(int1==0)//判断按钮是否真的按下 { int1=0; P3|=0xf0;//以上两条为进一步检测作准备 x=P3&0xf0;//取P3 高四位 for(i=0;i<4;i++) { if(x==Buffer[i])Key=4+i;//获取键值 } while((P3&0xf0)!=0xf0);//等待按键放开 } P3=0x0f;//初始化键盘输入端检测 EX0=1; EX1=1; } //开外部中断 0 //开外部中断 1

实验内容2
#include <reg52.h> /**************************************************/ #define uint unsigned int #define uchar unsigned char /**************************************************/ sbit feng=P2^5;//蜂鸣器控制 sbit deng=P2^4;//LED 灯总控制 sbit LED1=P2^0;//LED 数码管第一位 sbit LED2=P2^1;//LED 数码管第二位 sbit LED3=P2^2;//LED 数码管第三位 sbit LED4=P2^3;//LED 数码管第四位 sbit int0=P3^2;//外部中断0 管脚 sbit int1=P3^3;//外部中断1 管脚 /**************************************************/ uchar LEDBuf[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//LED 数码管编码 uchar Num=0;//计数值 /**************************************************/ void init(void); void delay_ms(uint x); void shownum(uchar num); /**************************************************/ void main() { init(); while(1) { shownum(Num); } } /******************************************************************** * 名称 : init() * 功能 : 初始化 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void init(void) { EA=1; //开总中断 EX0=1; //开外部中断 0 IT0=1; //设置成边沿触发方式

EX1=1; IT1=1;

//开外部中断 1 //设置成边沿触发方式

feng=0;//关蜂鸣器 deng=0;//关闭LED 总控制 LED1=0;//关闭数码管第一位 LED2=0;//关闭数码管第二位 LED3=0;//关闭数码管第三位 LED4=0;//关闭数码管第四位 P3&=0x0f;//初始化键盘输入端检测 } /************************************************** 延时程序,对应C51 的11.0592MHZ **************************************************/ void delay_ms(uint x) //毫秒延时程序 { unsigned int i,j; i=0; for(i=0;i<x;i++) { j=108; while(j--); } } /******************************************************************** * 名称 : shownum() * 功能 : 数码管显示数字 * 输入 : 0~99 的要显示的数字 * 输出 : 无 ***********************************************************************/ void shownum(uchar Num) { static uchar number[2]={0x00, 0x00};//数码管的个位和十位 number[1]=Num/10; number[0]=Num%10; P0=LEDBuf[number[0]]; LED3=0;//关闭数码管第三位 LED4=1;//开启数码管第四位 delay_ms(10);//个位显示延时

P0=LEDBuf[number[1]]; LED3=1;//开启数码管第三位 LED4=0;//关闭数码管第四位 delay_ms(10);//十位显示延时 } /**************************************************************/ /******************************************************************** * 名称 : Funint0() * 功能 : 外部中断0。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Funint0() interrupt 0 { EX0=0; //关外部中断 0 EX1=0; //关外部中断 1 delay_ms(10);//延时消抖 if(int0==0)//判断按钮是否真的按下 { while(int0==0);//等待按键放开 Num++; } P3=0x0f;//初始化键盘输入端检测 EX0=1; EX1=1; //开外部中断 0 //开外部中断 1

//

} /******************************************************************** * 名称 : Funint1() * 功能 : 外部中断1。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Funint1() interrupt 2 { EX0=0; //关外部中断 0 EX1=0; //关外部中断 1

//

delay_ms(10);//延时消抖 if(int1==0)//判断按钮是否真的按下 { while(int1==0);//等待按键放开 Num++; } P3=0x0f;//初始化键盘输入端检测 EX0=1; EX1=1; //开外部中断 0 //开外部中断 1

}


赞助商链接
相关文章:
单片机实验一 输入输出端口控制实验_图文
单片机实验输入输出端口控制实验_电子/电路_工程科技_专业资料。昆明理工大学 ...引脚,MCU 内部程序向该引脚输出高电平或低电平来驱动器件工作,即开 关量输出。...
单片机中断系统实验与数字量输入输出_图文
单片机中断系统实验数字量输入输出_信息与通信_工程科技_专业资料。实验三 中断系统实验数字量输入输出姓名: 实验目的: 1)了解 P1 口作为输入输出方式使用时,...
单片机IO开关输入输出实验报告
单片机IO开关输入输出实验报告_电子/电路_工程科技_专业资料。关于单片机I/O口输入输出实验报告单片机实验报告 学专班学姓 院 : 业 : 级 : 号 : 名 : xx 物...
单片机开关量输入实验
单片机开关量输入实验_电子/电路_工程科技_专业资料。实验 1 开关量输入实验 目的:掌握开关量的特点和编程方法。 内容:由拨码开关输入开关量到单片机单片机根据不...
单片机实验报告
单片机实验报告_计算机软件及应用_IT/计算机_专业资料。关于单片机的一个实验的报告...ADC0808/0809 时一种较为常用的 8 路模拟量输入,8 位数字量输出的逐次比较...
单片机AD输入实验_图文
实验单片机 AD 输入实验一、实验目的 1、掌握 A/D 转换与单片机的接口方法...模拟量输 入,编制程序,将模拟量转换成二进制数字量,用 8255 的 PA 口输出到...
实验六_单片机DA输出实验
实验六_单片机DA输出实验_电子/电路_工程科技_专业资料。实验五 单片机 DA 输出...转换输入数字量的结果,也即 DA 转换的输入,该公式是由 U(-5V∽ +5V)=2...
实验五 单片机DA输出实验
实验五 单片机DA输出实验_电子/电路_工程科技_专业资料。实验五 单片机 DA 输出...D/A 转换是把数字量转换成模拟量的变换,实验台上 D/A 电路输出的是 模拟...
单片机实验——利用AD完成电压测量及显示
单片机实验——利用AD完成电压测量及显示_计算机软件...读取 AD 的输出 X MOV B,#51 DIV AB MOV 30H...数字 0-9 ;40H 为“ " 00H 为不亮 DELAY: ...
单片机实验-- AD转换实验
实验6 一、实验目的: A/D 转换实验 1. 掌握 A/D 转换与单片机的接口方法...ADC0809 是一种逐次逼近式 8 路模拟输入, 8 位数字量输出的 A/D 转换器。...
更多相关标签: