第一篇:单片机(复习题)
一、填空题 1、8031单片机是___8___位单片机。
2、单片机中设置堆栈指针SP为37H后发生子程序调用,调用后SP变为_39H_。3、80C51单片机的外部中断1中断入口地址为___0013H ___。4、80C51中唯一一个不可以寻址的16位寄存器为____PC_____。
5、单片机存储器系统扩展常用的芯片选择方法有线选法和__译码 __。
6、访问外部存贮器时,作数据线和低8位地址线的口线是____P0口__。7、80C51汇编语言指令格式中,唯一不可缺少的部分是__操作码_______。9、80C51单片机在同一级别里,级别最高的中断源是_____外中断0_ ____。
10、MOV C,20H源寻址方式为____直接位______寻址。
11、串行通信有___单双工______、____全双工_____和____半双工_____共3种数据通路形式。
13、若由程序设定RS1、RS0=10,则工作寄存器R0~R7的直接地址为___10h---17h ____。14、80C51单片机有_____5_____个中断源。15、80C51中唯一可供用户使用的16位寄存器为_______DPTR _____。
16、在一个源程序中只能有一条__END _____指令,且该指令位于源程序的最后。18、8051有两个并行且相互独立的存储器系统,即______数据______存储器系统和_______程序_____存储器系统。
二、简单题
1、80C51单片机堆栈的特点和操作规则;
2、写出80C51单片机指令的七种寻址方式,并分别举例说明。
3、写出五个中断及其向量地址;
4、中断优先顺序根据哪两种情况安排;
5、简述80C51单片机十六位地址总线的构成。6、80C51单片机有两个16位的定时器,在工作方式0、1、2下的定时器的定时时间由哪些因素决定,并分别写出定时公式。
三、读程序
1、写出下列指令的功能。
MOVC A,@A+DPTR; SETB C;
JNZ rel;
2、假定A=40H,R1=41H,(40H)=05H。执行以下两条指令后(A)=____________,(R1)=____________,(40H)=____________。XCH A,R1 XCHD A,@R1
3、已知(SP)=07H,(DPTR)=3456H,执行下列指令后,内部RAM(08H)=_____,(09H)=_____,(SP)=_____。INC DPTR PUSH DPH PUSH DPL
4、下列指令执行后,(P1.7)=__12H___,(P1.1)=__35H___,(P1.2)= _09H
____。ANL P1,#33H ORL P1,#73H
5、假定(A)=59H,(R5)=74H,执行命令: ADD A,R5 后累加器A的内容为______,CY的内容为______。DA A 后累加器A的内容为______。
6、下列指令执行后,TIME0工作在方式______,TIME1工作在方式______,TIME0单次最大定时时间是_________个机器周期,TIME1单次最大定时时间是_________个机器周期。MOV A,#12H MOV TMOD,A
三、根据要求编写程序
1、编程实现将程序存储器ROM4000H单元的数送到内部RAM28H单元中。
2、将片外RAM地址为60H的内容中间4为清零。
第二篇:单片机复习题
单片机原理复习题
1.80C51内部包含哪些主要功能部件?
2.MCS-51系列单片机品种繁多,其中8031,8051,8751,80C51,89C51,89C52各有何区别?
3.在MCS-51单片机系统中,外接的程序存储器和数据存储器共用16位地址线和8位数据线,为何不会发生冲突?外部RAM地址和EPROM地址可以重叠吗?
4.MCS-51单片机的PSEN,WR,RD及EA引脚各有什么作用?对于8031,EA应如何处理?为什么?执行MOVX类和MOVC类指令时哪些控制信号有效?
5.80C51的片内、片外存储器如何选择?
6.简述51单片机的指令周期、机器周期、时钟周期和振荡周期的关系。若晶振频率为12MHz,时钟周期、机器周期各为多少?
7.51单片机的P1口属于何种I/O口?P1口作为输入口使用时,为什么使用前一定要向P1口锁存器相应位写入“1”。
8.地址/数据分时复用的含义是什么?实际使用时通过外接什么功能的芯片来实现?8031在进行外部功能扩展时,P2口通常起什么作用?P0口如何实现分时复用?
9.80C51有几个中断源?CPU响应各中断时,其中断入口地址是多少?
10.定时/计数器的4种工作方式各有何特点?要求从P1.1引脚输出1000Hz方波,晶振频率为12MHz。试用查询法和中断法设计程序。
11.串行数据传送的主要优点是什么?假定串行口串行发送的字符格式为1个起始位,8个数据位,1个奇校验位,1个停止位,请画出传送一个字节数据0FH的帧格式。12.80C51单片机串行口有几种工作方式?如何选择?简述其特点。
13.了解RS232的电气特性,它与MOS,TTL电平能直接连接吗?
14.RS232C与RS485的特点(本章小结)。
15.为什么要消除按键的机械抖动?消除抖动的方法有哪几种?原理是什么?
16.LED数码管的静态显示方式与动态显示方式有何区别?各有什么优缺点?
17.说明矩阵式键盘按键按下的识别原理。
18.8031扩展RAM/EPROM的硬件接线与地址范围确定。
19.8051与ADC0809的接口与编程。
20.8051与DAC0832的接口与编程。
第三篇:单片机期末复习题
期末复习题(1)
ADC转换器的通道如何选择?ADC转换器的精度如何选择?如何启动ADC转换器开始工作?如何读取ADC转换器的转换结果?假定参考电压为3.3V,从ADOGDR寄存器中读取到的10位A/D转换结果为256,则对应的实际测量电压值是多少?
简述ADC转换器两种工作模式的特点。
简述小型矩阵键盘扫描程序的工作原理。为了消除键盘输入时的干扰信号,在软件上采用了什么办法? 为什么许多小型嵌入式系统都采用矩阵键盘?是否还有其他的选择?
假设系统时钟频率为12M,系统定时器为32位的最小定时时间为多少?最大定时时间为多少?
定时器与计数器的功能有何不同?
什么是PWM波形?用LPC1110处理器产生PWM波形用到了那些功能?
简述看门狗定时器的工作原理。
如何确定看门狗定时器的定时时间?
看门狗定时器的中断运行模式有何用处?
假设看门狗定时器选择的时钟频率为12M,定时器的最小定时时间为多少?最大定时时间为多少?
看门狗定时器模式寄存器中的位WDEN,WDRESET,WDNT为何不允许用软件来清除? 看门狗定时器的初始化程序应当放到主程序的什么位置?
看门狗定时器的喂狗程序应当放到主程序的什么位置?
复习题(2)
LPC1110系列处理器的系统控制模块包括哪些模块?LPC1110包括哪三个独立的时钟源?为什么LPC1110处理器的许多引脚都是复用的?如何选择引脚的功能?LPC1110处理器有几个I/O端口?请写出每个端口的名字。LPC1110系列处理器内的Flash容量最小为多少?最大为多少?代码读保护的安全级别有几种?请写出各个安全级别的名称。数码管接反得情况下显示数字,请写出对应的显示码 指出数码管两种驱动方式的优缺点 什么是CMSIS? 使用cmsis有何好处? LPC处理器是如何进行功耗管理的?指出每种省电模式的特点。
LPC1110系列处理器的系统控制模块包括哪些模块? MDK是什么?请写出它的英文全称。CMSIS可以分为几个基本功能层?请写出各层名称。Cortex-m0 有多少个通用寄存器? Cortex-m0支持哪三种数据类型? Cortex-m0 的地址空间有多大?写出最小地址和最大地址。Cortex-m0 有几种工作模式? Cortex-m0 指令集有多少条Thumb指令? 复位后PC的值是多少?
第四篇:单片机实验报告
目录
第一章单片机简介....................................................2 第二章
实验要求..................................................3 第三章实验设备......................................................3 第四章实验安排......................................................4 第五章实验内容......................................................4
LED灯实验.......................................................4 步进马达试验....................................................5 独立按键控制LED实验............................................7 矩阵键盘实验....................................................9 静态数码管实验.................................................12 动态数码管实验.................................................14 NE555脉冲发生器实验(定时/计数器).............................16 RS232串口通信实验(接收与发送)..................................21 第六章收获体会.....................................................25
单片机实验报告
第一章单片机简介
单片机也被称为微控制器(Microcontroller),是因为它最早被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
1.SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了SCM与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,Intel公司功不可没。
2.MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展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.学习Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试与脱机运行间的切换方法
2.熟悉TD-51单片机系统板及实验系统的结构及使用
3.进行MCS51单片机指令系统软件编程设计与硬件接口功能设
4. 学习并掌握Keil C51软件联机进行单片机接口电路的设计与编程调试
5.完成指定MCS51单片机综合设计题
第三章实验设备
1.HC600S-51单片机开发板 2.Keil C51 3.普中自动下载软件
第四章 实验安排
1.LED灯实验
单片机实验报告
2.步进马达试验
3.独立按键控制LED实验 4.矩阵键盘实验 5.静态数码管实验 6.动态数码管实验
7.NE555脉冲发生器实验(定时/计数器)8.RS232串口通信实验(接收与发送)
第五章 实验内容
一、LED灯实验
1.基本要求
利用位移循环指令实现LED灯的闪烁 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图
4.电路原理图
单片机实验报告
5.程序
#include
main(){unsigned int i;while(1)
{for(i=0,P0=1;i<4;i++){d(500);P0=(P0<<2);}}}
二、步进马达试验
1.基本要求
编程实现马达的正反转,调速等功能 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)
单片机实验报告
图一 图二
4.电路原理图
上图图二 5.程序
#include “reg52.h” #define speed 2 sbit PH1 = P1^0;
//定义管脚 sbit PH2 = P1^1;sbit I01 = P1^2;sbit I11 = P1^3;sbit I02 = P1^4;sbit I12 = P1^5;
void delay(int time);
void Go(){ //A
PH1 = 0;//PH1为0 则A线圈为反向电流
I01 = 0;I11 = 0;
//以最大电流输出
PH2 = 0;//PH2为0 则B线圈为反向电流
I02 = 1;I12 = 1;
//输出0 delay(speed);//圈为反向电流
I01 = 1;//输出0 I11 = 1;
PH2 = 1;//PH2为1 则B线圈为正向电流
I02 = 0;//以最大电流输出
I12 = 0;
delay(speed);//B PH1 = 1;
//PH1为1 则A线圈为
正向电流
I01 = 0;
//以最大电流输出
I11 = 0;
PH2 = 1;//PH2为1 则B线圈为正
向电流
I02 = 1;//输出0 I12 = 1;
delay(speed);
PH1 = 1;
//PH1为1 则A线圈为正向电流
I01 = 1;I11 = 1;
PH2 = 0;
//PH2为0 则B线圈为反向电流
I02 = 0;I12 = 0;delay(speed);}
void delay(int time){
int i,j;
for(j=0;j <= time;j++)
for(i =0;i <= 120;i++);}
void main(){
while(1)
{
Go();//步进电机运行
} }
单片机实验报告
三、独立按键控制LED实验
1.基本要求
通过编程控制8个独立按键分别控制8个LED灯的开关 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)
图一 图二
4.电路原理图 上图图二 5.程序
#include
P1口
#define uchar unsigned char #define uint unsigned int
void Delayms(unsigned int c);
//延时10ms uchar Key_Scan();void main(void){
unsigned char ledValue, keyNum;
ledValue = 0x01;
while(1)
{
keyNum = Key_Scan();//扫描键
盘
switch(keyNum)
{
case(0xFE):
//返回按
键K1的数据
ledValue = 0x01;
break;
单片机实验报告
case(0xFD):
ledValue = 0x02;
break;case(0xFB):
ledValue = 0x04;
break;case(0xF7):
ledValue = 0x08;
break;case(0xEF):
ledValue = 0x10;
break;case(0xDF):
ledValue = 0x20;
break;case(0xBF):
ledValue = 0x40;
break;case(0x7F):
ledValue = 0x80;
//返回按键K2的数据
//返回按键K3的数据
//返回按键K4的数据
//返回按键K5的数据
//返回按键K6的数据
//返回按键K7的数据
//返回按键K8的数据
break;default:
break;
}
GPIO_LED = ledValue;//点亮LED灯
}
}
uchar Key_Scan(void)//键盘扫描函数 { uchar i,n=0xff;
if(P1==0xff)goto Scan_r;//无键按
下,返回
goto Scan_r;Scan_1:
while(P1!=0xff);//等待键释放
Delayms(10);Scan_r:
return n;}
void Delayms(uint x){
uint n;
for(;x>0;x--)
{
for(n=0;n<123;n++)
{;}
} }
四、矩阵键盘实验
1.基本要求
编程由16个矩阵按键控制数码管显示相应的数值 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。
3.接线图
单片机实验报告
见下图图一
图一 图二
4.电路原理图
见上图图二 5.程序
#include
uchar ScanKey(void);void Delayms(uint x);main(){ unsigned char ledValue;uchar i;ledValue = 0x01;loop: i = ScanKey();
switch(i)
{ case 0xee:
ledValue = ~0x3F;
break;
case 0xde:
ledValue = ~0x06;
break;
case 0xbe:
ledValue = ~0x5B;
break;
case 0x7e:
ledValue = ~0x4F;
break;
case 0xed:
ledValue = ~0x66;
break;
case 0xdd:
ledValue = ~0x6D;
break;
单片机实验报告
case 0xbd:
ledValue = ~0x7D;
break;
case 0x7d:
ledValue = ~0x07;
break;
case 0xeb:
ledValue = ~0x7F;
break;
case 0xdb:
ledValue = ~0x6F;
break;
case 0xbb:
ledValue = ~0x77;
break;
case 0x7b:
ledValue = ~0x7C;
break;
case 0xe7:
ledValue = ~0x39;
break;
case 0xd7:
ledValue = ~0x5E;
break;
case 0xb7:
ledValue = ~0x79;
break;
case 0x77:
ledValue = ~0x71;
break;
}
GPIO_LED = ledValue;i=0;goto loop;}
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
uchar ScanKey(void)//键盘扫描函数 { uchar i,n=0xff;
P1=0xf0;
if(P1==0xf0)goto Scan_r;//无键按下,返回
for(i=0,P1=0xfe;i<4;i++)
{ if((P1&0xf0)!=0xf0)
{ Delayms(10);
if((P1&0xf0)!=0xf0)
{ n=
P1;
goto
Scan_1;}
}
P1=(P1<<1)+1;
//扫描下
一行
} goto Scan_r;Scan_1:
单片机实验报告
P1=0xf0;while((P1&0xf0)!=0xf0);//等待键
释放
Delayms(10);
Scan_r:
P1=0xff;return n;} }
五、静态数码管实验
1.基本要求
编程使数码管显示字符0-F 2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线框图(图一)
图一
单片机实验报告
图二
4.电路原理图
见上图图二 5.程序
#include
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D, ~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){
unsigned int LedNumVal;//定义变量 while(1)
{
// 将字模送到P0口显示
LedNumVal++;
P0 = LED7Code[LedNumVal%16];
Delayms(1000);
//调用延时程序
}
}
单片机实验报告
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
六、动态数码管实验
1.基本要求
编程实现8个数码管的动态扫描。通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图(图一)
图一 图二
单片机实验报告
图三
4.电路原理图
见上图图
二、图三 5.程序
#define uint unsigned int void Dsplay();void Delayms(uint x);uchar mDS[6];uchar code cDsCode[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main(){ uchar i;
for(i=0;i<6;i++)mDS[i]=i+1;
loop:
Dsplay();
goto loop;}
void Dsplay()//动态扫描显示
{uchar i;
for(i=0,P2=0x01;i<6;i++)
{ P1=cDsCode[mDS[i]];//输出段
Delayms(1000);
P2=P2<<1;
//选通下一位
}
P2=0x00;
//关闭位选通 }
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
七、NE555脉冲发生器实验(定时/计数器)
1.基本要求
2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图
4.电路原理图
5.程序
#include
CYMOMETER
”};uchar code EN_CHAR2[16]={“FREQ:
HZ”};
单片机实验报告
void TIMER_Configuration();//初始化定时器 ulong Freq;
//用来存放要显示的频率值 ulong TimeCount;//用于计算1S钟的
void main(){ uchar i, freqValue[6];
LcdInit();TIMER_Configuration();for(i=0;i<16;i++){
LcdWriteData(EN_CHAR1[i]);}
LcdWriteCom(0xc0);//第二行显示
for(i=0;i<16;i++){
LcdWriteData(EN_CHAR2[i]);}
while(1){
if(TR0==0)
//当计数器停下的时候,表明计数完毕
{
Freq = Freq + TL1;
//读取TL的值
Freq = Freq +(TH1 * 256);//读取TH的值
LcdWriteCom(0xc8);
//--求频率的个十百千万十万位--//
freqValue[0]='0'+Freq%1000000/100000;
freqValue[1]='0'+Freq%100000/10000;
freqValue[2]='0'+Freq%10000/1000;
freqValue[3]='0'+Freq%1000/100;
freqValue[4]='0'+Freq%100/10;
freqValue[5]='0'+Freq%10;
for(i=0;i<5;i++)//从最高位开始查找不为0的数开始显示(最低位为0显示0)
{
if(freqValue[i]==0x30)
{
freqValue[i]=0x20;//若为0则赋值空格键
}
else
单片机实验报告
{
break;
}
}
for(i=0;i<6;i++)
{
LcdWriteData(freqValue[i]);
}
Freq=0;//将计算的频率清零
TH1=0;//将计数器的值清零
TL1=0;
TR0=1;//开启定时器
TR1=1;//开启计数器
} } }
void TIMER_Configuration(){ TMOD=0x51;TH0=0x3C;TL0=0xB0;ET0=1;ET1=1;EA=1;TR0=1;TR1=1;} void Timer0()interrupt 1 { TimeCount++;if(TimeCount==20)//计时到1S {
TR0=0;
TR1=0;
TimeCount=0;
}
//--12MHZ设置定时50ms的初值--// TH0=0x3C;TL0=0xB0;} void Timer1()interrupt 3 {
单片机实验报告
//--进入一次中断,表明计数到了65536--// Freq=Freq+65536;
}
#include“lcd.h”
void Lcd1602_Delay1ms(uint c)
//误差 0us {
uchar a,b;for(;c>0;c--){
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
} #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com)
//写入命令 { LCD1602_E = 0;
//使能
LCD1602_RS = 0;
//选择发送命令
LCD1602_RW = 0;
//选择写入
LCD1602_DATAPINS = com;
//放入命令
Lcd1602_Delay1ms(1);//等待数据稳定
LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);
//保持时间
LCD1602_E = 0;} #else
void LcdWriteCom(uchar com)
//写入命令 { LCD1602_E = 0;//使能清零
LCD1602_RS = 0;//选择写入命令
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = com;// Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);
单片机实验报告
LCD1602_DATAPINS = com << 4;//发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
//写入数据 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//选择输入数据
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = dat;//写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);
//保持时间
LCD1602_E = 0;} #else void LcdWriteData(uchar dat)
//写入数据 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;
//选择写入数据
LCD1602_RW = 0;
//选择写入
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//写入低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x38);//开显示
单片机实验报告
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点 } #else void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28);//在四位线下的初始化
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点 } #endif
八、RS232串口通信实验(接收与发送)
1.基本要求
a.通过实验了解串口的基本原理及使用,理解并掌握对串口进行初始化; b.使用串口调试助手(Baud 9600、数据位
8、停止位
1、效验位无)做为上位机来做收发试验;
c.利用串口调试助手中字符串输入进行数据发送,接受窗口显示收到的数据。2.实验内容
在Keil C51中进行程序的编写设计并生成.HEX文件,按照下图连接电路后将HC600S-51单片机开发板接通电源,按下开关,录入。打开普中录入生成.HEX文件,加载程序,观察实验结果,如果不正确对程序进行改进后重复此操作。实验结束后先断电源再拆线,将元器件归位后离开。3.接线图
单片机实验报告
4.电路原理图
5.程序
#include
LcdWriteData(ChCode[i]);} UsartConfiguration();while(1){
if(RI == 1)
//查看是否接收到数据
{
receiveData = SBUF;//读取数据
单片机实验报告
RI = 0;
//清除标志位
LcdWriteCom(0xC0);
LcdWriteData('0' +(receiveData / 100));
// 百位
LcdWriteData('0' +(receiveData % 100 / 10));// 十位
LcdWriteData('0' +(receiveData % 10));
// 个位
} } } void UsartConfiguration(){ SCON=0X50;
//设置为工作方式1 TMOD=0X20;//设置计数器工作方式2 PCON=0X80;
//波特率加倍
TH1=0XF3;
//计数器初始值设置,注意波特率是4800的TL1=0XF3;TR1=1;
//打开计数器 }
#include“lcd.h”
void Lcd1602_Delay1ms(uint c)
//误差 0us {
uchar a,b;for(;c>0;c--){
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
} #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com)
//写入命令 { LCD1602_E = 0;
//使能
LCD1602_RS = 0;
//选择发送命令
LCD1602_RW = 0;
//选择写入
LCD1602_DATAPINS = com;
//放入命令
Lcd1602_Delay1ms(1);//等待数据稳定
LCD1602_E = 1;
//写入时序
单片机实验报告
Lcd1602_Delay1ms(5);
//保持时间
LCD1602_E = 0;} #else
void LcdWriteCom(uchar com)
//写入命令 { LCD1602_E = 0;//使能清零
LCD1602_RS = 0;//选择写入命令
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4;//发送低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
//写入数据 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//选择输入数据
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = dat;//写入数据
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);
//保持时间
LCD1602_E = 0;} #else void LcdWriteData(uchar dat)
//写入数据 { LCD1602_E = 0;
//使能清零
LCD1602_RS = 1;
//选择写入数据
LCD1602_RW = 0;//选择写入
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);
单片机实验报告
LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//写入低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//写入时序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif
#ifndef LCD1602_4PINS void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x38);//开显示
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点 } #else void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x32);//将8位总线转为4位总线
LcdWriteCom(0x28);//在四位线下的初始化
LcdWriteCom(0x0c);//开显示不显示光标
LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//设置数据指针起点 } #endif
单片机实验报告
第六章 收获体会
本次微控制器综合设计基本上使用了所选微控制器的所有资源,进一步熟悉和加深了对中断、定时器和串行通信的理解和使用。我觉得软件实验就是让我们初学者熟悉keil的使用,然后复习下汇编的思想和掌握程序的流程,所以软件实验可以很快的完成,并且慢慢熟悉调试的强大功能。硬件设计中,仿真让我很有感触,感觉蛮好玩的,可以摒弃麻烦的实验硬件自己在寝室玩而且不受硬件状态的限制,即便出错了也不会损坏。当然更重要的是这种好习惯,仿真完后再去在实验板上验证会比直接要来的确切而且便捷,至少不要老是去插拔线。在做实验中在同学指导下我试用C语言来编写程序,确实发现比汇编语言容易编写也容易理解,以前的实验还是有参考资料的习惯,现在什么都开始自己写感觉还是很有成就感的,当然这是基于程序本身就那么几行很容易编写,也不是说参考不好。总而言之,这学期的单片机实验还是收获颇丰的。相信在以后的实验学习实践工作中都会有个潜移默化的作用的。
第五篇:单片机实验
实验
一、MCS51单片机基本开发环境
1. 实验目的:
1)熟悉软件的集成开发环境 2)掌握单片机软件设计流程
3)掌握单片机存贮器结构及各窗口之间的联系 2. 实验内容:
1)用三种方法实现将累加器A内容改为20H
方法1--MOV A,#20H 方法2—MOV R0,#20H MOV A,R0 方法3—MOV R0,#20H XCH A,R0 心得:越往下做实验时就越感觉这题根本不能说是题目,但不得不说在没接触过编程软件,刚开始学的汇编,第一次做的实验就光这道题都觉得不知道做什么.所以凡是总有开始,不了解情况的多简单的都会觉得难.2)将58H位单元置为1,观察内部RAM中2BH内容的变化 代码:
SETB 2BH.0 JMP $ END 心得:这是关于内部存储中对单元和字节了解,不理解很容易做错.比如开始写的指令为
MOV R0,#58H;MOV @R0,#1
这是错误的指令。这就需要认真去了解单片机中的字节地址与位地址的关系。80C51中有位寻址区和字节寻址区。题目中58H为位地址,2BH为字节地址,且58H为2B字节的最低位。由于58H属于位寻址区,可用位操作指令 SETB 进行置位,SETB 2BH.0 执行后,2BH中内容变为01
3)如果当前状态为有进位、工作寄存器使用区2,请用3种方法设置这种状态
代码:
ANL PSW,#01H MOV A,PSW
CJNE A,#01,LAB2 LAB1:JMP LAB1
LAB2: SETB PSW.4 MOV P0,#01H MOV R0,#18H CLR PSW.3 MOV C,P0.0 MOV PSW,R0 MOV PSW.4,C CPL C MOV PSW.3,C END
心得:以上LAB2写了三段代码,可分别完成题目要求。不过实验时只是对代码进行了错误调试,没有对结果进行检验。其中值得注意的是对于布尔(位)操作指令的用法,比如传送指令必须经累加器C,如第二段中MOV P0,#01H;MOV C,P0.0,以及对于位寻址的方式(如需用到“.”隔开)的应用。4)编一个小程序将内部RAM中的20H单元的内容送到21H单元并调试
代码:
MOV R0,#20H MOV @R0,#10H MOV R1,#21H MOV @R1,20H JMP $ END
5)用程序将堆栈指针指向60H,然后在堆栈中依次压入01,02,03,04,05五个数,观察哪些单元内容发生了变化,各变为多少?从哪些窗口可以发现这些变化?顺序将堆栈中的五个数放入30H~34H五个单元中,编程实现之。
代码:
MOV R1,#60H MOV SP,R1 MOV DPL,#1H LAB1:PUSH DPL INC DPL MOV A,DPL CJNE A,#6,LAB1 POP 34H POP 33H POP 32H POP 31H POP 30H JMP $ END
6)将外部数据存贮器1000H~100FH 16个单元中存放00H~0FH 代码:
MOV DPTR,#1000H MOV R1,#10H LOOP:MOVX @DPTR,#1234H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END
心得:此处需要访问片外存储空间,需要借助寄存器DPTR,需注意其为16位的寄存器,在使用时若与八位寄存器进行数据交换时需分为高八位DPH与低八位DPL来用。7)若要求程序从0010H单元开始运行,可用两种方法实现?
方法一 ORG 0010H 方法二 AJMP 0010H
3. 选做实验内容:数据传送 目的:
1)掌握8051单片机内部数据存贮器、外部数据存贮器的数据传送特点和应用 2)掌握MOV,MOVX和MOVC类指令的用法及区别 内容:
1)将片内RAM数据区20H为首地址的十六个字节传送到30H为首地址的数据区,即:20H~2FH送30H~3FH
代码: ORG 0000H JMP MAIN ORG 0030H MAIN:MOV R0,#20H MOV R1,#30H LOOP:MOV @R0,#1234H MOVA,@R0 MOV @R1,A INC R0 INC R1 CJNE R1,#30H,LOOP JMP $ END
2)将外部数据存储器2000H~200FH单元的十六个数传送至内部数据存储器的30H~3FH 代码: ORG 0000H JMP MAIN ORG 0030H MAIN: MOV DPTR,#2000H MOV R1,#30H LOOP:MOVX @DPTR,#12H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END
总体心得体会:
第一次做实验主要是熟悉了解了下单片机编程软件的使用,开始接触时在对其软件不是太了解的情况下实验编程做的确实很乱,不清楚该怎样进行,比如不知如何进行对指令的调试,也不清楚该如何观察结果,没有一个整体的概念,所以在了解其开发环境上花了不少时间。经过一段时间的摸索后也终于了解了其具体的使用,也能够顺利的对指令的编程运用。运行指令时遇到的一些问题需要注意的也在上面各题中做了说明。还有需要注意的是:进入软件仿真时需要对存储空间进行查看的方法是在Address窗口中输入:d:00h 显示内部数据存储器从00h开始的单元; x:1000h 显示外部数据存储器从1000h开始的单元; c:0000H 显示程序存储器内容。还有由于伪指令 END 定义的原因,在程序末需加一条死循环调转指令(如 JMP $)使程序不会进入其他未知空间执行其他指令。实验
二、加、减法实验
1. 实验目的
1)正确使用单片机的加减运算指令
2)掌握不同指令对于程序状态字的影响及程序状态字的意义、用处 3)掌握ADD,ADDC,SUBB和DA A等指令的用法 4)学习模块化程序设计方法 2. 实验内容
1)编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性。需考虑有进位和无进位情况。程序入口为: 加数:22H,21H,20H三字节,22H为最高位
被加数:32H,31H,30H三字节,32H为最高位
程序出口为: 23H,22H,21H,20H四字节,23H为最高位 例如:地址:23 22 21 20 32 31 30 执行前数据: 01 23 45 FF 01 01 执行后数据:01 00 24 46
代码:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 22H,#01H MOV 21H,#23H MOV 20H,#45H MOV 32H,#0FFH MOV 1H,#01H MOV 30H,#01H ACALL ADDI HERE:JMP HERE ORG 100H ADDI: PUSH PSW MOV R0, #20H;加数1地址、和的地址 MOV R1, #30H;加数2地址 CLR C MOV R2, #3;循环3次 LOOP: MOV A, @R0;取 ADDC A, @R1;加 MOV @R0, A;存 INC R0 INC R1 DJNZ R2, LOOP CLR A ADDC A, #0;得到进位 MOV 23H, A;保存 POP PSW RET END
2)编写三字节二进制减法子程序 入口:被减数: 52H,51H,50H, 50H为最低位
减数: 42H,41H,40H, 40H为最低位
出口:差:外部数据存贮器2003H~2000H(2000H为最低位)用主程序调用多组数据来调试,需考虑无借位和有借位两种情况。例如:
执行前:地址: 52 51 50 42 41 40
数据: 90 80 70 10 10 10
执行后:地址: 2003 2002 2001 2000
数据: 00 80 70 60 代码:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 52H,#90H MOV 51H,#80H MOV 50H,#70H MOV 42H,#10H MOV 41H,#10H MOV 40H,#10H ACALL SUB1 HERE:JMP HERE SUB1: PUSH PSW MOV R0, #50H;被减数地址 MOV R1, #40H;减数地址 MOV DPTR, #2000H;差的地址 CLR C MOV R2, #3;循环3次 LOOP: MOV A, @R0;取 SUBB A, @R1;减 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP CLR A SUBB A, #0;得到借位 MOVX @DPTR, A;存 POP PSW RET END
3)编写10位十进制加法子程序(十进制数采用压缩BCD码存放)入口: 加数:24H—20H,低地址放低字节
被加数:29H—25H,低地址放低字节
出口 和:4005H—4000H,低地址放低字节
要求调用多组数据调试,注意观察PSW的变化,理解DA A指令的含义。例如:
执行前地址:24 23 22 21 20 29 28 27 26 25
数据:12 34 56 78 90 88 99 33 12 74
执行后地址:4005 4004 4003 4002 4001 4000
数据: 01 01 33 89 91 64
代码:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 24H,#12H MOV 23H,#34H MOV 22H,#56H MOV 21H,#78H MOV 20H,#90H MOV 29H,#88H MOV 28H,#99H MOV 27H,#33H MOV 26H,#12H MOV 5H,#74H ACALL ADD2 HERE:JMP HERE ADD2: PUSH PSW MOV R0, #20H;加数1地址 MOV R1, #25H;加数2地址 MOV DPTR,#4000H CLR C MOV R2, #5;循环5次 LOOP: MOV A, @R0;取 ADDC A, @R1;加
DA A;调整为BCD码 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP POP PSW RET END