51单片机实习报告

更新时间:2023-11-26 08:19:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

长安 大 学

微控器技术实验报告

年 级: 大 三 学 号: ***** 姓 名: *** 专业班级: 自动化0706 指导老师: ****

20010 7 22

第1章 实验目的及要求

1、 学习Keil C51集成开发工具的操作及调试程序的方法,包

括:仿真调试与脱机运行间的切换方法; 2、 3、

熟悉TD-51单片机系统板及实验系统的结构及使用; 进行MCS51单片机指令系统软件编程设计与硬件接口功能

设计; 4、

学习并掌握Keil C51与Proteus仿真软件联机进行单片机

接口电路的设计与编程调试; 5、

完成指定MCS51单片机综合设计题。

第2章 实验内容

本实验分为软件与硬件两大部分,软件部分只需要尽心软件编程

调试即可,硬件部分既可以利用实验室提供的设备器材进行联机调试,也可以应用虚拟软件若Proteus进行模拟仿真。要求做实验前需进行充分的准备,软件部分先写好程序、硬件部分编号线路图,或者用虚拟软件运行成功后在到实验室利用单片机等设备进行在线调试运行。

第3章 软、硬件环境

软件环境:KEIL uv3,PROTEUS7.4 硬件环境:PC机,TD-51系统板

第4章

4.1 实验内容

软件编程设计实验

实验一 清零程序与拆字程序设计

根据实验指导书之“第二章 单片机原理实验”(P17~P23页)内容,熟悉实验环境及方法,清零程序:把 7000H –7FFFH 的内容清零。

实验二 拼字程序与数据传送程序设计

1、 折字程序:把 7000H 的内容拆开,高位送 7001H 低位,低位送 7002H 低位。7001H,7002H高位清零。

2、 拼字程序:把 7000H,7001H 的低位相拼后送人 7002H,一般本程序用于把显示缓冲区的 数据取出拼装成个字节。 3、 数据传输子程序:把(R2,R3)源 RAM 区首址内的(R6,R7)个字节数据,传送到(R4,R5) 目的 RAM 区。 实验三 排序程序与散转程序设计

1、 编写并调试一个排序子程序,其功能为用冒泡法将内部 RAM

中几个单元字节无符号的正整数,按从小到大的次序重新排列。

2、 编写散转程序,根据 8032 片内 20H 中的内容(00 或 01 或

02 或 03)进行散转。 4.2 实验程序流程图及算法 1、 清零程序清单: ORG

0000H

R0,#00H

START: MOV

MOV MOV

R1,#10H ;循环次数 DPTR,#7000H A,#00H

D0:

MOV

MOVX @DPTR,A ;清零 INC

DPTR ;地址加一

INC R0

CJNE R0,#00H,D0 DJNZ R1,D0 END

图4-1清零程序流程图

为了验证程序的结果,可以将清零先改成置一,这样就可以看这个程序是否正确。 2. 折字程序:

拆字流程图如图二所示:

ORG 0000H

LJMP MAIN ORG 0100H MAIN: MOV

MOV

DPTR,#7000H

A,#33H ;7000H中送33H

MOVX @DPTR,A MOVX A,@DPTR SWAP A

ANL

A,#0FH

;屏蔽高四位 DPTR,#7001H

MOV

MOVX @DPTR,A ;送7000H高位至7001H MOV

A,#01H

图4-2拆字程序流

MOV DPTR,#7000H

程图

MOVX A,@DPTR ANL

A,#0FH

MOV DPTR,#7002H ;送7000H低位至7002H MOVX @DPTR,A END

3. 拼字程序:

拆字程序流程图见右图4-3。 程序清单: ORG 0000H LJMP MAIN ORG 0100H MOV DPTR,#7000H MOV

A,#05H

MOVX @DPTR,A MOVX A,@DPTR ANL

A,#0FH

SWAP A MOV R0,A MOV DPTR,#7001H MOV

A,#01H

MOVX @DPTR,A MOVX A,@DPTR

ANL

A,#0FH

ORL

A,R0

MOV DPTR,#7002H

MOVX @DPTR,A END

图4-3 拼字程序流程图

4.数据传输子程序 程序流程图见图4-4。

图4-4数据传输指令 图4-5 散转指令流程图

传输指令清单: ;(R2,R3)->(R4,R5) ;(R6,R7)个字节

;(R0,R1)作为计数值,与6、7相等时,传送完毕 ORG 0000H

AJMP MAIN MOV DPH,R4 ;A给目MAIN:

MOV 始值

MOV MOV MOV MOV MOV MOV MOV 初值

