宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告
实验项目名称:单片机人机接口设计
一、 实验目的
1. 掌握单片机简单人机交互接口电路的设计方法。
2. 进一步熟悉C8051F020单片机I/O口交叉开关设置和I/O端口的使用。 3. 掌握独立式按键和LED显示接口电路和程序设计方法。
二、实验内容
1. C8051F020单片机按键(3个)和LED(4个)显示接口电路设计、制作与调试。
2. 用按键输入脉冲,在P1口按16进制计数方式点亮发光二极管。其中一个按键为加法计数键,一个按键为减法计数键,最后一个为清零键。
三、实验说明
通过本实验,掌握单片机简单人机交互接口电路的设计、制作和调试方法和程序设计方法。进一步熟悉C8051F020单片机的I/O口交叉开关和振荡器及配置使用;熟悉C语言的模块化程序设计方法。
用模块化方法进行C语言程序设计。
四、实验仪器和设备
PC机、Keil uVision2软件,C8051F020单片机,EC3在线仿真器。
U1FVCCP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7123456789P3.0P3.1P3.2P3.3P3.4P3.5P3.6P3.71011121314151617181920P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RST89C51VCCP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EAVCC4039P0.038P0.137P0.236P0.335P0.434P0.533P0.632P0.731EA五、实验原理
RESETVCC
1、LED显示接口电路
R2F100C3F10uFP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7510*8L0L1L2L3LED为共阳型接法,所以当输出为0时,可以控制数码 R1F1K管亮。
11.0592MHzP3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDXTAL2XTAL1VSSJD2B87654321ALE/PROGPSENP2.7P2.6K0P2.5P2.4P2.3P2.2P2.1P2.03029282726K12524232221ALEPSENP2.7P2.6P2.5K2P2.4P2.3P2.2P2.1P2.0L4L5K3K4K5K6K7L6L7P10BP11BP12BP13BP14BP15BP16BP9BVCCR16BR15BR14BR13BR12BR11BR10BR9B2、独立式按键接口电路
C3A22pFC2A22pF当按下时,相当于输入了0,实际的实验中,没有 KEY0BKEY1BKEY2BKEY3BKEY4BKEY5BKEY6BKEY7B右图的上拉电阻,所以需要将输入设置为弱上拉。 K0-710k*8六、程序流程图
1
宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告
关闭看门狗 初始化端口 使用默认时钟 按键输入 输入类型? 输入为减 输入复位 复位 输入为加 输出示数减一 输出示数加一 按键释放
七、实验结果与分析
当按照流程图,利用模块式的方法编写C程序,在开发板的P3.0、P3.1、P3.2的引脚接三个按键,当P3.0处按键按下,开发板上的八个指示灯只有5~8四个灯可以亮,并且灯亮所表示处的二进制数随按键按下而加一,当加至15后,将跳变到0,再按下,继续向上计数。当按下P3.1处按键则相反,二进制数减一,减值0时,将跳变到15,再按下,继续向下计数。当按下P3.2处按键,指示灯将全灭,处于复位状态。
八、源代码
2
宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告
源代码必须有必要的注释,且要与流程图的逻辑关系对应。
1、 主程序work.c
#include
/*为使主程序更简洁,另外写按键处理的按键的函数keyf.c, 以及诸如可控制看门狗的头文件,并定义常量以供程序作为 按键类型的标记*/
unsigned char code de[]={0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8, 0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0}; /*
定义一个16位的数组,其值从0xf0到0xff,对应于单片机的与 数码管相连的P5端口的八二进制数。可以让加减命令转化为这 个数组下标的移动,在数码管上就显示为灯的明灭,由于前四 个管总是灭的状态,灯可表示一个四位二进制数的变化。 */
void main() {
unsigned int num; bdwtd(); //禁止看门狗 P3MDOUT=0X00; //初始化端口 P3=0X07; //初始化端口 num=0; //将数组下标初值设为0(复位状态) while(1) { unsigned char key1; P5=de[num]; //将数组赋值于与数码管相连的P5端 keyscan(); key1=keyinput(); //判断按键输入的类型 if(key1==jia) { num++; if(num>=16) num=0; keyoff(); } /*如果输入为jia,则数组下标加一,
3
宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告
外部LED灯表现为二进制值加一*/
if(key1==jie) { num--; if(num==-1) num=15; keyoff(); } /*如果输入为jia,则数组下标减一, 外部LED灯表现为二进制值减一*/ if(key1==re) { num=0; keyoff(); } /*如果输入为re,即复位功能,那么 执行复位的功能,将数组下标赋值为0, 在外部表现为灯全灭的状态*/ } }
2、 辅助程序keyf.c
#include
这是一个按键处理的程序,以配合work4.c 使用主要 有按键扫描函数判断按键状态,按键输入函数判断按 键输入的类型,按键释放函数判断按键是否释放。 */
unsigned char keyscan(void) /*
按键扫描函数 */ {
4
宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告
unsigned char keycode;
if(add==0) keycode=jia; if(div==0)
keycode=jie; if(rest==0)
keycode=re;
if(add==1&div==1&rest==1) keycode=nokey; /*
以上是判断按键是否已经按下,并判断按下按键的 类型,如果是按下add、div或rest,那么分别返回 jia、jie或re分别表示按下了控制加一、减一或复 位的功能键。如果什么都没按下,就返回nokey */
return(keycode); }
unsigned char keyinput(void) /*
按键输入函数,用此函数可以消除按键抖动 */ {
unsigned char keybuff,keydata; keybuff=nokey; keydata=nokey; /*
首先定义keydata作为函数最后的返回值定义keybuff 作为中间变量,初值都默认为nokey */
keydata=keyscan(); //按键扫描,判断按键类型 if(keydata!=nokey) {
keybuff=keydata; /* 当扫描到按键状态不是nokey时,需要延时20ms再扫 描,再判断是否和当前一样 */
delay(10);
keydata=keyscan(); /* 如果延时20ms后仍然相同,那么说明按键已经稳定按下,
5