《单片机原理与实验教程》课件第7章_第1页
《单片机原理与实验教程》课件第7章_第2页
《单片机原理与实验教程》课件第7章_第3页
《单片机原理与实验教程》课件第7章_第4页
《单片机原理与实验教程》课件第7章_第5页
已阅读5页,还剩116页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章基础实验

实验一Keil软件和ISP在线编程工具使用实验实验二数据传送实验实验三数据转换实验

实验四拆字、拼字实验

实验五I/O口实验(发光二极管实验)实验六数码管实验实验七中断实验实验八键盘扫描实验实验九RS232串口实验实验十液晶控制实验实验一Keil软件和ISP在线编程工具使用实验一、实验目的

(1)掌握Keil软件的使用方法。

(2)掌握Atmel公司的ISP软件在线编程的方法。

(3)了解ISP编程器硬件及Keil软件的软仿真功能。二、实验原理

Keil软件的使用方法参见第5章内容,ISP软件使用和ISP编程器硬件介绍见第6章的有关内容。三、实验内容(1)根据第5章介绍的Keil软件的使用方法,打开Keil软件,建立工程,选择器件,并将文件保存在相应的目录下。建立新文件时,应注意文件的扩展名应为*.C。将参考程序中的代码输入文件、保存、编译,生成*.HEX文件。(2)对步骤(1)输入的程序进行软仿真。(3)将AT89S52实验平台与计算机相连(注意下载器的1脚和实验箱的1脚对应)。打开桌面上的AtmelISP在线编程工具,连接实验平台和计算机(具体操作参考第6章的ISP编程工具介绍内容),将步骤(1)生成的*.HEX文件下载到实验平台。

(4)观察实验现象。四、参考程序

1.汇编程序

/*本程序实现功能:实现流水灯功能,LED循环左移*/

ORG0000H

AJMPMAIN

ORG0030H/*主程序从0030H单元开始*/

MAIN: MOVR4,#08/*左移程序,设置循环次数为8*/

MOVA,#0FEH/*准备把11111110赋予P0口*/ROUNDLED:

MOVP0,A

RLA

/*左移一位*/

MOVR5,#50/*设置延迟时间*/

LCALLDELAY

/*调用延时程序,使人能看清楚灯的循环*/DJNZR4,ROUNDLED/*判断R5是否循环了8次*/

LJMPMAINDELAY:

MOVR6,#50/*延迟子程序,总延迟时间为R5*10ms*/

TT2:

MOVR7,#100

DJNZR7,$

DJNZR6,TT2

DJNZR5,DELAY

RET

END

2.C51语言程序

#include<reg52.h>

#include<intrins.h>

main()

{

unsignedchardigled;

inti;

longintj;

digled=0xfe;

while(1){

for(i=7;i>=0;i--)

/*8位LED显示*/

{P0=digled;/*点亮LED*/

if((digled&0x80)==0x00)

digled=digled*2;

elsedigled=digled*2+1;/*左移一位*/

for(j=1000;j>0;j--);/*延时*/

}

}

}五、实验仪器和设备

Keil软件、AT89S52实验平台、AtmelISP在线编程软件。六、思考与分析

(1)指出编译生成的*.HEX文件的路径、文件的大小,并分析文件的大小与AT89S52的Flash大小之间的关系。(2)说明如何在软仿真中观察变量i、digled的变化。实验二数据传送实验一、实验目的

(1)掌握AT89S52存储器之间的数据传送方法。

(2)掌握指针操作方法。二、实验原理在Keil环境中编写并调试一个数据传送程序,同时完成下面操作:

(1)将AT89S52内部RAM的40H~4FH单元中的数据送到数据存储器的7E00H~7E0FH单元中;

(2)将数据存储器的7E00H~7E0FH单元中的数据送到AT89S52内部RAM的50H~5FH中。该实验无需将程序下载到实验系统中,只需在Keil环境中完成仿真即可。实验参考流程图如图7-1所示。

(注意:流程图中的BP1、BP2、BP3表示断点。)图7-1数据传送实验程序流程图三、实验内容在Keil环境下根据实验要求编写程序。在Keil软仿真环境下调试程序,调试方法如下:

(1)打开仿真软件中的内部数据空间和外部数据空间,在40H~4FH数据单元中分别送数,例如,1,2,3,4……共16个数据。

(2)单步运行(断点设在BP2,程序运行至断点),检查外部RAM(7E00H~7E0FH)数据是否与40H~4FH数据一一对应。

(3)如果程序运行不能进入某一断点,则应用单步、断点方法分段检查程序,排除错误直至正确为止。四、参考程序

1.汇编程序

ORG0000H

AJMPMAIN

MAIN:

MOVR6,#16/*数据个数*/

MOVR0,#40H/*设置数据首地址*/

TRANDATA1:

/*将40H~4FH单元数据送到数据存储器7E00H~

7E0FH单元中*/

MOV@R0,P1/*通过P1口传送数据*/

INCR0/*下一个地址*/

DJNZR6,TRANDATA1/*直到16个数据送完*/

MOVR6,#16

MOVDPH,#7EH/*设置存放数据的RAM地址*/

MOVDPL,#00H

MOVR0,#40HLOOP:

MOVA,@R0

MOVX@DPTR,A

INCDPTR

INCR0

DJNZR7,LOOPTRANDATA2:

/*数据存储器7E00H~7E0FH单元的内容送到内部RAM的50H~5FH单元中*/

MOVR1,#50H/*设置数据首地址*/

MOVR7,#16/*数据个数*/

MOVDPH,#7EH

MOVDPL,#00HLOOP1:

MOVXA,@DPTR

MOV@R1,A

INCDPTR

INCR1

DJNZR7,LOOP1

END

2.C51语言程序

#include<reg52.h>

#include<intrins.h>

main()

{

unsignedchardata*point1;//片内存储器地址指针

unsignedcharxdata*point2;//片外存储器地址指针

unsignedchari;//个数计数

point1=0x40;

for(i=0;i<16;i++){*point1=i+1;point1++;} //给以0x40开始的地址赋值1~0x10[JP]

point1=0x40;

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

//将以地址以0x40开始的数据送到以0x7E00开始的16个地址中

{ *point2=*point1;

point1++;

point2++;

}

point1=0x50;

point2=0x7E00;

for(i=0;i<16;i++)//将以地址0x7E00开始的数据送到以0x50开始的16个地址中{ *point1=*point2;

point1++;

point2++;

}

while(1)

{;}

}五、实验仪器和设备

Keil软件。六、思考与分析(1)试编写将外部的数据存储区6030H~607FH的内容写入外部RAM的0x3030~0x307FH单元中的程序。(2)说明在C51语言中对地址操作的方法。实验三数据转换实验

一、实验目的掌握数据格式转换程序的编写方法。二、实验原理编写并调试一个二翻十程序,其功能为将40H,50H两单元中的二进制数转换为十进制数,并将转换结果存放在R4,R5,R6单元中。将二进制数转换成十进制数的方法有多种,此实验采用先左移二进制数,再加倍十进制数并加入二进制数移出位的方法来实现。具体算法是:先将存放十进制数的3个单元清0;再将二进制数左移1位,最高位移入进位;然后,十进制数存放单元中的BCD码数按BCD码的规则加倍并加入进位;如此连续移位、加倍、校正,直到所有的二进制数位均移出为止。程序流程图如图7-2所示。图7-2实验参考流程图三、实验内容在Keil环境下根据实验要求编写程序。在Keil软仿真环境下调试程序,调试方法如下:

(1)断点设在BP1,程序运行至BP1,检查40H、50H内容是否与输入值正确对应。

(2)断点设在BP2,程序运行至BP2,检查R4、R5、R6内容是否为二进制数所对应的十进制数转换结果。

(3)程序连续运行,若有错误应改用单步或断点分段调试程序,排除软件错误,直至正确为止。

(4)改动40H、50H单元中的内容,连续运行以观察结果正确与否。四、参考程序

1.汇编程序

ORG0000H

AJMPMAIN

MAIN:

MOV40H,#60H/*将数据送到RAM的

40H单元*/

MOV50H,#3CH/*将数据送到RAM的

50H单元*/

CLRA