CJNE CJNE LJMP S: MOV 数据给A MOV MOVX INC MOV MOV R2,#1 R3,#2 R4,#1 R5,#2AH R6,#0 R7,#6 R0,#00H

R1,#0 R6,#0,S R7,#0,S E

DPH,R2 DPL,R3 A,@DPTR DPTR R2,DPH R3,DPL

;设置各 初;R0R1 计数 ;源地址的地址

MOV DPL,R5 MOVX @DPTR,A INC DPTR MOV R4,DPH MOV R5,DPL

MOV DPH,R0 ;计数值R0R1+1

MOV DPL,R1 INC DPTR MOV R0,DPH MOV R1,DPL

MOV A,R1 ;R1异或R7,若A=0,R1=R7 XRL A,R7 JNZ S MOV A,R0

XRL A,R6;若R1=r7且

R0=R6,传送完毕 JNZ S E:

END

5. 散装程序流程图见图4-5。 程序清单 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV A,20H RL A ADD A,20H MOV DPTR,#TABLE JMP @A+DPTR TABLE:

LJMP PM0 ;散转入口

LJMP PM1 LJMP PM2 LJMP PM3

PM0: MOV R0,#00H ; 子程序0

MOV R3,#10H MOV R1,#30H L1: MOV A,R0

MOV @R1,A INC R0 INC R1 DJNZ R3,L1 LJMP EXIT

PM1:MOV DPTR,#7000H 序1

MOV A,#33H MOVX @DPTR,A MOVX A,@DPTR INC DPTR MOV R0,A ANL A,#0FH MOVX @DPTR,A MOV A,R0 SWAP A ANL A,#0FH INC DPTR MOVX @DPTR,A LJMP EXIT

PM2: MOV 11H,#0FH ; 2

子程子程序; AJMP EXIT

PM3: MOV 12H,#0FEH ; 子程序3

6. 冒泡程序 流程图件图4-6 程序清单:

;冒泡法排序;(R0)为数据开始地址指针(R1)为数据块字节数;实现从小到大排序 ORG 0000H LJMP MAIN MAIN:MOV R0,#50H MOV R1,#5H LCALL MAPE END

MAPE: DEC R1 MOV R4,R0

CLR PSW.5 ;清冒泡标志

MAP10:MOV R3,R1

MOV R0,R4 ;数据块起始地址

AJMP EXIT EXIT:NOP END指针

MAOP11:MOV R2,@R0 ;取前数 INC R0

MOV A,@R0 ;取后数 CLR C SUBB A,R2

JC MAP12 ;前数小于后数,不变

SETB PSW.5 ;置冒泡标志

MOV A,@R0 INC R0 MOV @R0,A INC R0 MOV @R0,R2 MAOP12:DJNZ R3,MAOP11 JBC PSW.5,MAOP10 MAPE:RET

开始

图4-6 冒泡法排序

初始化 内循环次数N-1给CX 清冒泡标志 i=0 修改地址 Y 数i《数i+1 N 二数位置交换,标志位置1 内循环计数减1 N 内循环计数到零? Y Y 外循环标志为1? N 结束

4.2 实验调试步骤

1. 输入程序,检查无误后,编译、链接程序,首先给系统复位,然后点击命令进入调试状态。 2、点击

命令复位,点击

命令运行整个程序,观察存储器窗口的结果。、 命令单步运行程序,观察每一步运行情况,找出

3、另外在程序出错时可点击错误之处。

4.3 实验结果及分析

清零、拆字、拼字实验均满足要求,其中清零实验为了验证结果正确性,可

以将清零改成置一。运用汇编编写程序后,可以参考实验指导书进行c语言编程,强化理解c语言。 散装程序,用途及广,可以实现多个目标的跳转,具有散装功能。 冒泡排序一般有两种方法,一个是规定排序次数,进行内外两次循环,也可在外循环设置标志位,只有当内循环需要转换数据时,才进行外循环,否则程序结束。明显,带有标志位的冒泡法排序相对来说时间复杂度要小,本实验即采用第二种冒泡法排序。 典型的排序程序还有快速法,查找法等,这里没有进行编写。

第5章

硬件程序设计实验

5.1静态存储器扩展实验

1、 实验要求及内容:

编写实验程序,在单片机内部一段连续RAM 空间30H~3FH 中写入初值00H~0FH,然后将 这16个数传送到RAM的0000H~000FH 中,最后再将外部RAM 的0000H~000FH 空间的内容传送 到片内RAM的40H~4FH 单元中。为了更好的看到实验效果,添加一显示灯泡,用以表征数据是否正确传输。如果有有传送错误,则令指示灯闪烁

