单片机原理及应用实验报告
一、选题意义. 2
二、单片机AT89C52结构介绍. 2
三、实验内容. 3
四、实验步骤. 3
五、在uvision环境下软件程序设计. 3
六、Proteus仿真. 6
七、实验器件. 8
八、焊接电路实物图. 9
九、实验心得. 9
一、选题意义
1. 熟悉使用AT89C52单片机进行系统设计;
2. 通过对单片机工作原理的深入理解,运用所学知识解决实际问题;
3. 通过实际系统的设计,加深对单片机的微计算机系统设计的理解和掌握。
二、单片机AT89C52结构介绍
AT89C52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,256×8bit内部RAM,低功耗空闲和省电模式,32个双向I/O口,3个16位可编程定时/计数器,全双工UART串行中断口线,2个外部中断源。图2-2是AT89C52引脚图。
三、实验内容
本实验利用单片机的计数器原理,通过采用protuas仿真软件来模拟实现。利用AT89C52单片机芯片实现计数功能(0~10)并显示当前计数值,还能够实现秒表的启动/暂停,复位功能。
四、实验步骤
1、先确定好设计的内容,用protuas设计电路图。
2、编写代码,编译并调试正确。将生成的.hex文件加载到单片机中,运行电路并调试使电路功能正确。
3、设计完成后,制作计数器实物,并使得运行正确。
五、在uvision环境下软件程序设计
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P3^7;
uchar i, Second_Counts, Key_Flag_Idx;
bit Key_State;
char DSY_CODE[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
// delay
void DelayMS(uint time)
{
while(time--)
{
uchar t;
for(t=0;t<120;t++);
}
}
// handle button events ,处理按键事件
void Key_Event_Handle()
{
if(Key_State == 0) //Trigger key function when key pressed
{
Key_Flag_Idx = (Key_Flag_Idx + 1) % 3;
switch(Key_Flag_Idx)
{
case 1: EA = 1;ET0 = 1; TR0 = 1; break;
case 2: EA = 0;ET0 = 0; TR0 = 0; break;
case 0: P0 = 0x3f; P2 = 0x3f;i = 0;Second_Counts = 0;
}
}
}
// main ,主程序
void main()
{
P0 = 0x3f; //initial state of LED 显示00
P2 = 0x3f;
i = 0;
Second_Counts = 0;
Key_Flag_Idx = 0; //times of the press (Firstr, second, third respectively stand for different meanings)按键次数
Key_State = 1; // 按键状态
TMOD = 0x01; //T0 work in mode 1 定时器0方式1
TH0 = (65536 - 50000) / 256; //Set 50ms timer 定时器0:50ms
TL0 = (65536 - 50000) % 256;
while(1)
{
if(Key_State != K1) //Key is pressed or released
{
DelayMS(10);
Key_State = K1; //update key state
Key_Event_Handle();
}
}
}
// T0 interrupt function
void DSY_Refresh() interrupt 1
{
TH0 = (65536 - 50000) / 256; //恢复定时器0初值
TL0 = (65536 - 50000) % 256;
if(++i == 2) //100ms //50ms*2=0.1s转换状态
{
i = 0;
Second_Counts++;
P0 = DSY_CODE[Second_Counts / 10];
P2 = DSY_CODE[Second_Counts % 10];
if(Second_Counts == 100)
Second_Counts = 0; //满100(10s)后显示00
}
}
六、Proteus仿真
1、初始值
2、按下第一次按钮,记时截图
3、按下第二次按钮,计数器停止
4、按下第三次按钮,数值清零初始
七、实验器件
八、焊接电路实物图
九、实验心得
通过这次试验,让我对单片机有了新的认识。在原有的理论基础上又增加了不少实践经验。
这次试验最重要的是培养我们的创新意识和动手能力,再选题方面我们小组经过激烈的讨论,最终选定一个方向:通过单片机来实现0-9简单的计时作用。
这是我第一次做单片机实验,说起来有一些紧张和新奇。在此之前我并没有接触过单片机,我本以为与之前的光学实验及其它实验差不多,可我进到实验室之后,我就改变了这个看法。
通过组内人员的团结协作,最终快速效率的完成了这次试验的目标,由此可以说明合作的力量是不可小视的。
第二篇:单片机实验报告
单片机实验报告
专业班级: 11网络
学 号: 201127020104
姓 名: 宋赫
指导老师: 单国全
目 录
一、实验目的及要求 ………………………………………………………1
二、实验基本内容 …………………………………………………………1
三、实验设备 ………………………………………………………………3
四、实验设计思想和结果分析 ………………………………………………6
4.1清零程序与拆字程序设计 ……………………………………………6
4.2拼字程序与数据传送程序 ……………………………………………7
4.3 排序程序与散转程序 …………………………………………………10
4.4 数字量输入输出实验 …………………………………………………15
4.5定时器/计数器实验 …………………………………………………17
4.6 A/D、D/A转换实验 ……………………………………………………20
4.7 串行通讯实验 …………………………………………………………25
五、结束语 ………………………………………………………………… 29
一、 实验目的及要求:
1、学习Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试
与脱机运行间的切换方法;
2、熟悉TD-51单片机系统板及实验系统的结构及使用;
3、进行MCS51单片机指令系统软件编程设计与硬件接口功能设计;
4、学习并掌握Keil C51与Proteus仿真软件联机进行单片机接口电路的设
计与编程调试;
5、完成指定MCS51单片机综合设计题
二、实验基本内容(TD-51单片机实验系统实现)
实验一 清零程序与拆字程序设计
根据实验指导书之“第二章 单片机原理实验”(P17~P23页)内容,熟悉实验环境及方法,完成思考题1、2(P23)基础实验项目。
实验二 拼字程序与数据传送程序设计
汇编语言完成实验指导书P24思考题3、4题的基础实验项目。
实验三 排序程序与散转程序设计
汇编语言完成实验指导书P24思考题5、6题的基础实验项目。
实验四 数字量输入输出实验
基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“3.1 数字量输入输出实验”基本实验项目(P36),。
提高部分:(任选一题)
题目一:LED交通灯控制(使用8255接口芯片)
要求:使用汇编语言编程,功能为:通过开关实现LED灯工作方式即时控制,完成LED交通灯的开关控制显示功能和LED交通灯自动循环显示功能。
题目二:LED灯控制(使用8255接口芯片)
要求:使用汇编语言编程,功能为:通过KK1实现LED灯工作方式即时控制,完成LED开关控制显示和LED灯左循环、右循环、间隔闪烁功能。
题目三:键盘扫描与数码管显示设计
要求:阅读、验证P69上的C语言参考程序功能。用汇编语言完成编程与功能调试。
实验五 定时器/计数器实验
基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“3.3 定时/计数器实验”基本实验项目(P40)。
提高部分:(任选一题完成)
题目一:定时器控制LED灯
要求:由单片机内部定时器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亮……一直循环下去。
题目二:计数器实验
要求:单片机内部定时计数器,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。使用T1作定时器,50ms中断一次,看T0内每0.50来了多少脉冲,将其数值按二进制在LED灯上显示出来,5秒后再次测试。
题目三:急救车与交通灯(外部中断实验)
要求:完成交通灯基本功能基础上,当有急救车到达时,两向交通信号为全红,以便让急救车通过。假定急救车通过路口时间为10秒,急救车通过后,交通灯恢复中断前状态。本实验题以按键为中断申请,表示有急救车通过。
实验六 A/D、D/A转换实验
基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“4.3 A/D转换实验”项目(P64)和“4.4 D/A转换实验”项目(P67)。
提高部分:(要求:Proteus环境下完成)
小键盘给定(并显示工作状态),选择信号源输出波形类型(D/A转换方式),经过A/D采样后,将采样数据用LED灯,显示当前模拟信号值大小及变化状态。
实验七 串行通讯实验
基本部分:阅读、调试C语言程序功能。使用汇编语言编程,完成实验指导书之“3.7 串口通讯实验”项目。(要求:实验仪器上完成)
提高部分:(要求:Proteus环境下完成)
题目一:利用单片机实验系统,实现与PC机通讯。功能要求:将从实验系统键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到单片机实验系统的数码管上。
题目二:进行实验六、实验七实验内容综合。
三、 实验设备
软件设备:KEIL uv2, PROTEUS7.4
硬件设备:PC机,TD-51系统板(包括SST89E554RC单片机一片、串行通信线、接口等)
1、TD-51系统板
1 系统构成
TD-51 系统板为开放的最小单片机系统,采用具有在系统可编程和在应用可编程技术的增强型51 单片机,单片机内置仿真程序,可以实现调试、仿真功能,配合TD 系列微机接口教学 实验平台可开展单片机原理及应用的实验教学。
2 系统功能特点
1. 取代硬件仿真器的增强型单型
系统采用具有在系统可编程(ISP)和在应用可编程(IAP)技术的增强型51 单片机,单片机内置仿真程序,完全取代传统的硬件仿真器和编程器。这种先进的单片机将仿真系统和应用系统合二为一,大大降低了应用开发成本,极大地提高了研发效率。把单片机的仿真开发和应用设计提高到一个崭新的技术领域。
2. 先进的集成开发调试调
使用业界著名的Keil C51 集成开发环境作为实验设计、调试的工具。Keil C51 提供了强大的调试功能,可单步、断点、全速运行程序,可观察寄存器区、ROM 变量区、RAM 变量区等的内容。支持汇编语言和C 语言的源语言调试。
3. 灵活的组合组
采用开放的系统板结构,可以灵活地配合各型号接口实验平台开展单片机的应用教学。
4. 丰富的实验内容
提供了丰富的原理及接口应用实验。配合接口实验平台可完成数字量输入/输出、中断、定时器/计数器、看门狗、低功耗、PCA、串口通讯、静态存储器、FLASH、A/D、D/A、键盘及数码显示、电子音响、点阵LED、LCD、步进电机、直流电机、温度控制等实验内容。
2、SST89E554RC简介
TD-51 系统板上提供了一片SST89E554RC,该器件是SST 公司推出的8 位微控制器FlashFlex51 家族中的一员,具有如下特征:
·\u19982X8051 兼容,嵌入SuperFlash 存储器
- 软件完全兼容
- 开发工具兼容
- 引脚全兼容
·\u24037X作电压5V,工作时钟0~40MHz
·1Kbyte 内部RAM
·\u20004X块SuperFlash EEPROM,主块32Kbyte,从块8Kbyte,扇区为128Byte
·\u26377X三个高电流驱动端口(每个16mA)
·\u19977X个16 位的定时器/计数器
·\u20840X双工、增强型UART
- 帧错误检测
- 自动地址识别
·\u20843X个中断源,四级优先级
·\u21487X编程看门狗定时器(WDT)
·\u21487X编程计数阵列(PCA)
·\u21452XDPTR 寄存器
·\u20302XEMI 模式(可禁止ALE)
·SPI 串行接口
·\u26631X准每周期12 个时钟,器件提供选项可使速度倍增,达到每周期6 个时钟
·\u20302X功耗模式
- 掉电模式,可由外部中断唤醒
- 空闲模式
SST89E554RC 的功能框图如图1-2-1 所示,外部引脚如图1-2-2 所示。
SST89E554RC 的特殊功能寄存器如表1-2-1 所列。
四、实验设计思想与结果分析
实验一到实验四为软件编程实验,需要熟练掌握KEIL uv2编程工具的使用,通过编写程序实现实验要求。实验四到实验八为硬件接口实验,需要利用TD-51系统板,通过KEIL uv2编写好程序,下载到所给的SST89E554RC单片机中,按原理接好硬件接线图,完成实验要求。
实验一 清零程序与拆字程序设计
实验调试步骤及结果分析:
(1)编写好实验程序后,采用ISP模式调试。
(2)运行程序,使用Keil51模拟器中的虚拟存储器监视内容变化。(访问片外存储器,用“X:+地址”的格式)。
(3)在清零实验中。用单步跳过的调试方式。7000H-7FFFH中内容先被写入0FFH;然后全部清零。
(4)在拆子程序实验中,单步进入调试,先在7000H中,写入1FH,首先送低位0FH至7001H,然后送高位1H至7002H。
程序流程图:
清零程序流程图 拆字程序流程图
程序清单:
清零程序:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV A, #00H
MOV DPTR,#7000H ;赋给首地址
MOV R1,#100H ;循环次数,完成对7000H-70FFH的置一
MOV R2, #10H
LOOP1: MOVX @DPTR,A
INC DPTR
DJNZ R1,LOOP1
DJNZ R2,LOOP1 ; 因为都是先减一之后再做比较,所以0FFH、0FH个数要100H、10H次
SJMP $
END
拆字程序:
ORG 0000H
LJMP MAIN
ORG 1000H
MAIN: MOV DPTR,#7000H
MOVX A,@DPTR ;赋值
MOV R0,A
ANL A,#0F0H ;得到高四位
SWAP A
INC DPTR
MOVX @DPTR,A ;高位给7001H
MOV A,R0
ANL A,#0FH ;得到低四位
INC DPTR
MOVX @DPTR,A ;低位给7002H
SJMP $
END
实验二 拼字程序与数据传送程序设计
实验步骤及结果分析:
(1)编写好实验程序后,采用ISP模式调试。
(2)拼字程序里,将两个字节内容分别存为12H,34H。低位相拼,结果是24H。
(3)运行程序,使用Keil51模拟器中的虚拟存储器监视内容变化。(访问片外存储器,用“X:+地址”的格式)。
程序流程图:
拼字程序流程图 数据传输程序流程图
程序清单:
拼字程序
ORG 0000H
LJMP MAIN3
ORG 1000H
MAIN3: MOV DPTR,#7000H
MOVX A,@DPTR ;原值给A
ANL A,#0FH ;取低四位
SWAP A ;将原低四位移到高四位
MOV B,A
INC DPTR
MOVX A,@DPTR ;再取7001H的值
ANL A,#0FH ;取低四位
ADD A,B
INC DPTR
MOVX @DPTR,A ;获得结果
SJMP $
END
数据传输程序
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV R2,#10H ;源RAM区的第一个地址
MOV R3,#19H ;源RAM区的第二个地址
MOV R4,#22H ;目的RAM区的第一个地址
MOV R5,#2BH ;目的RAM区的第二个地址
MOV R6,#02H ;第一次传输的字节数据个数
MOV R7,#03H ;第二次传输的字节数据个数
L1: MOV B,R2
MOV R0,B
MOV A,@R0
MOV B,R4
MOV R1,B
MOV @R1,A
INC R2
INC R4
DJNZ R6,L1 ;完成第一路的数据传输
L2: MOV B,R3
MOV R0,B
MOV A,@R0
MOV B,R5
MOV R1,B
MOV @R1,A
INC R3
INC R5
DJNZ R7,L2 ;完成整个的数据传输
SJMP $
END
结果分析:在拼字程序中,用了SWAP A,方便实现了数据高四位与低四位的交换。数据传送实验中,其重点是对地址变化的把握。将初始地址与及传送地址都用加1指令实现地址变化。
实验三 排序程序与散转程序设计
实验步骤及结果分析:
排序实验:
(1)编写实验程序,编译、链接无误后联机调试;
(2)为 30H~39H 赋初值,如:在命令行中键入 E CHAR D:30H=9, 11H, 5, 31H, 20H, 16H,1, 1AH, 3FH, 8 后回车,可将这 10 个数写入 30H~39H 中;
(3)将光标移到语句行命令,将程序运行到该行;
(4)查看存储器窗口中 30H~39H 中的内容,验证程序功能;
(5)重新为 30H~39H 单元赋值,反复运行实验程序,验证程序的正确性。
实验流程图
程序清单:
散转程序:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN : MOV A,#01H
MOV R2,A
RL A
ADD A,R2
MOV DPTR,#PTAB
JMP @A+DPTR
PTAB: LJMP PM0
LJMP PM1
LJMP PM2
LJMP PM3
PM0: [程序体0]
PM1: [程序体1]
PM2: [程序体2]
PM3: [程序体3]
SJMP $
END
冒泡排序子程序:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV R0,#10H ;初始地址
MOV R7,#04H ;外循环次数(参与比较的数的个数-1)
ACALL MAOP
SJMP $
MAOP:
L1: MOV A,R0 ;赋给初始地址
MOV R1,A
INC R1 ;取第二个数的地址
MOV A,R7
MOV R6,A
L2: MOV A,@R0
CLR C
SUBB A,@R1 ;两数进行比较
JC L3 ;前数小于后数则保持位置不变
MOV A,@R0 ;否则,交换位置
XCH A,@R1
MOV @R0,A
L3: INC R1
DJNZ R6,L2 ;内循环是否完成
INC R0
DJNZ R7,L1 ;外循环是否完成
RET ;返回主程序
END
实验四 数字量输入输出实验
实验步骤:(1)按图11接好试验线路图,图中圆圈表示不要通过排线连接
(2)编写实验程序,编译链接无误后进入调试状态
(3)运行实验程序,观察实验现象,验证程序正确性
(4)按复位键,结束程序运行,退出调试状态
实验硬件接线图:
程序清单:
基础部分:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN : MOV P1,#0FFH ;初始化
MOV A,P1 ;将输入写进累加器A
SWAP A
ANL A,#0FH
MOV P1,A ;输出显示
LJMP MAIN ;循环不断检测P1口输入端的新状态
SJMP $
END
LED灯控制:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV TMOD, #60H ;设置T1为模式2,外部计数方式
MOV TH1,#0FFH ;T1计数器赋初值
MOV TL1,#0FFH
MOV DPTR,#7300H
MOV A,#80H
MOVX @DPTR,A
MOV DPTR,#7100H
SETB TR1 ;开启计数器
LEFT: MOV R0,#08H ;左循环
MOV A,#01H
A1: MOVX @DPTR,A
LCALL DELAY
RL A
DJNZ R0,A1
JBC TF1,RIGHT ;查询T1溢出标志,TF1=1时转移
JMP LEFT
RIGHT: MOV R0,#08H ;右循环
MOV A,#80H
A2: MOVX @DPTR,A
LCALL DELAY
RR A
DJNZ R0,A2
JBC TF1,SHANSHUO ;查询T1溢出标志,TF1=1时转移
JMP RIGHT
SS: MOV R0,#08H ;闪烁
LP1: MOV A,#55H
MOVX @DPTR,A
LCALL DELAY
MOV A,#0AAH
MOVX @DPTR,A
LCALL DELAY
DJNZ R0,LP1
JBC TF1, LEFT ;查询T1溢出标志,TF1=1时转移
JMP SHANSHUO
DELAY: MOV R1,#0FFH
DEL1: MOV R2,0FFH
DEL2: DJNZ R2, DEL2
DJNZ R1,DEL1
RET
SJMP $
END
结果分析:
基本数字量输入输出实验其重点在于对单片机的准双向口的理解。即在用作输入时,口锁存器必须先写入“1”。而作为输出时则可直接使用。
利用计数器T1外部技术方式,当外部输入脉冲引脚上出现电平负跳变时,T1计数器加一,溢出标志TF1置一,然后改变LED灯亮的方式,同时,将标志位TF1复位,进入下一轮的计数溢出等待。因此,而形成三种亮灯方式的自动循环。若是用开关实现三种方式的亮灯,则需要在最开始和每种亮灯之后通过8255对开关状态进行采集并进行判断。因此事先还要先设置好哪个开关的闭合表示哪种亮灯方式。
实验五 定时器/计数器实验
实验步骤:
(1)编写实验程序,编译、链接后联机调试;
(2)运行实验程序,使用示波器观察 P1.0引脚上的波形并记录周期;
(3)改变计数初值,观察实验现象,验证程序功能。
实验硬件接线图:
1 定时器LED控制PROTEUS仿真接线图
程序流程图:
程序清单:
定时器程序
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP ZD
ORG 0030H ;主程序入口
MAIN: MOV TMOD,#01H ;写入T0控制字, 16位定时方式
MOV TL0, #0B0H ;写入T0定时100毫秒初值
MOV TH0, #3CH
MOV IE, #82H
SETB TR0 ;启动T0
DD: SJMP DD ;循环等待
ZD: CPL P1.0 ;T0中断服务程序,取反P1.0
MOV TL0, #18H ;重装T0定时初值
MOV TH0, #0FCH
RETI
END
LED灯程序:
ORG 0000H
LJMP MAIN
ORG 001BH ;中断地址入口
LJMP SERVE
ORG 0100H
MAIN: MOV SP,#50H ;设置堆栈指针
MOV TMOD, #10H ;定时器T1初始化
MOV TL1,#00H
MOV TH1,#4CH
SETB TR1 ;启动定时器
SETB ET1 ;允许T1中断
SETB EA
MOV DPTR,#TABLE
MOV R0,#00H
MOV R1,#00H
L1: MOV A,R1
MOVC A,@A+DPTR ;选择某秒钟对应的亮灯的方式
MOV P1,A
AJMP L1
SERVE: PUSH ACC ;中断服务程序
INC R0
MOV A,R0
CJNE A,#20,NEXT
MOV R0,#00H
INC R1
MOV A,R1
ANL A,#07H
MOV R1,A
NEXT: POP ACC
RETI
TABLE: DB 0FAH,0F5H,0AFH,05FH,0AAH,55H,00H,0FFH
END
实验六 A/D、D/A转换实验
实验步骤:
(1)按图18 连接实验线路,AD 的时钟线需要与实验平台中的系统总线单元的CLK 相连;
(2)编写实验程序,经编译、链接无误后装入系统,启动调试;
(3)将变量ADV 添加到变量监视窗口中;
(4)在Delay()处行设置断点,使用万用表测量ADJ 端的电压值,计算对应的采样值,然后运行程序;
(5)程序运行到断点处停止运行,查看变量窗口中ADV 的值,与计算的理论值进行比较,看是否一致(可能稍有误差,相差不大);
(6)调节电位器,改变输入电压,比较ADV 与计算值,反复验证程序功能;制表并记录结果。
实验接线图:
1A/D转换实验接线图
2 D/A转换实验接线图
3LED灯PROTEUS仿真接线图
程序流程图:
4A/D转换实验流程图
程序清单:
A/D转换程序
#include "SST89x5x4.h"
#include "Absacc.h"
#define STARTAD XBYTE[0x7F00]
#define ADRESULT XBYTE[0x7F08]
sbit ADBUSY = P3^3;
void Delay()
{
unsigned char i ;
for(i=0; i<100; i++);
}
unsigned char AD0809(void)
{
unsigned char result;
STARTAD = 0; //启动AD
while(ADBUSY == 1);/等待转换结束
Delay();
result = ADRESULT;
return result; //返回转换结果
}
void main(void)
{
unsigned char ADV; //变量
while(1)
{
ADV = AD0809();
Delay(); //设置断点
}
}
D/A转换程序:
#include <Absacc.h>
#define DA XBYTE[0x7FFF]
void main(void)
{
unsigned int i;
while(1)
{
for(i=0; i<255; i++)
DA = i; //写DA
}
}
LED灯程序:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
A0: MOV P1,#0FH
MOV C,90H
JNC FANG
MOV C,91H
MOV DPTR,#7FFFH
MOV A,#00H
MOVX @DPTR,A
JNC JU
MOV C,92H
JNC SAN
JMP A0
FANG: MOV P1,#1FH ;方波
LCALL FANGBO
JMP A0
JU: MOV P1,#2FH ;锯齿波
LCALL JUCHI
JMP A0
SAN: MOV P1,#3FH ;三角波
LCALL SANJIAO
JMP A0
FANGBO: MOV DPTR,#7FFFH
MOV A,#0FFH
MOVX @DPTR,A
LCALL DELAY
MOV A,#00H
MOVX @DPTR,A
LCALL DELAY
RET
JUCHI: MOV DPTR,#7FFFH
MOV A,#00H
A1: MOVX @DPTR,A
LCALL DELAY
INC A
CJNE A,#00H,A1
RET
SANJIAO: MOV DPTR,#7FFFH
MOV A,#00H
A2: MOVX @DPTR,A
LCALL DELAY
INC A
CJNE A,#0FFH,A2
A3: DEC A
LCALL DELAY
MOVX @DPTR,A
CJNE A,#00H,A3
RET
DELAY: MOV R6,#0FH
DEL1: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL1
RET
SJMP $
END
结果分析:A/D实验重点在于采样的时间以及转换精度。首先要考虑采样定理,并且还要保证A/D转换所需的最短时间。另外无论A/D、D/A实验中,参考电压Vref的精度对实验有着巨大的影响。
D/A实验主要是对输出波形的变化监视。三角波的产生原理与锯齿波相同,只需在锯齿波计数达到最大值0FFH时,再逐渐减1减小到00H(锯齿波产生则直接从0重新开始),如此反复。另外对波形影响较大的是保持时间,即实验中的delay()函数决定的延迟时间。
实验七 串行通讯实验
实验步骤:
(1)串口通讯实验电路如图3-7-1 所示;
(2)编写实验程序,经编译、链接无误后启动调试;
(3)进入调试界面,点击命令,打开串口1 监视窗口;
(4)运行实验程序,观察此时有如图3-7-2 所示输出;
(5)阅读1.7 节的内容,首先将系统程序由SoftICE 切换到启动加载程序;
(6)将编译生成的Hex 文件通过SSTEasyIAP11F.EXE 软件下载到单片机内部Flash 中;
(7)复位单片机,打开超级终端或串口调试软件,将端口号及波特率等设置好,观察PC显示,如图3-7-3 和图3-7-4 所示;
(8)实验结束,重新将SoftICE 下载到单片机系统区替换启动加载程序。
实验原理及原理图:
MCS-51 单片机内部的全双工串行接口部分,包含有串行接收器和串行发送器。有两个物理上独立的接收缓冲器和发送缓冲器。接收缓冲器只能读出接收的数据,但不能写入。发送缓冲器只能写入发送的数据,但不能读出。因此可以同时收、发数据,实现全双工通讯。两个缓冲器是特殊功能寄存器SBUF,它们公用地址为99H,SBUF 是不可位寻址的。此外,还有两个寄存器SCON 和PCON 分别用于控制串行口的工作方式以及波特率,定时器T1 可以用作波特率发生器
SST89E554RC 提供了增强型全双工串行接口,具有帧错误检测和自动地址识别的功能。
由于SST89E554RC 的串口用作调试目的,所以Keil C51 软件提供了串口模拟窗口,可以借助此窗口调试串口通讯程序。也可以将程序编译生成目标代码(.HEX),脱机运行。
实验接线图:
1串行通讯仿真接线图
程序清单:
AJMP MAIN
ORG 0023H
AJMP URT
ORG 0030H
MAIN: MOV P1,#00H
LCALL URTINIT
START: MOV P0,#0FH
MOV A,P0
CPL A
ANL A,#0FH
JZ START
LCALL DELAY
MOV P0,#0FH
MOV A,P0
ANL A,#0FH
MOV R7,A
MOV P0,#0F0H
MOV A,P0
ANL A,#0F0H
ORL A,R7
CJNE A,#0EEH,K1
MOV A,#30H
MOV SBUF,A
JNB TI,$
CLR TI
K1: CJNE A,#0DEH,K2
MOV A,#31H
MOV SBUF,A
JNB TI,$
CLR TI
K2: CJNE A,#0BEH,K3
MOV A,#39H
MOV SBUF,A
JNB TI,$
CLR TI
KA: CJNE A,#0BBH,KB MOV A,#32H
MOV SBUF,A
JNB TI,$
CLR TI
K3: CJNE A,#7EH,K4
MOV A,#33H
MOV SBUF,A
JNB TI,$
CLR TI
K4: CJNE A,#0EDH,K5
MOV A,#34H
MOV SBUF,A
JNB TI,$
CLR TI
K5: CJNE A,#0DDH,K6
MOV A,#35H
MOV SBUF,A
JNB TI,$
CLR TI
K6: CJNE A,#0BDH,K7
MOV A,#36H
MOV SBUF,A
JNB TI,$
CLR TI
K7: CJNE A,#7DH,K8
MOV A,#37H
MOV SBUF,A
JNB TI,$
CLR TI
K8: CJNE A,#0EBH,K9
MOV A,#38H
MOV SBUF,A
JNB TI,$
CLR TI
K9: CJNE A,#0DBH,KA
MOV A,#41H
MOV SBUF,A
JNB TI,$
CLR TI
KB: CJNE A,#7BH,KC
MOV A,#42H
MOV SBUF,A
JNB TI,$
CLR TI
KC: CJNE A,#0E7H,KD
MOV A,#43H
MOV SBUF,A
JNB TI,$
CLR TI
KD: CJNE A,#0D7H,KE
MOV A,#44H
MOV SBUF,A
JNB TI,$
CLR TI
KE: CJNE A,#0B7H,KF
MOV A,#45H
MOV SBUF,A
JNB TI,$
CLR TI
KF: CJNE A,#77H,K0
MOV A,#46H
MOV SBUF,A
JNB TI,$
CLR TI
K0: LJMP START
URTINIT:
MOV SCON,#50H ;设置成串口工作方式在8位URT
MOV TMOD,#20H ;设置T1为可重装8位定时器
MOV TL1,#0FDH ;256-FOSC/BTL/32/12
MOV TH1,#0FDH
SETB TR1 ;开启定时器
SETB ES ;开启串口中断
SETB EA ;开总中断
RET
URT:
CLR C
MOV A,SBUF ;接收到数据后将数据返回
MOV P1,A
NEXT1:CLR RI ;清接收中断标志
RETI
DELAY: MOV R6,#0ffh
DEL1: MOV R5,#0ffh
DJNZ R5,$
DJNZ R6,DEL1
RET
END
结果分析:串行总线是单片机的特色。本实验通过两种方式验证的串口的通信。ISP模式下,采用计算机软件实现串口监视。另一种是指IAP模式下,对输入计算机串口的数据进行跟踪。串行通信的重点在于异步通信时波特率的选择,以及传送位数的规定。通过串口的通讯,计算机可以实现与D/A、A/D、PC机以及其他单片机的通信,还可以由不同的协议构成各种网络结构,方便了单片机系统的嵌入式应用。
实验总结
我很喜欢单片机的实验,我还自己买了开发板STC—90C51,不过越是新出的板子,集成度越高,也就越省事,可是这样一来,它内部的具体的数据总线,地址总线的连接关系也就越不清楚,到了实验室,发现对具体接口的理解很局限,甚至不会对接口编程,这都是我在实验中得到的教训和经验,关于这一点我还和李老师做过交流,老师告诉我说要想学好单片机就得从最原始的入手,经过这样的训练之后,再难的都很容易学会,所以在今后的学习中,我会按照老师的建议从底层学起,学好单片机。
此次实验中利用到的编程软件为Keil C51 μVision2,但是编程语言老师要求用汇编,这对我们的要求很高,C语言虽然好用方便,可是老师告诉我们说,在实时控制和代码效率方面汇编语言具有很大的优势,而且学好了汇编语言,再学高级语言就很简单了。这些很实用的建议让我们大家都非常的受益。
在实验过程中,我还学到了一些简单的调试方法,设置断点调试,单步调试,全速调试等,而且还接触了一点PROTEUS软件仿真,这都对我们的提高有非常大的促进作用。最后感谢老师和实验室学长学姐的帮助!