/*清累加器*/

MOVR4,A

/*清存放转换后数据的寄存器R4,R5,R6*/

MOVR5,A

MOVR6,A

MOVR7,#16

BITBCD:CLRC/*C清零*/MOVA,50H/*将50H中的内容左移1位*/RLCAMOV50H,AMOVA,40H/*将40H中的内容左移1位*/RLCAMOV40H,AMOVA,R6/*(R6)+(R6)+(C),和进行二—十进制调整,调整后的BCD码送R6中*/ADDCA,R6DAAMOVR6,AMOVA,R5/*(R5)+(R5)+(C),和进行二—十进制调整,调整后的BCD码送R5中*/ADDCA,R5DAAMOVR5,AMOVA,R4/*(R4)+(R4)+(C),和进行二—十进制调整,调整后的BCD码送R4中*/ADDCA,R4DAAMOVR4,ADJNZR7,BITBCD/*判断循环是否完成*/END

2.C51程序假设2字节二进制数存放在内部RAM的0x35和0x36单元中(0x35放高位),转换结果存入0x37~0x39这三个单元中,则C51程序如下:

#include<absacc.h>#defineucharunsignedchar#defineuintunsignedintvoidmain(){uchardata*q;

uintdata*p;

p=0x35;

q=0x3f;

while(q!=0x3A){ *q--=*p%10; *p=*p/10;

}}五、实验仪器和设备

Keil软件。六、思考与分析

试用C51语言编写一个功能和本实验类似的整数十翻二子程序。实验四拆字、拼字实验

一、实验目的

掌握拆字和拼字程序的编写方法。二、实验原理拆字程序:把7000H单元的内容拆开,高位送7001H单元的低位,低位送7002H单元的低位,7001H、7002H单元的高位清零。拼字程序:把7000H,7001H单元的低位相拼后,送入7002H单元中。图7-3(a)为拆字程序的流程图;图7-3(b)为拼字程序流程图。图7-3实验参考流程图三、实验内容在Keil环境下根据实验原理中的实验要求编写程序。在Keil软件仿真环境下调试程序,调试方法如下。拆字程序单步运行到BP1,观察7000H和A单元中的内容是否为68;单步运行到BP2,观察7001H单元中的内容是否为6;单步运行到BP3,观察7002H单元中的内容是否为8。若是,程序对;若不是,反复修改程序直到正确为止。同理可调试拼字程序。四、参考程序

1.汇编程序

1)拆字程序

ORG0000H

AJMPMAIN

MAIN:MOVSP,#60H/*设置堆栈指针为

RAM地址60H*/

MOVDPTR,#7000H/*设置存放数据的地址*/

MOVA,#68

MOVX@DPTR,A/*68送7000H单元*/

MOVXA,@DPTR

INCDPTRPUSHAcc/*将68压栈*/SWAPA/*高低位交换*/ANLA,#0FH/*屏蔽高4位*/MOVX@DPTR,A/*8送7001H单元的低4位*/INCDPTRPOPAcc/*68出栈*/ANLA,#0FH/*屏蔽高四位*/MOVX@DPTR,A/*6送7002H单元的低4位*/END

2)拼字程序

ORG0000H

AJMPMAIN

MAIN:MOVDPTR,#7000H/*设置存放数据的地址*/

MOVA,#56

MOVX@DPTR,A

/*置7000H单元内容为56*/

MOVXA,@DPTR

SWAPA

/*高低位交换*/

ANLA,#0F0H

/*屏蔽低4位*/

MOVR1,A

MOVB,R1

INCDPTRMOVA,#98MOVX@DPTR,A

/*置7000H单元内容为98*/MOVXA,@DPTRANLA,#0FH

/*屏蔽高4位*/MOVR2,BORLA,R2INCDPTRMOVX@DPTR,AEND

2.C51语言程序

#include<reg51.h>

#include<stdio.h>

#include<absacc.h>

#include<intrins.h>

main()