2、 实验程序设计及硬件实现 ①:画程序流程图,如5-1

开始 将00H-0FH传送至片内RAM的30H-3FH内 R1=10H; R0=30H DPTR=0000H @R0→@DPTR @DPTR=@R1? Y R1-1 N R1=0? Y 将片外RAM的0000H至000FH的内容传送至片内RAM的40H-4FH中 N R0+1 DPTR+1 调用指示灯闪烁子程序 结束 图 5-1 SRAM程序流程图

②:根据流程图编写汇编语言程序。 程序如下:

ORG AJMP

0000H MAIN

P3.5,#1

;P3.5外接

INC INC DJNZ MOV MOV

;将00H-0FH写入RAM

MOV

DPTR R0 R1,L2 R1,#10H R0,#40H

@R0,A DPTR R0

;写入内部RAM 中

DPTR,#0000H

MAIN: MOV 烁则出错) MOV MOV MOV

指示灯指示运行状态(长亮则运行正常,闪

R0,#30H A,#00H R1,#10H

@R0,A R0

内30H-3FH L3: MOVX A,@DPTR

MOV

INC INC

L1: MOV

INC

DJNZ R1,L3

ER: 序 INC DJNZ MOV MOV MOV

MOV A R1,L1

P3.5,#0 ;P3.5闪烁子程LCALL DELAY MOV JMP

P3.5,#1 ER

LCALL DELAY

R1,#10H R0,#30H

A,@R0

;写入外部RAM中 RET ;延时子程序 DELAY: MOV

MOV D1:

DJNZ DJNZ RET END

R6,#50H R7,D1 R6,D2

D2:

R7,#0FFH

DPTR,#0000H

L2: MOV

MOVX @DPTR,A MOVX A,@DPTR CJNE

A,@R0,L4

;传送出错,调用闪

L4: LCALL ER 烁子程序

③:判断程序正误。输入程序,检查无误后,编译、链接程序,先在Keil C中模拟运行,直至正确为止。

④:按照图5-1进行接线,联机调试运行程序。

图5-1 扩展存储器实验线路图

⑤:脱机运行程序,学习并掌握脱机联机模式之间的切换方法。

5.2数字量输入输出实验

5.2.1 实时输入输出

1、 实验内容

P1口是8位准双向口,每一位均可独立定义为输入输出。编写实验程序,将P1口的低4位定义为输出,高4位定义为输入,数字量从P1口的高4位输入,从P1口的低4位输出控制发光二极管的亮灭。 2、 实验程序设计及硬件实现

P1口是准双向口,在其作为输入口使用时,首先要写先写入高电平,然后再读P1口数据才是准确的。所以,程序的开始就应该说明P1口的高4为为输入,也就是将高4位写“1”,指令为:MOV P1,#0F0H 程序清单:

MAIN: E:

ORG AJMP

MOV MOV ANL SWAP MOV AJMP SJMP END

0000H MAIN P1,#0F0H A,P1 A,#0F0H A P1,A E $

;定义高4位为输入

开始 P1高4位为输入 低4位为输出 读取P1口数据 结束

图 5-2基本输入输出程序流程图

此程序的关键点在于:P1口是准双向口,在其作为输入口使用时,首先要写“1”,然后再读P1口数据才是准确的。所以,程序的开始就应该说明P1口的高4为为输入,也就是将高4位写“1”,指令为:MOV P1,#0F0H 硬件接线及运行后状态:

图5-3 基本输入输出电路图及Proteus仿真结果

5.2.2方波发生器

1、 实验内容:单片机集成的定时器可以产生定时中断,利用定时器0和定时器1,编写实验程序在P1.0及P1.1 引脚上输出方波信号,通过示波器观察实验现象并测量波形周期。

2、实验程序设计及硬件实现 程序清单:

MOV TMOD,#10H ;定时器1工作方式1 MOV TH1,#0FFH ;设置计数初值 MOV TL1,#83H

SETB EA ;开中断 SETB ET1 ;定时器1允许中断 SETB TR1 ;定时开始 SJMP $ ;等待中断 中断服务程序:

MOV TH1,#0FFH ;重新设置计数初值 MOV TL1,#83H

CPL P1.0 ;输出取反 RETI ;中断返回

按照实验指导书上硬件接线图进行接线,联机进行调试分析。

5.2.3键盘扫描与数码管显示设计

1、实验内容:使用汇编语言编程,实现如下功能:在4*4小键盘上按键输

入,并将其内容显示在LCD上。 2、实验程序设计及硬件实现

①原理阐述

矩阵键盘的运行原理:键盘的列线接电阻后接+5V的电源,另一端接单片机的P3.0~P3.3口,行线接在单片机的P3.4~P3.7口上。键盘采用扫描的方式,程序开始运行时,检测的方法是单片机的P3.4~P3.7口输出全“0”,读取P3.4~P3.7口的状态,若P3.4~P3.7口有高电平,则有键按下,否则没有键按下。若有键按下,通过延时去抖。去除键抖动后,当检测到有键按下后,延时一段时间在做下一步的检测判断。若有键按下,通过程序判断是哪个按键按下并通过程序判断此键所代表的具体数值(在程序中将每个按键赋予一个固定的值,从0到F),然后查表后的键值送到数码管显示。

LCD液晶显式原理:液晶显示的原理是利用液晶的物理特性, 通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图。程序开始时,对液晶进行了初始化设置,约定了显示格式。由于液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志位,即读忙信号和光标地址BF为低电平,表示不忙,否则此指令失效。要显示字符时,程序先输入显示字符地址,也就是告诉模块在哪里显示字符,液晶就可以正常显示。 ②方案讨论

独立式键盘由一组相互独立的按键组成。这些按键直接与单片机的I/O口相连,即每个按键盘独占一个I/O口,接口简单。这里采用查询方法,利用判断指令实现键盘功能。

矩阵键盘输入:矩阵键盘是4*4的16位键盘,键盘的行线和列线分别接单片机的P3.0~P3.3和P3,4~P3.7口上,键盘采用键盘扫描的工作方式。

LCD显示输出:将LCD的输入端D0到D7接在单片机的P1端口,数据通过P2口送入LCD,LCD内部有数据译码器,能将数据转换为电压变化,并显示。RS端接P2.1,RW接P2.0,E接P2.2,VSS与滑动变阻器一端接地,VDD与滑动变阻器另一端接+5V,VEE接划动端,通过滑动变阻器改变LCD的显示亮度,使之能正常显示。

硬件接线参考图5-5,图为Proteus运行结果。

图5-4 4*4键盘扫描输入及显示功能Proteus仿真结果图

③部分程序流程框图。

开 始 设置LCD控制信号 设置LCD工作模式 读取显示数据CHIAN 设置数据计数器R5 Y 查忙 N 显示输出,定位光标 i++ 延时等待 字符输出完? N Y 读取下个显示数据 END 图5-5 LCD显示子程序

开始 置所有行 为低电平 读取列值 判断哪一列按下 读运行状态 调键值译码程序 行输入为高电平? Y 延时 读取P3口数据 N 调用显示 RET RET 得行号 置所有列为低电 图5-6 4*4矩阵键盘流程图

④程序清单:程序中设置编有头文件LCD1602.h、input.h、hardware.h,函数文件有:LCD1602.c、input.c、SHIYAN.c。SHIYAN.c为最终所需文件。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 /*-- hardwar.h文件 硬件抽取层---*/ #ifndef __HARDWAR_H__ #define __HARDWAR_H__ #include

/*-- LCD数据、控制口定义-----*/ #define LCD_DATA P1 //LCD的数据口 sbit LCD_BUSY=LCD_DATA^7; //LCD忙信号位

sbit LCD_RW=P2^0; //LCD读写控制

sbit LCD_RS=P2^1; //LCD寄存

器选择

sbit LCD_EN=P2^2; //LCD使能信号*/

/*----I2C-EEROM接口定义------------*/ Sbit SDA=P2^4; //I2C总线数据 Sbit SCL=P2^3; //I2C总线时钟

/*------ DS1302接口定义-----*/ sbit reset=P2^7; sbit sclk=P2^6; sbit io=P2^5;

extern void _nop_ (void); #endif 。。。。。。。。。。。。。。。。。。。。。。。。。。。。

/***********键盘输入头文件程序0x08 //显示关

#define LCD_CURSOR_ON 0x0A //光标显示 #define LCD_CURSOR_OFF 0x08 //光标不显示

********/ //*.h file

#ifndef __SHURU_H__ #define __SHURU_H__

bit pkey(); //判断有没有键按下 unsigned char kbscan(void); //键盘扫描

void input(void); //号码输入 void delay(void); //消抖动 extern unsigned char key; #endif

/*------------------------------------------------- LCD1602.H文件 LCD1602的一些命令定义--------------------------------------------------*/ #ifndef __LCD_H__ #define __LCD_H__

#define

LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位

//输入方式设置 #define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一

#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一 #define

LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动

//设置显示、光标及闪烁开、关

#define LCD_DISPLAY_ON 0x0C //显示开 #define LCD_DISPLAY_OFF #define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁

#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁

//光标、画面移动,不影响DDRAM #define

LCD_LEFT_MOVE

0x18 //LCD显示左移一位 #define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位 #define LCD_CURSOR_LEFT_MOVE

0x10 //光标左移一位

#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位

//工作方式设置

#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示 #define LCD_DISPLAY_SINGLE_LINE

0x30 //单行显示

void LCD_cls(void);

void LCD_write_data(unsigned char); void LCD_initial(void);

void LCD_set_position(unsigned char); void LCD_prints(unsigned char *); void LCD_printc(unsigned char); #endif

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 /*-------主文件设置-----------------*/

#include\

#include\

#include\

char code tab[4][4]={

{'1','4','7','#'},{'2','5','8','0'},

{'3','6','9','*'},{'A','B','C','D'}}; //0到F的 16 个键植

void delay(unsigned char a) {

unsigned char i; while(a--) for(i=100;i>0;i--)

;

}

char kbscan() //键盘扫描 {

unsigned char hang,lie,key;

if(P3!=0x0f) delay(5); if(P3!=0x0f) {

switch(P3&0x0f) {

case 0x0e:lie=0;break; case 0x0d:lie=1;break; case 0x0b:lie=2;break;

case 7:lie=3;break;

} P3=0xf0; P3=0xf0;

switch(P3&0xf0)

{ case 0xe0:hang=0;break; case 0xd0:hang=1;break; case 0xb0:hang=2;break; case 0x70:hang=3;break;

}

P3=0x0f;

while(P3!=0x0f);

key=tab[hang][lie];

} else key=0; return (key); }

