智能仪器实验指导书新.docx

上传人:b****2 文档编号:24516506 上传时间:2023-05-28 格式:DOCX 页数:43 大小:610.28KB
下载 相关 举报
智能仪器实验指导书新.docx_第1页
第1页 / 共43页
智能仪器实验指导书新.docx_第2页
第2页 / 共43页
智能仪器实验指导书新.docx_第3页
第3页 / 共43页
智能仪器实验指导书新.docx_第4页
第4页 / 共43页
智能仪器实验指导书新.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

智能仪器实验指导书新.docx

《智能仪器实验指导书新.docx》由会员分享,可在线阅读,更多相关《智能仪器实验指导书新.docx(43页珍藏版)》请在冰豆网上搜索。

智能仪器实验指导书新.docx

智能仪器实验指导书新

 

徐州工程学院

《智能仪器》实验指导书

 

实验一智能仪器人机接口验证实验

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;

for(b=0;b

}

/**********************************************

*函数:

SetLine(uchline)*

*描述:

设定页地址----X:

0--7*

**********************************************/

voidSetLine(uchline)

{

line=line&0x07;//0<=line<=7

line=line|0xb0;

w_com(line);

}

/**********************************************

*函数:

SetColumn(uchcolumn)*

*描述:

设定列地址----Y:

0--127*

**********************************************/

voidSetCol(uchcolumn)

{

uchcolumn_h,column_l;

column=column&0x7f;//0<=column<=127

column_h=column&0x0f0;//列地址高四位

column_h=column>>4;

column_l=column&0x0f;//列地址低四位

column_h=column_h|0x10;

column_l=column_l|0x00;

w_com(column_h);

w_com(column_l);

}

voidLCD_Init()

{

rst=0;

Delay1(10);

rst=1;

w_com(0xaf);//开显示w_com(0xaf);//ONDISPLAY

w_com(0x40);//STARDISPLAY

//w_com(0xa0);//ADCNORMAL,反向安装时0xA1,

w_com(0xa1);

w_com(0xa6);//

w_com(0xa4);//CLEAR

w_com(0xa2);//1/9BIAS

//w_com(0xc8);//COMMONOUTPUTDIRECTION,反向安装时0xC0

w_com(0xC0);

w_com(0x2f);//POWERCONTROL

w_com(0x24);//RESISTERRATIO

w_com(0x81);//VOLUMMODESET

w_com(0x24);//RESISTERRATIO

}

/*****************************************************

*函数:

Show16X16(uchline,uchcomlon,constuch*pt)*

*描述:

显示一个16X16的汉字*

*line:

显示的页(0--7)*

*column:

显示的列(0--127)*

**pt:

显示字的首地址*

*****************************************************/

voidShowHZ(uchline,uchcolumn,uch*pt)//reentrant

{

uchi;

SetCol(column);//设置起始列

SetLine(line);//设置行

for(i=0;i<16;i++)

{

wdata(*pt);//写数据

pt++;//

}

SetLine(line+1);//设置汉字下半部分显示页

SetCol(column);

for(i=0;i<16;i++)

{

wdata(*pt);

pt++;

column++;

}

}

voidShowHZs(uchline,uchcol,uch*pHz)//reentrant

{

uchi,chH,chL;

chH=*pHz++;

chL=*(pHz);

for(i=0;i<255;i++)

{

if(chH==GB_16[i].Index[0]&&chL==GB_16[i].Index[1])

{

ShowHZ(line,col,GB_16[i].Msk);

break;

}

}

}

//直接输出一个汉字串,将汉字串用双引号括起来即可

voidShowHZss(uchline,uchcol,uch*pHz)//reentrant

{

while(*pHz)

{

/*chH=*pHz++;

chL=*(pHz);

for(i=0;i<255;i++)

{

if(chH==GB_16[i].Index[0]&&chL==GB_16[i].Index[1])

{

ShowHZ(line,col,GB_16[i].Msk);

col+=16;

if(col>=128){line+=2;col=0;}

break;

}

}*/

ShowHZs(line,col,pHz);

col+=16;

if(col>=128){line+=2;col=0;}

pHz+=2;

}

}

voidShowChar(uchline,uchcolumn,constuch*pt)//reentrant

{

chari;

SetCol(column);//设置起始列

SetLine(line);//设置行

for(i=0;i<8;i++)

{

wdata(*pt);//写数据

pt++;//

}

SetCol(column);

SetLine(line+1);

for(i=0;i<8;i++)

{

wdata(*pt);//写数据

pt++;//

}

}

voidPutChar(uchx,uchy,uchuChar)//reentrant

{

unsignedchar*p;

if(uChar<128)

{

p=(uChar-0x20)*16+&Ascii[0];

ShowChar(x,y,p);

}

}

//直接输出一个字符串,直接将字符串用双引号括起来即可

voidShowString(uchx,uchy,uch*p)//reentrant

{

while(*p)

{

PutChar(x,y,*p);

p+=1;

y+=8;

if(y>=128)

{

y=0;x+=2;

}

}

}

//SHowNull函数:

显示空字符以便抹去无效的已显示字符

voidShowNull(uchline,uchcol,uchlen)//reentrant

{

while(len)

{

//ShowChar(line,col,Nul);

PutChar(line,col,'');

col+=8;

if(col>=128){col=0;line+=2;}

len--;

}

}

 

实验二智能仪器的通信接口设计实验

(一)

E05205502

一、实验目的:

(1)掌握AD转换器、时钟芯片、数字温度传感器、AT24C16等常见单片机外围元件的使用与编程方法。

(2)了解与掌握SPI、IIC通信的特点。

二、实验内容:

对AD转换器ADC0832、时钟芯片DS1302、数字温度传感器DS18B20、存储器AT24C16等进行编程与设置,并利用protues软件仿真程序运行;

三、接线图

 

四、实验步骤

1、在KeilC中编写DS1302、ADC0832、DS18B20、AT24C16的驱动程序;生成Hex文件;

2、在Protues中增加上述元器件,并按电路图中所示方式连接线路;

3、综合调试运行上述工程,理解并掌握上述元器的使用方法。

 

五、实验程序:

//下面是ADC0832部分

sbitAD_CS=P2^0;

sbitAD_DI=P2^1;

sbitAD_DO=P2^2;

sbitCLK=P2^3;

uintReadAD(bitb)

{

uchartem=0x00;//AD转换值

uchari=0x00;//

//uintuInt;

intInt;

//初始化AD转换

AD_DI=1;

AD_CS=0;

CLK=1;

ss();

CLK=0;

ss();

AD_DI=1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1