{

//拆字程序

XBYTE[0x7000]=0x34;

XBYTE[0x7001]=XBYTE[0x7000]&0x0f; //取低位赋值给0x7001地址

XBYTE[0x7002]=XBYTE[0x7000]>>4; //取高位赋值给0x7002地址

//拼字程序

XBYTE[0x7000]=0x34;

XBYTE[0x7001]=0x56;

//0x7000地址的低位作为0x7002的高位,0x7001地址的低位作为0x7002的低位

XBYTE[0x7002]=((XBYTE[0x7000]&0x0f)<<4)+(XBYTE[0x7001]&0x0f);

while(1) {

}}五、实验仪器和设备

Keil软件。六、思考与分析如何将一个单元中的内容拆开?实验五I/O口实验(发光二极管实验)

一、实验目的

(1)掌握I/O口的编程方法。

(2)掌握Atmel公司ISP软件的在线编程方法。

(3)了解ISP编程器硬件及Keil软件的软仿真功能。二、实验原理

AT89S52的P0口为8位双向口,每一位可独立定义为输入、输出口。CPU对P0口的操作可以是字节操作,也可以是位操作。实验中,P0口接8个发光二极管。编写程序,通过P0口控制发光二极管(LED)的点亮和熄灭。通过该实验理解CPU对P0口的操作和编程方法。实验平台上发光二极管的控制与其他外设的控制共用P0口。实验时将J17的跳线帽插上即可选择P0口对发光二极管的控制。三、实验内容

(1)将J17上的跳线冒插上,选择P0口对8个发光二极管控制。

(2)编写程序使P0口的8个发光二极管同时灭,并延时0.5s,再同时亮,反复循环。

(3)编写程序使发光二极管依次点亮,间隔时间为0.5s,反复循环。循环点亮程序的流程图如图7-4所示。图7-4循环点亮软件流程图四、参考程序(只完成循环点亮LED)

1.汇编程序

ORG0000H[KG4]

AJMPMAIN

ORG0030H

/*主程序从0030H单元开始*/

MAIN:

MOVP0,#0FFH

/*通过置位P0使LED灯全不亮*/

MOVR5,#50

/*设置时间*/

LCALLDELAY

/*调用延时程序*/

MOVR4,#08H

/*左移程序,设置循环次数为8*/

MOVA,#0FEH

/*准备把11111110赋予P0口,首先存入累加器A中*/RDLED:MOVP0,A

RLA/*左移1位*/

MOVR5,#50/*设置时间*/

LCALLDELAY/*调用延时程序,使人能看清楚灯的循环*/DJNZR4,RDLED/*判断自减后R5是否为0,若是,则顺序执行下面程序,若不是,则继续循环*/LJMPMAINDELAY:

MOVR6,#50/*延时子程序,总延迟时间R5*10ms*/

TT2:

MOVR7,#100

DJNZR7,$

DJNZR6,TT2

DJNZR5,DELAY

RET

END

2.C51语言程序

#include<reg52.h>

#include<intrins.h>

main()

{

unsignedchardigled;

inti;

longintj;

while(1)

{

digled=0xfe;

for(i=7;i>=0;i--)/*8位diglight显示*/ {P0=digled;

digled=_crol_(digled,1);/*循环左移1位*/ for(j=5000;j>0;j--);/*延时*/ }}}五、实验仪器和设备

Keil软件、AT89S52实验平台、AtmelISP在线编程软件。

六、思考与分析

(1)说明P0口的操作方法。

(2)说明LED的控制方法,并说明LED是高电平控制还是低电平控制。

(3)修改程序使发光二极管从左到右显示。实验六数码管实验一、实验目的(1)掌握七段LED的显示原理。(2)掌握LED动态显示的编程方法。二、实验原理

关于LED原理可参考第6章内容,实验箱提供了8位七段数码管(LED)显示电路,8位LED由两个4位动态显示的共阳极数码管组成。8位数据线接到单片机的P0口,8位片选线接到单片机的P1口,高电平选择。操作过程为:选择相应数码管(给P1口送数据),控制数码管的8位数据线(给P0口送相应数据),读者只要按地址输出相应数据,就可以实现对LED的控制。显示共有8位,用动态方式显示。三、实验内容