void main()

{

unsigned char temp;

LCD_initial();

LCD_prints(\初始化显示 P3=0x0f; P0=0xff; while(1) {

temp=kbscan();

if(temp!=0) { P0=temp;

LCD_set_position(0x40); LCD_printc(temp); }

}

}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 /*-------------------------------------------------LCD1602.C文件 LCD1602的函数--------------------------------------------------*/ #include \#include \

void LCD_check_busy(void)//检测LCD状态 {

while(1) {

LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_DATA=0xff; LCD_EN=1; if(!LCD_BUSY)break; } LCD_EN=0; }

void LCD_cls(void) //LCD清屏 {

LCD_check_busy(); LCD_RS=0;

LCD_RW=0; LCD_DATA=1; LCD_EN=1; LCD_EN=0; }

void LCD_write_instruction(unsigned char //LCD光标归位

{

LCD_write_instruction(LCD_GO_HOME); }

void LCD_printc(unsigned char lcd_data) //输出一个字符到LCD {

LCD_instruction) //写指令到LCD {

LCD_check_busy(); LCD_RS=0; LCD_RW=0;

LCD_DATA=LCD_instruction; LCD_EN=1; LCD_EN=0; }

void LCD_write_data(unsigned char LCD_data) //输出一字节数据到LCD {

