资源描述:
《单片机实验3 单片机人机接口设计.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、单片机原理及应用——单片机人机接口设计一、实验目的1.掌握单片机简单人机交互接口电路的设计方法。2.进一步熟悉C8051F020单片机I/O口交叉开关设置和I/O端口的使用。3.掌握独立式按键和LED显示接口电路和程序设计方法。二、实验内容1.C8051F020单片机按键(3个)和LED(4个)显示接口电路设计、制作与调试。2.用按键输入脉冲,在P1口按16进制计数方式点亮发光二极管。其中一个按键为加法计数键,一个按键为减法计数键,最后一个为清零键。三、实验说明通过本实验,掌握单片机简单人机交互接口电路的设计、制作和调
2、试方法和程序设计方法。进一步熟悉C8051F020单片机的I/O口交叉开关和振荡器及配置使用;熟悉C语言的模块化程序设计方法。必须用模块化方法进行C语言程序设计。四、实验仪器和设备PC机、KeiluVision2软件,C8051F020单片机,EC3在线仿真器。五、实验原理1.LED显示接口电路VDDR图5LED接口电路2.独立式按键接口电路VDDRK1K2K3图6独立式按键电路第1页共6页单片机原理及应用——单片机人机接口设计3.程序流程图:编写各个模块设置独立式按键,定义端口进入主函数,进行初始化设置延用设判调用相
3、应函数,获得按键的输入时于定断函扫消输数描除入N输抖的有按键入动截输入?的的止Y信函函号数数通过对按键的扫描,进行相的应的加减清零计数函数将运算结果赋值给指定端口P5七、实验源代码:#include#include#defineNO_KEY0xFF#defineCLEAR0x0A#defineUP0x0B#defineDOWN0x0Csbitkey0=P1^0;sbitkey1=P1^1;sbitkey2=P1^2;unsignedcharcodeled[16]={0xFF,
4、0xFE,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,0xF5,0xF4,0xF3,0xF2,0xF1,0xF0};//设定显示字数组共16位voidDelay()//延时函数{第2页共6页单片机原理及应用——单片机人机接口设计unsignedinti;for(i=0;i<2000;i++);}unsignedcharKeyScan(void)//用于扫描输入的信号{unsignedcharkeycode;if(key0==0)keycode=CLEAR;//如果输入的是清零键,就赋
5、值给keycodeCLEAR的值elseif(key1==0)keycode=UP;//如果输入的是加法键,就赋值给keycodeUP的值elseif(key2==0)keycode=DOWN;//如果输入的是加法键,就赋值给keycodeDOWN的值elsekeycode=NO_KEY;//如果没有输入,就赋值keycodeNO_KEY的值return(keycode);//返回keycode的值}unsignedcharKeyInput(void)//设定消除抖动的函数{unsignedcharkeybuff,ke
6、ydata;//keybuff是缓存keydata的变量keybuff=NO_KEY;keydata=NO_KEY;keydata=KeyScan();//扫描输入if(keydata!=NO_KEY){keybuff=keydata;第3页共6页单片机原理及应用——单片机人机接口设计Delay();keydata=KeyScan();if(keybuff!=keydata)keydata=NO_KEY;}//通过延时20ms确认输入return(keydata);}voidKeyoff(void)//判断输入的截止{
7、unsignedcharkeydata;do{keydata=KeyScan();}while(keydata!=NO_KEY);//如果keydata无输入,就停止,否则不断扫描输入}voidmain(void){unsignedcharkeycount=0;unsignedcharkeydata;OSCXCN=0x67;Delay();//等待系统晶振延时while(!(OSCXCN&0x80));//检查系统晶振是否稳定OSCICN=0x88;//如果晶振稳定了,就启用外部晶振WDTCN=0xDE;WDTCN=0
8、xAD;keydata=0x0A;第4页共6页单片机原理及应用——单片机人机接口设计while(1){keydata=KeyInput();switch(keydata){caseCLEAR:keycount=0;//如果keydata是清零,就将keydata赋值为0break;caseUP:keycount++;if(keyc