(1)将拨动开关J3拨在开的位置。(2)根据给出的程序流程图(见图7-5)在Keil编程环境下编写程序,在数码管上显示数字0,1,2,3,并生成*.HEX文件。(3)通过Atmel公司的ISP软件将生成的*.HEX文件下载到实验箱的单片机中,并使实验箱离线运行。图7-5程序流程图四、参考程序

1.汇编语言程序

BUFEQU30H/*定义变量,用来存放4位显示器字型数据*/

ORG0000H/*程序由地址0000H开始执行*/

AJMPMAIN/*转向主程序*/MAIN:

/*主程序*/MOVA,#0FFHMOVP0,A/*使4位数码管不亮*/MOVR2,#4/*计数4次*/MOVR0,#BUF/*设置RAM的变量地址*/MOVR1,#0/*数码管数值索引值*/MOVA,#0FFHMOVP1,AMOVDPTR,#TABLE/*指向字型数据数组*/A1:MOVA,R1MOVCA,@A+DPTR/*取出字型数据*/MOV@R0,A

/*字型数据放入显示器缓冲器内*/INCR0

/*变量地址加1指到下一位显示器缓冲器地址*/INCR1

/*索引值加1*/DJNZR2,A1

/*循环判断是否继续执行*/LOOP:LCALLSCAN/*扫描控制显示器显示一次*/AJMPLOOP/*一直循环*/DELAY:/*延迟子程序,总延迟时间R5*1ms*/MOVR6,#5D1:MOVR7,#100

DJNZR7,$DJNZR6,D1DJNZR5,DELAYRET

TABLE:/*字型数据数组*/DB0C0H,0F9H,0A4H,0B0H,99HDB92H,82H,0F8H,80H,90HSCAN:MOVR0,#BUF/*指向显示器显示缓冲区起始地址*/MOVR2,#4/*循环执行4次*/MOVA,#08H/*加载扫描输出信号初值00001000

B*/SS1:MOVR3,AMOVA,@R0/*取出七段显示数据*/MOVP0,A/*由P0口送出1位七段显示数据*/MOVA,R3MOVP1,A/*由P2口送出扫描输出信号*/MOVR5,#1H/*延迟时间设置*/LCALLDELAYMOVA,R3RRA/*改变扫描码,使其下一个数码管亮*/

INCR0/*显示器显示缓冲区地址加1*/DJNZR2,SS1/*循环判断是否继续执行*/RETEND

2.C51语言程序

#include<reg52.h>

//动态显示0、1、2、3

#defineucharunsignedchar

#defineuintunsignedint

ucharDisbuf[10]={0,1,2,3};//显示的4位数值表uchartab[]={0xc0,0xf9,0xa4,0xb0,/*01234*/

0x99,0x92,0x82,0xf8,0x80,0x90};/*56789*/

voiddelay(uinti)

{while(i--);}

voidmain(){

uchari=0,npos=0x01;

while(1)

{

for(i=0;i<4;i++)//4位数码管显示

{

P1=npos;//使能位

npos<<=1;//移位

P0=tab[Disbuf[i]];//查表显示

delay(400);//延时

}

npos=0x01;

}

}五、实验仪器和设备

Keil软件、AT89S52实验平台、AtmelISP在线编程软件。六、思考与分析

(1)说明动态显示数码管和静态显示数码管的区别。

(2)修改C语言程序为定时器工作方式,显示定时为100ms,每位数码管显示10ms。实验七中断实验一、实验目的

(1)掌握中断程序的编程方法。

(2)了解蜂鸣器的控制方法。二、实验原理本实验主要为了使读者理解中断原理和掌握中断的编程方法。关于中断原理可参考第3章的有关内容。本实验通过外部中断1所接的轻触开关打开或关断蜂鸣器,循环点亮跑马灯。三、实验内容

(1)接通J18(控制蜂鸣器跳线)和J17(控制8位跑马灯跳线)。(2)在Keil编译环境下,根据流程图(图7-6)编写程序,生成*.HEX文件。(3)在ISP环境下将生成的*.HEX文件下载到AT89S52中。(4)离线运行,观察运行结果。图7-6中断流程图四、参考程序

1.汇编程序

BEEPEQUP3.4[KG6]/*定义蜂鸣器*/

ORG0000H

AJMPMAIN