LCD_check_busy(); LCD_RS=1; LCD_RW=0;

LCD_DATA=LCD_data; LCD_EN=1; LCD_EN=0; }

void LCD_set_position(unsigned char x) //LCD光标定位到x处 {

LCD_write_instruction(0x80+x); } /* void

LCD_go_home(void)

/*-------------------------------------------------Input.C文件函数实现键盘扫描的输入量检测----------------------------------*/ #include

LCD_write_data(lcd_data); }

void LCD_prints(unsigned char *lcd_string) //输出一个字符串到LCD { unsigned char i=0;

while(lcd_string[i]!=0x00) {

LCD_write_data(lcd_string[i]); i++; } }

Void LCD_initial(void) //初始化LCD {

LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);

LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);

LCD_write_instruction(LCD_DISPLAY_DOUBLE _LINE);

LCD_cls(); }

unsigned char code

tab[4][4]={{'1','4','7','#'},

{'2','5','8','0'},

{'3','6','9','*'},

char kbscan() //键盘扫描 { unsigned char hang,lie; if(P3!=0x0f) delay(5); if(P3!=0x0f)

{

switch(P3&0xf0)

case 2:lie=1;break; case 4:lie=2;break; case 8:lie=3;break; }

{

{'A','B','C','D'}}; //0到F的16个键植 void delay(unsigned char a) {

unsigned char i; while(a--) }

case 0x10:hang=0;break; case 0x20:hang=1;break;

case 0x40:hang=2;break; case 0x80:hang=3;break;

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

;

} P3=0xf0; P3=0xf0; switch(P3&0x0f) {

case 1:lie=0;break;

P3=0x0f;

while(P3!=0x0f);

return (tab[hang][lie]);

} return 0; }

