中南大学单片机实验报告.docx
《中南大学单片机实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学单片机实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
![中南大学单片机实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/30/02b2e42a-7cee-43c4-9655-67b751c326a5/02b2e42a-7cee-43c4-9655-67b751c326a51.gif)
中南大学单片机实验报告
单片机原理及应用系统
设计实验报告
学院:
信息科学与工程学院
班级:
学号:
姓名:
指导老师:
目录
第一章综述2
第二章实验要求1
第三章软件设计2
1清零程序2
2拆字程序3
3拼字程序4
4数据传送程序设计5
5排序程序7
6散转程序8
第四章硬件设计9
1数字量输入输出实验9
1)硬件构造:
9
2)程序代码:
10
2定时器/计数器实验12
1)硬件构造:
12
2)程序代码:
13
3A/D、D/A转换实验15
1)硬件构造:
15
2)程序代码:
15
4串行通信软件设计19
1)硬件构造:
20
2)程序代码:
20
第五章调试过程及体会23
1调试过程23
2收获体会24
第一章综述
单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领域。
单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。
一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!
但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!
只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
1.SCM即单片微型计算机(SingleChipMicrocomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。
“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。
在开创嵌入式系统独立发展道路上,Intel公司功不可没。
2.MCU即微控制器(MicroControllerUnit)阶段,主要的技术发展方向是:
不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。
它所涉及的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家。
从这一角度来看,Intel逐渐淡出MCU的发展也有其客观因素。
在发展MCU方面,最著名的厂家当数Philips公司。
Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控制器。
因此,当我们回顾嵌入式系统发展道路时,不要忘记Intel和Philips的历史功绩。
3.单片机是嵌入式系统的独立发展之路,向MCU阶段发展的重要因素,就是寻求应用系统在芯片上的最大化解决;因此,专用单片机的发展自然形成了SoC化趋势。
随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较大的发展。
因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。
MCS51系列微控制器应用广泛,在家电、汽车甚至航空等领域都有其活跃的身影。
然而,普通51系列微控制器内部资源有限,像我用Proteus构建微控制器虚拟实验室选用的AT89C52只有三个定时器、一个全双工的串行口和中断控制,并且其数据处理能力有限,不适合对大量数据进行复杂分析和运算。
因此,在不重新选型(可选用SoC)的前提下,为实现我们所需要的功能,就需要进行外围扩展。
针对微控制器的特点,我们首先考虑串行扩展,因为微控制器的I/O引脚有限,并行扩展一则外围芯片面积比较大,二则对抑制EMI不利。
第二章实验要求
1、学习KeilC51集成开发工具的操作及调试程序的方法,包括:
仿真调试与脱机运行间的切换方法;
2、熟悉TD-51单片机系统板及实验系统的结构及使用;
3、进行MCS51单片机指令系统软件编程设计与硬件接口功能设计;
4、学习并掌握KeilC51与Proteus仿真软件联机进行单片机接口电路的设计与编程调试;
5、完成指定MCS51单片机综合设计题
下面主要分为软件和硬件部分来介绍
软件部分:
清零程序与拆字程序设计
拼字程序与数据传送程序设计
排序程序与散转程序设计
硬件部分:
静态存储器扩展实验
要求:
阅读、验证C语言程序功能。
使用汇编语言编程,完成实验指导书之“4.2FLASH存储器扩展实验”实验项目(P60)。
数字量输入输出实验
LED灯控制(使用8255接口芯片)
要求:
使用汇编语言编程,功能为:
通过KK1实现LED灯工作方式即时控
制,完成LED开关控制显示和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亮……一直循环下去。
A/D、D/A转换实验
要求:
Proteus环境下完成小键盘给定(并显示工作状态),选择信号源输出波形类型(D/A转换方式),经过A/D采样后,将采样数据用LED灯,显示当前模拟信号值大小及变化状态。
串行通讯实验
要求:
Proteus环境下完成利用单片机实验系统,实现与PC机通讯。
功能要求:
将从实验系统键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到单片机实验系统的数码管上。
第三章软件设计
1.清零程序
因为清零看不出效果,故改为全部写为01,从7000-8000H空间。
程序如下:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVDPTR,#7000H;片内RAM首地址
MOVA,#01H;写入数据初值
MOVR6,#20H;循环变量
LOOP2:
MOVR7,#80H
LOOP1:
MOVX@DPTR,A;写数据到RAM
INCDPTR;地址加1
DJNZR7,LOOP1
DJNZR6,LOOP2
SJMP$
END
结果如下:
单步运行下,第一步为:
最后一步为:
8000h为0
2.拆字程序
流程图为
程序如下:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVDPTR,#7000H;
MOVA,#12H;
MOVX@DPTR,A;
RRA;
RRA;
RRA;
RRA;
ANLA,#0FH;高位送7001H低位
MOVDPTR,#7001H;
MOVX@DPTR,A;
MOVDPTR,#7000H;
MOVXA,@DPTR;
ANLA,#0FH;低位送7002H低位
MOVDPTR,#7002H;
MOVX@DPTR,A;
SJMP$;设置断点,观察实验结果中的内容
END
结果如下:
3.拼字程序
流程图如下:
程序如下:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVDPTR,#7000H;
MOVA,#01H;
MOVX@DPTR,A;
ANLA,#0FH;屏蔽高位
SWAPA;
MOVB,A;
MOVDPTR,#7001H;送7001H
MOVA,#0AH;
MOVX@DPTR,A;
ANLA,#0FH;
ORLA,B;拼送后送7002H
MOVDPTR,#7002H;
MOVX@DPTR,A;
SJMP$;设置断点,观察实验结果中的内容
END
结果如下:
4.数据传送程序设计
把(R2,R3)源RAM中首地址内的(R6,R7)个字节数据传送到(R4,R5)目的RAM中。
流程图如下
程序:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVR2,#70H;
MOVR3,#00H;源地址
MOVR4,#71H;
MOVR5,#00H;目的地址
MOVR6,#00H;
MOVR7,#07H;传送个数
MOVR1,#10H;
MOVR0,#07H;
MOVDPH,R2;
MOVDPL,R3;
MOVA,R1;
L0:
MOVX@DPTR,A;
INCDPTR;
DJNZR0,L0;赋值
L2:
MOVR7,#0FFH;
L1:
MOVDPH,R2;
MOVDPL,R3;
MOVXA,@DPTR;
INCDPTR;
MOVR2,DPH;
MOVR3,DPL;
MOVDPH,R4;
MOVDPL,R5;
MOVX@DPTR,A;
INCDPTR;
MOVR4,DPH;
MOVR5,DPL;
DJNZR7,L1;
DJNZR6,L2;
SJMP$
END
结果如下:
把7000h中的8个数据发给7100h中:
5.排序程序
程序如下:
ESELSORT:
MOV R7,N
DEC R7
ESST1 :
MOV A,R7
MOV R6,A
MOV DPL,ADDPL
MOV R1,DPL
MOV DPH,ADDPH
MOV R0,DPH
MOVX A,@DPTR
MOV B,A
ESST2 :
INC DPTR
MOVX A,@DPTR
CLR C
SUBB A,B
JC ESST3
MOV R0,DPL
MOV R1,DPH
MOVX A,@DPTR
MOV B,A
ESST3 :
DJNZ R6,ESST2
MOVX A,@DPTR
XCH A,B
MOVX @DPTR,A
MOV DPL,R0
MOV DPH,R1
MOV A,B
MOVX @DPTR,A
DJNZ R7,ESST1
RET
6.散转程序
流程图如下:
程序如下:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVR0,#02
MOVA,R0
RLA
ADDA,R0
MOVDPTR,#TA
JMP@A+DPTR
TA:
LJMPPM0
LJMPPM1
LJMPPM2
LJMPPM3
PM0:
MOVR1,#01H
LJMPMAIN
PM1:
MOVR2,#02H
LJMPMAIN
PM2:
MOVR3,#03H
LJMPMAIN
PM3:
MOVR4,#04H
LJMPMAIN
OVER:
SJMP$
END
结果如下:
当修改A=02h时跳转到pwm2即使R1=03
当修改A=00时即使R1=01,结果如下:
第四章硬件设计
硬件部分我主要做了三个实验,前两个是用c完成的,后一个是同学指导用汇编完成的,个人觉得用c来做程序还是比会变简单明了很多,而且原理也是一样的。
1.数字量输入输出实验
任务:
通过KK1实现LED灯工作方式即时控制,完成LED开关控制显示和LED灯左循环、右循环、间隔闪烁功能。
(要求一定要用到8255)
1)硬件构造如下:
因为要加入8255,所以在硬件与程序中还是遇到了一些小麻烦的,在protus7.0中的8255是有问题的,后来转为7.5才好,可是在实际中又运行不了,只能仿真。
2)程序如下:
#include
unsignedcharcount;
sbitA0=P2^0;
sbitA1=P2^1;
sbitWR_8255=P2^3;
sbitCS=P2^4;
sbitRESET_8255=P2^2;
voidSendData(unsignedchardat);
voiddelay(void)
{
unsignedchara,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}
voidmain()
{
unsignedchari,value;
IT0=1;//设置外部中断0下降沿触发
EX0=1;//允许外部中断0
EA=1;//开总中断
RESET_8255=1;//上电复位8255
for(i=0;i<10;i++);
RESET_8255=0;
WR_8255=0;//设置8255A口输出工作方式
A0=1;
A1=1;
P0=0x80;
CS=0;
for(i=0;i<10;i++);
WR_8255=1;
CS=1;
while
(1)
{
if(count==0)
{
value=0x01;
for(i=0;i<8;i++)//左移
{
SendData(value);
delay();
SendData(0x00);
value=value<<1;
}
}
if(count==1)
{
value=0x80;
for(i=0;i<8;i++)//右移
{
SendData(value);
delay();
SendData(0x00);
value=value>>1;
}
}
if(count==2)
{
SendData(0xFF);//闪烁
delay();
SendData(0x00);
delay();
}
}
}
//外部中断0中断服务程序,用于选择LED的方式
voidextra()interrupt0
{
count=(count+1)%3;
}
//向8255的A口写一个数据
voidSendData(unsignedchardat)
{
unsignedchari;
WR_8255=0;
A0=0;
A1=0;
P0=dat;
CS=0;
for(i=0;i<10;i++);
WR_8255=1;
CS=1;
}
2.定时器/计数器实验
定时器控制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)硬件构造如下:
2)程序如下:
#include
unsignedcharcount;
voidmain()
{
unsignedcharvalue,i;
TMOD=0x01;
TH0=0x4C;
TL0=0x00;
ET0=1;
PT0=1;
EA=1;
TR0=1;
while
(1)
{if(count==20)
P1=05H;
if(count==40)
P1=0AH;
if(count==60)
P1=50H;
if(count==80)
P1=0A0H;
if(count==100)
P1=55H;
if(count==120)
P1=0AAH;
if(count==140)
P1=0FFH;
if(count==160)
P1=00H;
count=0;
}
}
voidTimer0()interrupt1
{
TR0=0;
TH0=0x4C;
TL0=0x00;
TR0=1;
count++;
3.A/D、D/A转换实验
要求:
Proteus环境下完成小键盘给定(并显示工作状态),选择信号源输出波形类型(D/A转换方式),经过A/D采样后,将采样数据用LED灯,显示当前模拟信号值大小及变化状态。
1)硬件构造如下:
2)程序如下:
PRO_DAEQU7FFFH
PRO_ADEQU0BFFFH
ORG0000H
SJMPMAIN
ORG001BH
LJMPKEYSCAN
ORG0030H
MAIN:
SETBEA
SETBEX1
SETBIT1
MOVP1,#0FH
MOVR5,#0FFH
TEST:
MOVR5,#03H
CJNER5,#01H,L1
LCALLSQUARE
AJMPTEST
L1:
CJNER5,#02H,L2
LCALLTRIANGLE
AJMPTEST
L2:
CJNER5,#03H,L3
LCALLSAWTOOTH
L3:
AJMPTEST
;键盘扫描中断
KEYSCAN:
ACALLT12MS
;MOVR6,A
ACALLSCAN
JNZKEY1
SJMPEXIT
KEY1:
MOVR2,A
MOVR3,#07FH
MOVR4,#03H
LOOP1:
MOVP1,R3
MOVA,P1
CPLA
ANLA,#0FH
JNZKEY2
MOVA,R3
RRA
MOVR3,A
DJNZR4,LOOP1
SJMPEXIT
KEY2:
DECR4
CJNER2,#01H,LOOP3
MOVA,#01H
SJMPLOOP6
LOOP3:
CJNER2,#02H,LOOP4
MOVA,#04H
SJMPLOOP6
LOOP4:
CJNER2,#04H,LOOP5
MOVA,#07H
SJMPLOOP6
LOOP5:
CJNER2,#08H,LOOP6
MOVA,#0AH
LOOP6:
ADDA,R4
MOVR5,A
MOVP1,#0FH
;MOVA,R6
EXIT:
RETI
;延时后再次扫描有无按键按下
SCAN:
MOVP1,#0FH
MOVA,P1
CPLA
ANLA,#0FH
RET
T12MS:
MOVR7,#15H;12MS
TM:
MOVR6,#0FFH
DJNZR6,$
DJNZR7,TM
RET
;D/A产生方波
SQUARE:
MOVDPTR,#PRO_DA
MOVA,#0FFH
MOVX@DPTR,A
MOVDPTR,#0BFFFH
MOVX@DPTR,A
ACALLDELAY
MOVA,#00H
MOVDPTR,#PRO_DA
MOVX@DPTR,A
MOVDPTR,#0BFFFH
MOVX@DPTR,A
ACALLDELAY
RET
DELAY:
MOVR0,#27H
DEL1:
MOVR1,#0FFH
DJNZR1,$
DJNZR0,DEL1
RET
;D/A产生三角波时钟500KHz幅值1mv扫描周期20ms
TRIANGLE:
MOVA,#00H
TLOOP:
MOVDPTR,#PRO_DA
MOVX@DPTR,A
MOVDPTR,#PRO_AD
MOVX@DPTR,A
CJNEA,#0FFH,TLOOP2
COUNT1:
DECA
MOVDPTR,#PRO_DA
MOVX@DPTR,A
MOVDPTR,#PRO_AD
MOVX@DPTR,A
CJNEA,#00H,COUNT1
SJMPEXIT1
TLOOP2:
INCA
AJMPTLOOP
EXIT1:
RET
;D/A产生锯齿波
SAWTOOTH:
MOVA,#00H
SLOOP:
MOVDPTR,#PRO_DA
MOVX@DPTR,A
MOVDPTR,#PRO_AD
MOVX@DPTR,A
INCA
CJNEA,#00H,SLOOP
RET
END
4.静态存储器扩展实验
1)程序如下:
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOV8EH,02H
MOVP1,#0FFH
CLRA
MOVP1,A
MOVR7,#10H
MOVR0,#30H
MOVA,#00H
LOOP0:
MOV@R0,A
INCR0
INCA
DJNZR7,LOOP0
MOVR7,#10H
MOVR0,#30H
MOVR1,#40H
MOVDPTR,#0000H
LOOP1:
MOVA,@R0
MOVX