ORG0013H

LJMPINT1PRM/*转向外部中断1服务子程序*/MAIN:SETBIT1

/*下降沿触发*/MOVIE,#84H/*中断控制寄存器设置*/WAIT:AJMP$

/*等待中断发生*/INT1PRM:CPLBEEP

/*蜂鸣器取反*/CLRCMOVA,#0FFH/*准备把11111110赋予P0口,首先存入累加器A中*/MOVR5,#09H/*设置循环次数为9*//*左移程序*/XUNH:

/*流水灯子程序*/

RLCA

/*左移一位*/

MOVP0,A

ACALLDELAY/*调用延时程序,使人能看清楚灯的循环*/

DJNZR5,XUNH/*判断自减后R5是否为0,若是,则跳回按键判断程序,若不是,则继续循环*/

RETIDELAY:MOVR6,#0FFH/*延时程序*/TT2:MOVR7,#0FFH

DJNZR7,$DJNZR6,TT2RETEND

2.C51语言程序

#include<reg52.h>

sbitBeep=P3∧4;//蜂鸣器

unsignedchartime;

main()

{P3=0xff;

EX1=1; //外部中断1允许位

IT1=1;//下降沿触发

EA=1; //开总中断

Beep=0x00;

while(1)

{;}

}voidinttrer()interrupt2{unsignedinti,j;

Beep=~Beep; //蜂鸣器取反

time=0x01;

for(i=0;i<8;i++)//digitled控制跑马灯轮流亮

{P0=~time;

time=time<<1;

for(j=5000;j>0;j--){;}}}五、实验仪器和设备

Keil软件、AT89S52实验平台、AtmelISP在线编程软件。六、思考与分析(1)描述中断处理过程。(2)将程序改写成查询方式,要求能达到同样的程序效果,并说明中断和查询的区别。实验八键盘扫描实验一、实验目的(1)掌握键盘扫描的编程方法。(2)掌握LED动态显示的方法二、实验原理无论是单片机控制系统还是单片机测量系统,都需要一个人机对话装置,这种人机对话装置通常采用键盘和显示器。键盘是单片机应用系统中人机对话常用的输入装置,而显示器是单片机应用系统中人机对话常用的输出装置。键盘是由若干个按键开关组成的,键的多少根据单片机应用系统的用途而定。键盘由许多键组成,每个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。单片机接收到按键的触点信号后作相应的功能处理。因此,对于单片机系统来说键盘接口信号是输入信号。单片机的键盘接口分为独立式和矩阵式。独立式键盘的每个按键都有一个信号线与单片机电路相连,所有按键有一个公共地或公共正端,每个键相互独立互不影响。如图7-7所示,当按下键1时,无论其他键是否按下,键1的信号线均由1变0;当松开键1时,无论其他键是否按下,键1的信号线均由0变1。图7-7独立式按键原理图矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处,每当一个按键按下时通过该键将相应的行、列母线连通。若在行、列母线中把行母线逐行置0(一种扫描方式),那么列母线就用来作信号输入线。矩阵式键盘的原理图如图7-8所示。图7-8矩阵式按键原理图针对以上两大类键盘的工作方式,单片机又有三种键盘扫描方式:查询方式、定时扫描方式和中断扫描方式。查询方式是指在程序中用一段专门的扫描和读按键程序不停地查询有无按键按下,确定键值。这种方式电路简单,但需要占用单片机的机器时间。定时扫描方式是指利用单片机内的定时器来产生定时中断,然后在定时中断的服务程序中扫描,检查有无键按下,并确定键值。这种方式的电路也比较简单,不占用单片机的机器时间,但需要占用一个定时器,同时定时的时间不能过长,否则可能检测不到相应的按键。中断扫描方式是指当有键按下时由相应的硬件电路产生中断信号,单片机在中断服务程序中扫描,检查有无键按下,并确定键值。这种方式硬件电路上必须要产生中断线,这需要通过与门和非门来产生,但中断方式不占用单片机的机器时间,也不会出现采用定时方式时的检测不到键盘的情况。另外,在扫描键盘时需处理键盘抖动问题,称为去抖。一般去抖可以采用软件方式完成,操作方法是,当检测到有键按下时,等待10ms左右时间,如果此按键仍然保持按下的状态,则确认此次按键,如果在100ms内连续检测到此按键按下,则不确认第二次按下的键。键盘扫描程序流程图如图7-9所示。图7-9键盘扫描程序流程图本实验系统中的键盘在硬件上采用查询方式工作,键盘采用矩阵键盘,有16个按键,见第6章的实验箱硬件资料。三、实验内容(1)根据图7-9所示流程图在Keil编译环境下编写程序,生成*.HEX文件,要求任意按下键盘时,能在LED上将按下的键所对应的十六进制数显示出来。(2)通过ISP软件将生成的*.HEX文件下载到单片机当中。(3)将拨动开关K1拨到“on”的位置,离线运行程序,观察实验现象,看是否满足要求,不满足实验要求时,检查实验代码。四、参考程序