⑤结果分析:图中为按下键盘8时的显示,其上面的Output为初始化时变设置的输出,可以将其改为其他字符或者去掉不要。本次实验用LCD代替数码管进行显示,提高了实验难度的同时,也使自己在做题过程中得到了许多。

5.3定时器/计数器实验

5.3.1定时器控制LED灯

1、实验内容

由单片机内部定时器1,按方式1工作,即作为16位定时器使用每0.05秒钟T1溢出中断一次。P1口的P1.0-P1.7分别接八个发光二极管。编写程序模拟时序控制装置。开机后第一秒钟L1,L3亮,第二秒钟L2,L4亮,第三秒钟L5,L7亮,第四秒钟L6,L8亮,第五秒钟L1,L3,L5,L7亮,第六秒钟L2,L4,L6,L8亮,第七秒钟八个LED灯全亮,第八秒钟全灭,以后又从头开始,L1,L3亮,然后L2,L4亮??一直循环下去。 2、实验程序设计及硬件实现

①方案设计:本实验较为简单,利用单片机的计数与定时功能共同实现彩灯循环。流水灯的八个发光二极管负极通过电阻接在单片机的P1口上,正极接+5V电压,当给 P1输入低电平时发光二极管发光,流发光,当程序运行时,给P1口需要发光的口送入低电平,使发光二极管能轮流闪烁发光。此设计使用静态,从而程

序简单,显示稳定,线路不易出错,但缺点是但用单片机的I/O多。 ②实验流程图:

开始 初始化 设置计数R0=0 设置计时器模式 开启计时器 开启中断允许 等待1秒中断 N 中断到? Y 由R0的值转至相应程序段控制彩灯的亮灭 R0是7的话则令R0=0 否则,R0+1 中断溢出标志清零 图 4-7 LED彩灯循环显示程序流程图③程序清单: MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#80H SETBTR0 ;启动定时器 SETBET0 ;允许T0中断 SETBEA ;允许CPU中断 SJMP $

;等待中断

SERVE: MOV TH0,#3CH ;重新置数 MOV TL0,#80H DJNZ B,L

;1秒

MOV

B,#20

CJNER0,#0,L1 MOV P1,#00000101B ;R0=0, 灯1灯3亮 INC R0

LJMP L L1: CJNER0,#1,L2

MOV P1,#00001010B

;R0=1,灯2、4

亮 INC

R0

LJMP L

L2:

CJNER0,#2,L3

MOV P1,#50H

;R0=2,灯5灯7

INC R0

LJMP L L3:

CJNER0,#3,L4

MOV P1,#0A0H;R0=3,灯6灯8亮

INC R0 LJMP L

L4: CJNER0,#4,L5

MOV P1,#55H ;R0=4,灯1灯3亮 INC R0 LJMP L

L5: CJNER0,#5,L6

MOV P1,#0AAH ;R0=5,灯2,4,6,8

INC R0 LJMP L;时间到,判断哪个灯亮 L6: CJNER0,#6,L7 MOV P1,#0FFH ;R0=6,灯全亮 INC R0 LJMP L

L7: MOV P1,#00H ;R0=7,灯全灭 MOV R0,#0 ;R0清零,一下循环计数 LJMP L L:CLR TF0 ;中断溢出标志清零

RETI

;中断返回

END

④硬件连线

图 5-8 LED彩灯循环显示Proteus电路图

⑤结果分析:彩灯控制,通过对延时程序时间大小进行修改可以改变灯流转的快慢。

5.4 A/D、D/A转换实验

5.4.1 小键盘指定波形输出

1、 实验内容

小键盘给定(并显示工作状态),选择信号源输出波形类型(D/A转换方式),经过A/D采样后,将采样数据用LED灯,显示当前模拟信号值大小及变化状态。 2、实验程序设计及硬件实现

①原理阐述:单片机与DAC0832接口有直通方式、单缓冲方式和双缓冲三种方式。直通工作方式不能直接与系统的数据总线连接,需要另加锁存器,而单缓冲方式对于只有一路模拟量输出或者虽有多路模拟量但并不要求输出同步的情况,可以采用单缓冲方式。本实验正属于此类情况,选择单缓冲方式。

②方案设计与论证

