智能仪器实验指导书新.docx
- 文档编号:24516506
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:43
- 大小:610.28KB
智能仪器实验指导书新.docx
《智能仪器实验指导书新.docx》由会员分享,可在线阅读,更多相关《智能仪器实验指导书新.docx(43页珍藏版)》请在冰豆网上搜索。
智能仪器实验指导书新
徐州工程学院
《智能仪器》实验指导书
实验一智能仪器人机接口验证实验
E05205501
一、实验目的:
1、掌握矩阵式非编码键盘的识键、译键与编程;
2、掌握常用液晶LCD12864的使用与编程。
二、实验要求:
1、利用KeilC新建工程,编写矩阵键盘的扫描程序及常用的处理程序代码,生成Hex文件。
2、在KeilC环境中编写LCD12864的驱动代码,可以使其显示英文字符与汉字;
3、通过编写与调试代码,掌握矩阵键盘的识键、防抖、译键的原理与方法;理解与掌握键盘使用过程中常用的程序方案;掌握常见LCD显示的接口、时序与编程该方法。
4、学习使用Protues仿真软件仿真单片机电路。
三、实验器材:
1、PC机1台
2、KEILC软件1套
3、Proteus软件1套
四、实验电路:
列码
(0e101H)
行码
(0e103H)
主要器件及接口参见下图中红色线圈出的部分。
五、实验过程
1.新建文件夹,取名“Kbd_LCD”,打开KeilC软件,新建一个工程Kbd_LCD,并把工程保存到新建立的文件夹中;
2.在Keil工程中,新建txt文件,编写代码或从教师提供的参考资料中复制代码到该文件中,将该文件另存为main.c文件;选中”sourcegroup1“,点右键,选,“addfilestogroup”将main.c文件添加到工程中。
3.选“target1”,点右键,选“optionsfortarget”,选“output”属性页,勾选“createhexfile”,选中该项后,编译工程时将生成Hex文件Kbd_LCD.hex。
4.选择project菜单下的“rebuildalltargetfiles”,编译生成Kbd_LCD.hex。
5.打开protues软件,新建一个DSN文件,取名Kbd_LCD.dsn。
6.寻找并添加以下元件:
10WATT1K,ADC0832,AT89C51RD2,BUTTON,HDG12864F-1,如下图所示:
7.按实验电路图组建电路。
8.设置AT89C51单片机的属性:
点选AT89C51单片机图标,在弹出的editcomponent窗口中设置programfile为前述生成的Kbd_LCD.hex文件。
9.保存工程文件。
10.选择左下方的执行按钮,仿真运行程序。
六、补充说明:
有关实验原理或实验程序的其他内容请参阅教材或参考指导教师提供的课堂资料。
七、主要程序代码参考:
ucharKey;//当前按下的键
idataucharVal[9];//将输入的数字存放到这个数组,以便计算
//以下内容是键盘处理函数
voidss(void)//延时
{
unsignedchara=0;
for(a=0;a<3;a++)
{;}
}
voiddelay(unsignedintn)//reentrant//延时
{
unsignedinti=0,j=0;
for(i=n;i>0;i--)
for(j=0;j<100;j++);
return;
}
uintpow(ucharn)//求10的n次方
{uchari;uinttemp=1;
for(i=0;i temp*=10; returntemp; } voidIntToStr(intco2,char*s)//整数转换成字符串 { uchari,n; if(co2>=0) { if(co2==0){s[0]='0';s[1]='0';s[2]='\0';return;} if(co2<=9){s[0]='0';s[1]=co2+0x30;s[2]='\0';return;} i=0; while(co2/pow(i)>=1){i++;}//获得数据有多少数据位 for(n=0;n s[n]=(uchar)(((int)(co2/pow(i-n-1)))%10+0x30); s[n]='\0'; } else { co2=-co2; if(co2<=9){s[0]='-';s[1]=co2+0x30;s[2]='\0';return;} i=0; while(co2/pow(i)>=1){i++;}//获得数据有多少数据位 for(n=0;n s[n+1]=(uchar)(((int)(co2/pow(i-n-1)))%10+0x30); s[n+1]='\0'; s[0]='-'; } } voidFtoStr(floatf,char*s,unsignedcharL)//浮点数转换成字符串,L是小数位数 { unsignedcharcha[3],i,n; intz;floatx; bitb=0; if(f>=0) { z=(int)f;x=f-z; } else { f=-f;z=(int)f;x=f-z;z=-z;b=1; } ////////////////////////////如果小数部分为0就调用整数转换为字符串函数,这样,所有的数值转移为字符串工作都可以通过调用FtoStr来完成了 if(x==0) {if(b)z=-z;IntToStr(z,s);return;} //////////////////////////////////////////////// IntToStr(z,s); //以下处理f是负纯小数的情况,即当z为0时,f可正可负 if(b==1&&z==0) s[0]='-'; //////////////////////////////////////////////// z=(int)(x*1000);//只显示3位小数 n=0; while(z/pow(n)>=1){n++;}//获得数据有多少数据位 for(i=0;i { cha[i]=(z/pow(n-i-1))%10; cha[i]+=0x30; } cha[i]='\0'; for(i=0;i<9;i++) { if(s[i]=='\0') { s[i]='.';s[i+1]=cha[0];s[i+2]=cha[1];s[i+3]=cha[2];s[i+4]='\0'; break; } } } voidCharToStr(charco2,char*s)//8位整数转换成字符串 { chari,n; if(co2>=0) { if(co2==0){s[0]='0';s[1]='0';s[2]='\0';return;} if(co2<=9){s[0]='0';s[1]=co2+0x30;s[2]='\0';return;} i=0; while(co2/pow(i)>=1){i++;}//获得数据有多少数据位 for(n=0;n s[n]=(uchar)(((int)(co2/pow(i-n-1)))%10+0x30); s[n]='\0'; } else { co2=-co2; if(co2<=9){s[0]='-';s[1]=co2+0x30;s[2]='\0';return;} i=0; while(co2/pow(i)>=1){i++;}//获得数据有多少数据位 for(n=0;n<=i;n++) s[n+1]=(uchar)(((int)(co2/pow(i-n-1)))%10+0x30); s[n]='\0'; s[0]='-';//加上负号 } } uintGetNum(uchari,ucharj)//从键盘获得输入的整数 { uchara; uintNum,N; Begin: N=0; //for(a=0;a<5;a++)NumStr[a]='\0'; while(GetKey()! ='F') { Val[N]=Key; //NumStr[Ni]=Key+0x30; PutChar(j,N*8+i,Key+0x30); if(Val[N]>9)//如果输入了字母就重新开始输入 { for(a=0;a PutChar(j,i+a*16,''); gotoBegin; } N++; } if(N>4) { for(a=0;a PutChar(j,i+a*16,''); gotoBegin; } Num=0; for(a=0;a Num+=Val[N-1-a]*pow(a); returnNum; } bitTestKey()//按键测试,识键,判断是否有键按下 { P0=0x0f; ss(); if(P0==0x0f) return0; else { delay(20); P0=0x0f; ss(); if(P0==0x0f) return0; else { delay(20); P0=0x0f; ss(); if(P0==0x0f) return0; else return1;//有键按下返回1,否则返回0 } } } ucharGetKey()//译键,获得按下的键值 { while(! TestKey())//无键按下什么都不做 {;} //有键按下时判断哪个键按下 P0=0xef; ss(); if(P0==0xee){Key=0x01;gotoNEXT;}//1 if(P0==0xed){Key=0x05;gotoNEXT;}//5 if(P0==0xeb){Key=0x09;gotoNEXT;}//9 if(P0==0xe7){Key='C';gotoNEXT;}//C P0=0xdf; ss(); if(P0==0xde){Key=0x02;gotoNEXT;}//2 if(P0==0xdd){Key=0x06;gotoNEXT;}//6 if(P0==0xdb){Key=0x00;gotoNEXT;}//0 if(P0==0xd7){Key='D';gotoNEXT;}//'D'; P0=0xbf; ss(); if(P0==0xbe){Key=0x03;gotoNEXT;}//3; if(P0==0xbd){Key=0x07;gotoNEXT;}//7 if(P0==0xbb){Key='A';gotoNEXT;}//A if(P0==0xb7){Key='E';gotoNEXT;}//E P0=0x7f; ss(); if(P0==0x7e){Key=0x04;gotoNEXT;}//4 if(P0==0x7d){Key=0x08;gotoNEXT;}//8 if(P0==0x7b){Key='B';gotoNEXT;}//B if(P0==0x77){Key='F';gotoNEXT;}//F NEXT: while(TestKey()){;} returnKey; } ///按键处理函数完成 ///////////////////////////////////////////////////////// //以下是LCD12864的有关代码 #include"Ziku.h"//字库文件,可参阅参考资料 /******************************************************************/ #defineuchunsignedchar #defineuintunsignedint sbitsclk=P1^1; sbita0=P1^0; sbitdi=P1^2; sbitrst=P1^4; sbitcs1=P1^3; #definenop()_nop_()/*定义空指令*/ //串行模式发送数据 voiddata_send(unsignedchardat) { unsignedchars,temp; inti; sclk=0; s=dat; for(i=8;i>0;i--) {sclk=0; nop(); nop(); temp=s&0x80; if(temp) {di=1;} else{di=0;} sclk=1; s=s<<1; } } /*************************************************/ //写命令 /*************************************************/ voidw_com(unsignedcharx) { a0=0; cs1=0; data_send(x); } /*************************************************/ //写数据 /*************************************************/ voidwdata(unsignedchardat) { a0=1; cs1=0; data_send(dat); } voidDelay1(unsignedchara) { unsignedchari; unsignedcharb;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 仪器 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)