1.汇编程序

FKEYEQU20H.0/*按键标志*/

KEYNUMEQU30H/*按键编号变量*/

ORG0000H

AJMPMAINMAIN:

ACALLKEYET

MOV@R0,A

MOVA,@R0

MOVP0,A

AJMPMAINTABLE:/*字型数据数组*/

DB0C0H,0F9H,0A4H,0B0H

DB99H,92H,82H,0F8H

DB80H,90H,88H,83H

DB0C6H,0A1H,86H,8EHKEYET:

CLRFKEY/*清除按键标志*/

ACALLSCAN/*执行按键扫描*/

JBFKEY,G1/*测试按键标志*/

AJMPKEYET/*若没有按键则等待按键*/DELAY:/*延迟子程序*/

MOVR6,#50/*总延迟时间R5*10ms*/D1:MOVR7,#100

DJNZR7,$

DJNZR6,D1

DJNZR5,DELAY

RET

G1:

ACALLSCAN/*执行按键扫描*/

JBFKEY,G1/*等待按键放开*/

MOVA,KEYNUM

MOVDPTR,#TABLE/*找出按键码*/

MOVCA,@A+DPTR

RETSCAN:

/*键盘扫描控制程序*/MOVR3,#0FEH/*加载扫描,输出信号初值

11111110B*/

MOVR4,#0/*按键计数标号清除为0*/

MOVR1,#4/*循环1执行4次*/

CLRPSW.5/*PSW.5=0,表示未按键*/L1:

MOVA,R3

MOVP2,A/*由P2口送出扫描输出信号*/

MOVR5,#1

ACALLDELAY

MOVA,P2/*读取P2口数据,以便判断是否有按键*/

ANLA,#0F0H

MOVR2,#4L2:

JBACC.4,N1/*累加器A第4位若为1,表示没按键*/

MOVKEYNUM,R4/*加载按键编号*/

SETBPSW.5/*按键标志设为1*/

N1:

INCR4/*按键编号加1*/

RRA/*检查下一位*/

DJNZR2,L2

MOVA,R3/*加载旧的扫描码*/

RLA

MOVR3,A

DJNZR1,L1BACK:

JNBPSW.5,NO_KEY/*设置是否按键*/

SETBFKEY/*若有按键,则FKEY=1*/

RET

NO_KEY:

CLRFKEY

RET

END2.

C51语言程序

#include<reg52.h>

#defineucharunsignedchar

#defineunitunsignedint

voiddelay();

ucharkeyscan();

unitj,h;

voidmain()

{ucharkey;

P1=0xff;[KG15]/*数码管使能*/

while(1)

{

key=keyscan(); /*键盘值返回*/

delay();

switch(key) /*判断键值*/

{case0xee:P0=0xc0;break; /*0~F的键值*/case0xde:P0=0xf9;break;case0xbe:P0=0xa4;break;case0x7e:P0=0xb0;break;case0xed:P0=0x99;break;case0xdd:P0=0x92;break;case0xbd:P0=0x82;break;case0x7d:P0=0xf8;break;case0xeb:P0=0x80;break;case0xdb:P0=0x90;break;case0xbb:P0=0x88;break;case0x7b:P0=0x83;break;case0xd7:P0=0xa1;break;case0xb7:P0=0x86;break;case0x77:P0=0x8e;break;case0x00:P0=0xc1;break;}

}

}

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