选用DAC0832作为DA转换芯片单缓冲工作方式,功放选择U3:A, DAC0832的数据端D0~D0与单片机的P0口相连。这里不采用4*4键盘,而是用四个选择键按钮代替小键盘,用于选择三角波、方波、正弦波三种波形选择,将其通过P2口作为输入。9C51单片机用来执行某一波形发生程序,向D/A转换器的输入端发送数据,将其转化成模拟量,并通过运算放大器调节波形的幅值,而在输出端得到所需的波形。P2.0所接按键为产生“三角波”键;P1.1所接按键为产生“锯齿波”键;P2.2所接按键为产生“方波”按键,P2.3所接按键为产生“正弦波”按键。并用P0口外接LED灯,实时显示模拟量电压的大小。硬件如图5-9。

图 5-9 D/A转换之波形发生实验Proteus仿真电路图

③实验流程图

开始 初始化 N 扫描按键状态 key2=0?Key3=0? N Key4=0? N Key1=0? Y 锯齿波输出 Y 方波输出 Y 正弦波输出 Y 三角波输出 继续扫描按键 继续扫描按键状态 继续扫描按键 继续扫描按键

图 4-10 D/A转换之波形发生器流程图

④实验程序:

/*****************************/ TABLE:

********************/ DAC0832 EQU 00H ORG 0000H LJMP MAIN ORG 0030H

MAIN: MOV P2,#0FFH

JNB P2.0,TGUL ; P2.1=0三角波输出 JNB P2.1,JUCHI ; P2.1=0矩形波输出 JNB P2.2,SQUARE ; P2.2=0方波输出 JNB P2.3, SIN ;P2.3=0正弦波输 TGUL: MOV R0,#0ffH ;产生三角波 MOV A,#00H MOV DPTR,#DAC0832 CC: MOVX @DPTR,A NOP NOP NOP

DB

80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H DB

0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFH DB

0FFH,0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E3H DB

0DAH,0D1H,0C7H,0BCH,0B1H,0A5H,99H,8CH DB 80H,73H,67H,5BH,4FH,43H,39H,2EH DB 25H,1DH,15H,0FH, 09H,05H,02H,00H DB 00H,00H,02H,05H,09H, 0EH,15H,1CH DB 25H,2EH,38H,43H,4EH, 5AH,66H,73H /**************主程序

INC A

CJNE A,#0FFH,CC DD: MOVX @DPTR,A MOV P1,A ;模拟量输出 NOP NOP NOP

DEC A

CJNE A,#00H,DD DJNZ R0,CC LJMP

MAIN ;返回主程序

/*****方波程序************/ SQUARE: MOV DPTR,#DAC0832 LP2: MOV A,#0FFH MOVX MOV ACALL MOV MOVX MOV ACALL

@DPTR,A

P1,A ;模拟量输出 DELAY A,#00H @DPTR,A P1.A DELAY

MOV P1,A

MOV A,R1

ADD A,#4 ;步长为四 MOV R1,A NOP

JNZ JL1 LJMP MAIN

/***************SIN: MOV MOV MOVC MOV MOVX MOV NOP DJNZ

R1,#63H

*********************/ MOV DPTA,#TABLE

A,R1

A,@A+DPTR ;查正弦码 DPTR,#DAC0832 @DPTR,A ;输出 P1,A R1,SIN

LJMP MAIN

/********延时程序*********/ DELAY: MOV R0,#10H MOV R1,#05FH L1: DJNZ R1,L1 NOP

MOV DJNZ RET END

R1,#0FFH R0,L1

AJMP LP2 LJMP MAIN

/**********************************/ JUCHI: MOV R1,#0 JL1:MOV A,R1 MOV DPTR,#DAC0832 MOVX @DPTR,A ;输出

锯齿波

⑤实验结果及分析:

本实验结果如图5-11(这里仅给出三角波与锯齿波部分)

图中右边的灯泡实时显示模拟量的大小。仿真示波器的熟练跳整及使用是完成能否完成这个实验的重点。示波器的扫描时间,幅值的大小均需要耐心调整,直至出现波形为止。当你打开示波器显示波形的窗口时很有可能并不是最佳显示状态,甚至连所测信号的波形都看不到,这就牵涉到示波器的调整问题,其调整方法和使用真实的示波器几乎完全一样。弄清楚示波器上各个按钮的作用后细调即可。

实验中,延时程序时间长短的设置也是本实验的一个重点,如果时间过短,波形变化太快,示波器采集显示时可能看不到,太慢,变化也较慢,应适当调整。

本次正弦波,采用的正弦波码较为简单,所生成的正弦波精度不够,如果需要更高级别的精度,可以将正弦波码。

图 5-11 D/A转换之波形发生实验Proteus结果(三角波部分)

图 5-12 D/A转换之波形发生实验Proteus结果(锯齿波部分)

5.5串行通讯实验

5.5.1.单片机与PC通信

1. 实验内容

利用单片机实验系统,实现与PC机通讯。功能要求:将从实验系统键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入,的字符(0-F)显示到单片机实验系统的数码管上。

2. 实验原理

ST公司提供的SSTEasyIAP11F软件,为SST单片机的用户提供了通过IAP技术把用户应用程序下载到单片机的程序存储器或者从单片机的程序存储器读出用户应用程序的方法。当单片机内部的系统程序为启动加载程序时,用户可以通过SSTEasyIAP11F 软件,将得到的目标代码(*.HEX)下载到单片机内部的FLASH中,系统复位后,单片机便会全速执行用户程序。目标代码下载的具体步骤如下:

a、运行软件SSTEasyIAP11F, b、点击‘Detect Chip/RS 232’

c、点击“Detect Target MCU for Firmware1.1F and RS232 Config.”选项出现芯片选择和存储器模式窗口。芯片类型选择“SST89E554RC”,存储器模式选择“Internal Memory”,选择完后点击“OK”按钮。然后可以看到RS232 配置与目标检测窗口。

d、直接点击“Detect MCU”按钮,会弹出 相关信息,点击“确定”按钮后按系统的复位键来复位MCU 以检测波特率和芯片。

e、检测成功后,可以看到检测后的信息。在IAP Function功能框中选择Download,以下载目标代码。随后会弹出密码校验对话框,直接点击“OK” 即可。 f、弹出下载对话框,点击按钮“…”来选择要下载的文件,下载完成后,可以脱机运行程序了。

在SST 单片机内部固化了Soft ICE后,便可以实现51系统板与Keil C51集成开发环境的联机调试。要求SoftICE554.hex文件与SSTEasyIAP11F 软件在同一目录下。具体步骤如下:

a、 同下载目标代码到单片机的步骤1~5,使用SSTEasyIAP11F软件必须先检测MCU。

b、点击菜单栏的“Soft ICE”,弹出下拉菜单“Download Soft ICE”,然后点击选项。 c、同样会弹出密码校验对话框,直接按“OK”,信息提示这将会删除IAP引导程序。

d、选择“是”,开始下载Soft ICE,下载完成会提示完成信息。

e、完成Soft ICE 下载,便可以开始与Keil C51联机调试了。当需要将目标代码*.Hex文件下载到单片机脱机运行而系统程序还是Soft ICE时,就需要通过Convert_to_BSLx554.txt文件将系统程序从SoftIC切换回IAP引导加载程序。具体操作步骤如下:

a、启动Keil C51进入联机调试状态。

b、得到Convert_to_BSLx554.txt文件的路径,在输出窗口的Command页的命令行内输 入“Include C:\\Keil\\Convert_to_BSLx554.txt”命令后回车。 c、耐心等待(这需要较长的时间),当出现如图4-12所示信息时表示已成功的

从SoftICE 返回IAP 引导程序了。

d、可以运行SSTEasyIAP11F 软件,检测MCU,以确保IAP引导程序写入成功。然后便可以下载目标代码了。

a、创建Keil C51应用程序。运行Keil C51软件,进入Keil C51集成开发环境;b、选择工具栏的project喧嚣,选择NewProject命令,建立一个新的μVision2工程。选择工程目录并输入文件名后,单击保存。3、工程建立完毕后,μVision2会马上弹出器件选择窗口。器件选择的目的是告诉μVision2使用的80C51芯片的型号是哪一个公司的哪一个型号,不同型号的51芯片内部资源是不同的。此时选择SST公司的SST89E554RC。另外,可以选择Project下拉菜单中的“Select Device for Target ‘Target 1’”命令来弹出器件选择对话框。4、到此,建立好一个空白工程,现在需要人工为工程添加程序文件,如果还没有程序文件则必须建立它。选择工具栏的File选项,在弹出的下拉菜单中选择New目录,或点击

第6章 试验心得

本次试验分为软件部分与硬件部分,软件部分实验时加强了以前微机所学的汇编语言,更掌握了C语言在单片机中的应用。硬件部分更是将理论应用于实际,我更好的懂的了部分单片机的内部系统结构、外围芯片的运行原理及应用方法。要想设计一个系统首先需要要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,必须进行反复修改调试。

单片机的汇编语言是和单片机紧密相关的语言,且和其硬件密切相关的。要想知道自己的汇编程序是否正确,是否能真正的在机器上运行起来,不仅仅只是进行模拟调试,还得运行到单片机中实时监测。所用通过这次单片机实习,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会

了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。

本文来源:https://www.bwwdw.com/article/n2nt.html

Top