voiddelay() /*延时*/

{

unsignedinti;

for(i=8000;i>0;i--);

}

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ucharkeyscan() /*键盘扫描*/{

while(1)

{

P2=0xff; /*P2口拉高*/

P2=0xfe; /*第一行置低*/

if((P2&0xff)!=0xfe)/*判断是否有键按下*/{

delay(); /*去抖动*/

if((P2&0xff)!=0xfe)

returnP2; /*返回键值*/

elseP2=0xfd;

}

elseP2=0xfd; /*第二行置低*/if((P2&0xff)![KG-*3]=0xfd)

{

delay();

if((P2&0xff)![KG-*3]=0xfd)

returnP2;

elseP2=0xfb;

}

elseP2=0xfb; /*第三行置低*/

if((P2&0xff)!=0xfb){

delay();

if((P2&0xff)!=0xfb)

returnP2;

elseP2=0xf7;

}

elseP2=0xf7;/*第四行置低*/

if((P2&0xff)!=0xf7)

{

delay();

if((P2&0xff)!=0xf7)

returnP2;

elsereturnP2=0xfe;

}

} }五、实验仪器和设备

Keil软件、AT89S52实验平台、AtmelISP在线编程软件。六、思考与分析

(1)说明查询方式的工作原理。

(2)说明中断方式和查询方式的优缺点。实验九RS232串口实验一、实验目的

(1)掌握RS232串行通信的基本原理。(2)掌握RS232串口的程序设计方法。(3)了解PC端的串口调试工具。二、实验原理

关于单片机串口工作原理请读者参考第2章的有关内容。实验箱上的串口资源原理图请参考附录B或第6章的有关内容。三、实验内容在单片机上实现与PC机的通信。(1)通过PC机的串口调试工具发送数据,发送的数据在LED上显示,同时应答PC机的“OK”信息。根据程序要求在Keil编译环境下编写程序,生成*.HEX文件。(2)通过ISP软件将程序下载到单片机中,运行程序。(3)通过串口调试工具发送“55”,观察实验箱上的显示结果和串口调试工具的应答信息。程序流程图如图7-10所示。图7-10串口流程图四、参考程序

//功能:通过串口工具发送2位数据,将其转换成十进制数后,在LED上显示,并发回应答信号//

#include<reg52.h>

#defineucharunsignedchar

#defineunitunsignedint

uchardispbuf[]={0,0,0,0};

ucharsendbuf[]={0,0};

ucharrec_data[]={0,0};

unitj,h;

ucharcgf2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//共阳极LED对应的段码为0~9voiddelay(unsignedinti)

{

while(i--);

}

voidDispbuf(unsignedinttemper) //转换程序

{

dispbuf[3]=temper/1000;

dispbuf[2]=(temper%1000)/100;

dispbuf[1]=(temper%100)/10;

dispbuf[0]=temper%10;

}

voidscomre(unsignedcharB0,unsignedcharB1) //应答回信号

{unsignedchark;

k=0;

sendbuf[0]=B0;

sendbuf[1]=B1;

while(k<2)

{

SBUF=sendbuf[k];

while(TI==0);

TI=0;

k++;

}

delay(200);

}

main()

{

uchari,rec_data,npos=0x01,flag=0;

TMOD=0x20;

//定时器1初始化,方式2

TL1=0xf4;TH1=0xf4;//波特率为2400b/s,晶振为11.0592MHz

SCON=0x50;

//串口初始化,方式1

TR1=1;

RI=0;

while(1)

{if(RI)//是否有收到信号

{

rec_data=SBUF;

RI=0; //清接收标志

flag=1; //置接收标志

}

for(i=0;i<4;i++) //4位动态显示{

Dispbuf(rec_data);

P1=npos;

npos=1;

P0=cgf2[dispbuf[i]];

delay(500);

}

npos=0x01;

if(flag==1) //接收标志置位,发应答信号

{

scomre(′O′,′K′);//应答信号

flag=0;

}

}

}五、实验仪器和设备

Keil软件、AT89S52实验平台、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论