MCS-51单片机实验源程序
- 格式:doc
- 大小:129.50 KB
- 文档页数:12
3·1 汇编指令第3 章MCS 一51 系列单片机的指令系统和汇编语言程序3·1·1 请说明机器语言、汇编语言、高级语言三者的主要区分,进一步说明为什么这三种语言缺一不行。
3·1·2 请总结:(1)汇编语言程序的优缺点和适用场合。
(2)学习微机原理课程时,为什么肯定要学汇编语言程序?3·1·3MCS 一51 系列单片机的寻址方式有哪儿种?请列表分析各种寻址方式的访问对象与寻址范围。
3·1·4 要访问片内RAM,可有哪几种寻址方式?3·1·5 要访问片外RAM,有哪几种寻址方式?3·1·6 要访问ROM,又有哪几种寻址方式?3·1·7 试按寻址方式对MCS 一51 系列单片机的各指令重进展归类(一般依据源操作数寻址方式归类,程序转移类指令例外)。
3·1·8 试分别针对51 子系列与52 子系列,说明MOV A,direct 指令与MOV A,@Rj 指令的访问范围。
3·1·9 传送类指令中哪几个小类是访问RAM 的?哪几个小类是访问ROM 的?为什么访问ROM 的指令那么少?CPU 访问ROM 多不多?什么时候需要访问ROM?3·1·10 试绘图示明MCS 一51 系列单片机数据传送类指令可满足的各种传送关系。
3·1·11 请选用指令,分别到达以下操作: (1)将累加器内容送工作存放器R6.(2)将累加器内容送片内RAM 的7BH 单元。
(3)将累加器内容送片外RAM 的7BH 单元。
(4)将累加器内容送片外RAM 的007BH 单元。
(5)将ROM007BH 单元内容送累加器。
3·1·12 区分以下指令的不同功能:(l)MOV A,#24H 与MOV A.24H(2)MOV A,R0 与MOV A,@R0(3)MOV A,@R0 与MOVX A,@R03·1·13 设片内RAM 30H 单元的内容为40H;片内RAM 40H 单元的内容为l0H;片内RAM l0H 单元的内容为00H;(Pl)=0CAH。
MCS-51单片机实验第一部分软件实验 (2)软件实验一求一组数据的最大(小)值 (2)软件实验二二进制数转换为BCD数 (3)软件实验三二进制数转换为ASCII码 (3)第二部分硬件实验 (5)硬件实验一并行口输入、输出实验 (5)硬件实验二外部中断实验 (6)硬件实验三定时计数器实验 (9)硬件实验四串行通信实验 (11)第三部分综合实验 (13)综合实验一电子时钟 (13)第一部分软件实验软件实验一求一组数据的最大(小)值一、实验目的1.熟悉Keil μVision3软件,掌握C51语言程序的调试方法。
2.理解并掌握数组的定义及初始化。
3.熟悉并学会分支程序、循环程序的安排与设计。
二、实验设备装有Keil μVision3的计算机 1台三、实验内容••••1.用数组定义一组数据(如10个带符号数,每个占2字节),并赋初值;••••2.编程找出这组数的最大值、最小值,分别存在max、min变量中;••••3.编译后单步调试,打开Watches窗口和Memory窗口,观察变量值的变化以及它们在单片机存储器中的实际位置。
四、实验步骤1、建立项目文件:用鼠标单击【Project—New Project…】菜单命令,在弹出的“Creat New Project”窗口中选择项目保存的位置,在“文件名”后的框中输入项目文件名(可以与源程序文件名相同),单击“保存”。
并在弹出的窗口中选择器件型号。
2、建立源程序文件并添加到项目中:用鼠标单击【File—New…】菜单命令(或Create a new file),进入编辑窗口,在该窗口中输入源程序,单击【File—Save】菜单命令(或保存文件快捷按钮)保存文件(必须带扩展名)。
注意:用汇编语言写的程序,文件的扩展名为.ASM(必须写);如用C语言则扩展名为.C。
然后将该文件添加到项目中。
必要时对单片机的晶振频率、编译输出文件(.hex)进行设置。
3、编译程序:用鼠标单击【Project—Build target或Rebuild all target files】菜单命令(或相应的快捷按钮),对源文件进行编译。
MCS-51单片机应用实验教程课程设计1. 简介MCS-51单片机是一种高性能、低功耗单片机,广泛应用于各个领域。
本文主要介绍MCS-51单片机应用实验教程课程设计内容,以帮助初学者了解MCS-51单片机的应用。
2. 实验环境•Keil C51编译器•STC89C52RC单片机•电路板和外围器件•PC3. 实验内容3.1 实验1:LED流水灯LED流水灯是MCS-51单片机入门实验,可以让学生熟悉MCS-51单片机基本指令和寄存器的使用,以及加深对位运算的理解。
实现方法:通过MCS-51单片机的IO口和位运算实现8个LED灯的流水效果。
3.2 实验2:数码管显示数码管是一种常见的数字显示器件,通过数码管的显示,可以实现对数字的显示和闪烁等效果。
该实验可以让学生了解MCS-51单片机的定时器和中断服务程序的使用,以及对数码管的控制。
实现方法:通过MCS-51单片机的定时器,按照一定的时间间隔对数码管进行显示和闪烁。
3.3 实验3:按键控制LED灯按键开关是电子产品常用的一种输入方式,通过按键的不同状态可以控制LED等输出设备的开关。
该实验可以让学生了解MCS-51单片机的IO口的输入状态读取和控制。
实现方法:通过MCS-51单片机的IO口读取按键输入状态,通过位运算控制LED灯的开关。
3.4 实验4:外部中断实现按钮控制LED灯外部中断是MCS-51单片机的一种重要功能,通过外部中断可以实现对按钮的响应,进而实现对LED等设备的控制。
该实验可以让学生进一步了解MCS-51单片机的外部中断服务程序的使用和IO口管理。
实现方法:通过MCS-51单片机的外部中断输入,响应按键状态,并通过位运算控制LED灯的开关。
3.5 实验5:定时器PWM控制LED灯亮度通过调节LED灯的亮度,可以达到调节电子产品亮度的效果。
该实验可以让学生了解MCS-51单片机的定时器的PWM输出功能,以及通过PWM实现对LED等设备的亮度调节。
MCS—51单片机实验及课程设计指导书杨打生王忠远康瑞芳内蒙古电子信息职业技术学院2006.3目录实验实验一:WAVE软件使用实验二:常用指令的使用练习实验三:循环程序实验四:查表程序实验五:数制转换程序实验六实用子程序:(编程器的使用)实验七:输入检测与输出显示程序实验八:中断/定时程序课设一、课程设计目的和意义二、实验电路系统的结构和使用方法三、设计参考题目介绍和设计提示性思考题四、设计任务书及要求五、课程设计报告格式及要求六、考核办法七、课程设计内容及学时安排实验一:WAVE软件使用一、预习内容1、试验目的:学习WAVE软件安装和基本使用。
2、WAVE软件的安装选择WAVE文件夹下的SETUP.EXE文件并双击接着下一步最后到完成。
3、安装后写出软件窗口中工具栏中各按钮的名称。
参考说明书4、写出下面二实例各条指令的含义二、试验内容实例一指令的含义ORG 0000HMOV R0,#01HL1: MOV A,R0MOV P0,AINC R0AJMP L1END实例二ORG 0000H 指令的含义MOV R0,#01HL2: MOV A,R0MOV P2,ARL AMOV R0,ALJMP L2END1、打开WAVE见面,新建一个文件后输入实例一程序内容,并保存在我的文档名为A1.ASM ,执行编译按钮或项目菜单中的编译2、编译后,如正确扫描过去,不正确提示出错信息修改后再编译直到不提示错误为止。
3、打开窗口中的CPU窗口和数据窗口的CODE和DADE写出每条指令的机器操作代码。
4、打开窗口中的平排窗口,这样程序窗口、CPU窗口、数据存储器窗口就并排在整个屏幕。
5、点击单步按钮或F8键进行单步操作。
6、观测CPU窗口的A、P0和数据存储器窗口R0的状态并列表1记录每循环一次下列寄存器的值。
8、新建一个文件后输入实例二程序内容,并保存在我的文档名为A2.ASM ,执行编译按钮或项目菜单中的编译三、实验报告要求1、写出上述两试验程序各条指令的含义(与预习时相比是否一致)。
MCS-51单片机实验源程序仅供参考。
没有最好,只有更好!希望大家设计出更好的程序来。
软件实验一求一组数据的最大(小)值/*软件实验的目的:熟悉单片机常用的基本程序(算法),调试时观察变量(含数组)值的变化,从而理解程序的功能,了解变量(含数组)在单片机存储器中的具体位置。
*/int a[]={-1,2,-30,40,-500,600,-7000,8000,-32750,32765}; //任意给出10个int型数(围:-32768~+32767),放在数组a中void main(){unsigned char i;int max,min;max=min=a[0]; //max,min先取该组数据的第一个for(i=1;i<10;i++){if(a[i]>max) max=a[i];if(a[i]<min) min=a[i];}while(1); //没有什么要做了,则用该语句作为main函数的结尾,无限循环}附调试截图:注意:由于是纯软件实验(单片机没有进行实际的输入与输出),有些变量要声明为全局会被Keil软件编译时优化掉(即:一些语句没有真正生变量(如上面的数组a),否则可能..成执行代码),导致无法观察到正确结果。
软件实验二二进制(十六进制)数转换为BCD数//按流程图,编写程序如下:#define uchar unsigned charvoid main(){uchar x=0xA5; //设二进制数为1010 0101,在Keil中只能用十六进制0xA5或十进制165(不能直接用二进制形式)uchar a[3];a[2]=x/100;x=x%100;a[1]=x/10;x=x%10;a[0]=x;while(1);}//或者用for循环语句,先取出个位#define uchar unsigned charvoid main(){uchar x=0xA5;uchar i,a[3];for(i=0;i<3;i++){a[i]=x%10;x=x/10;}while(1);}软件实验三二进制(十六进制)数转换为ASCII码//将0-9、A-F的ASCII码做成表格(数组)放到程序存储器ROM中#define uchar unsigned charuchar code ascii[]={"0123456789ABCDEF"}; //ASCII码表放ROM中/*上句赋值也可写成{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, 0x41,0x42,0x43,0x44,0x45,0x46} *//* 还可写成{48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70} *//* 还可写成{'0','1','2','3','4','5','6','7','8','9','A','B','C','D', 'E','F'} */void main(){uchar x=0x5A; //设二进制数为0101 1010,在Keil中只能用十六进制0x5A或十进制90(不能直接用二进制形式)uchar cc,a[2];cc=x & 0x0f; //取x的低4位1010(即A)a[0]=ascii[cc]; //查表,a[0]存x低4位对应十六进制数(即A)的ASCII码cc=(x>>4)& 0x0f; //取x的高4位0101(即5)a[1]=ascii[cc]; //查表,a[1]存x高4位对应十六进制数(即5)的ASCII码while(1);}硬件实验一并行口输入、输出//P2做输出口,接8只LED,编写程序,使LED循环点亮(流水灯)#include<reg51.h>#include<intrins.h> //部函数_crol_,_cror_等的头文件void Delay(unsigned int x) //延时函数,在12MHz晶振下,延时约x ms {unsigned char i;while(x--)for(i=0;i<123;i++);}void main(){char a=0xfe;while(1){P2=a;Delay(500); //在12MHz晶振下,延时约500msa=_crol_(a,1); //循环左移,_cror_为循环右移}}//P3.2和P3.3做输入口,分别接两个拨动开关到GND;P2.7~P2.4做输出口,接4只LED,用来指示两个开关的闭合状态组合#include<reg51.h>void main(){char a;while(1){a=P3; //读入P3口状态a=a&0x0C; //a中只保留P3.3、P3.2的值,其余位清零if(a==0x0C) P2=0x7F; //P3.3=1开,P3.2=1开,则P2.7=0亮if(a==0x08) P2=0xbF; //P3.3=1开,P3.2=0合,则P2.6=0亮if(a==0x04) P2=0xdF; //P3.3=0合,P3.2=1开,则P2.5=0亮if(a==0x00) P2=0xEF; //P3.3=0合,P3.2=0合,则P2.4=0亮}}//用一个共阳七段数码管循环显示0-9和A-F,每个数显示0.5s#include<reg51.h>sbit P1_0=P1^0;char code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管段码(放在程序存储器ROM中)void Delay(unsigned int x) //延时函数,在12MHz晶振下,延时约x ms{unsigned char i;while(x--)for(i=0;i<123;i++);}void main(){ char j;P1_0=0; //位选信号while(1){for(j=0;j<16;j++){P0=TABLE[j];Delay(500);}}}硬件实验二外部中断//通过外部中断0(下降沿触发),启动或关闭流水灯,即上电复位时不亮,按一次INT0(P3.2)引脚的按钮,流水灯开启,再按一次,灯熄灭#include<reg51.h>#include<intrins.h> //部函数_crol_,_cror_等的头文件bit LED=0; //位变量LED用于记录流水灯的状态,0为关闭,1为开启void Delay(unsigned int x) //延时函数,在12MHz晶振下,延时约x ms{unsigned char i;while(x--)for(i=0;i<123;i++);}void INT0_srv(void) interrupt 0 //INT0中断号为0{Delay(10); //延时10ms,去抖动if(INT0==0) LED=!LED; //每次中断时切换LED开启或关闭}void main(){char a=0xfe;IT0=1; //下降沿触发EX0=1; //允许INT0中断EA=1;while(1){if(LED) //开启{P2=a;Delay(500); //在12MHz晶振下,延时约500msa=_crol_(a,1); //循环左移,_cror_为循环右移}else //关闭{P2=0xff;}}}//通过外部中断0(低电平触发),启动或关闭流水灯,即上电复位时不亮,按一次INT0(P3.2)引脚的按钮,流水灯开启,再按一次,灯熄灭#include<reg51.h>#include<intrins.h> //部函数_crol_,_cror_等的头文件bit LED=0; //位变量LED用于记录流水灯的状态,0为关闭,1为开启void Delay(unsigned int x) //延时函数,在12MHz晶振下,延时约x ms {unsigned char i;while(x--)for(i=0;i<123;i++);}void INT0_srv(void) interrupt 0 //INT0中断号为0{Delay(10); //延时10ms,去抖动if(INT0==0) LED=!LED; //每次中断时切换LED开启或关闭while(INT0==0); //如P3.2(INT0)还是0,则等待,变为1后才从中断返回}void main(){char a=0xfe;IT0=0; //低电平触发EX0=1; //允许INT0中断EA=1;while(1){if(LED) //开启{P2=a;Delay(500); //在12MHz晶振下,延时约500msa=_crol_(a,1); //循环左移,_cror_为循环右移}else //关闭{P2=0xff;}}}硬件实验三定时计数器//用单片机部定时器方式计时,实现每一秒钟P2口输出状态发生一次反转。
//设置定时器溢出时间为50ms,溢出20次则为1s//12MHz晶振下,部每个计数脉冲为1 s,50ms则需要50000个脉冲//在定时器方式1下初值为65536-50000//中断法#include<reg51.h>unsigned char count=20; //定时溢出次数void T0_int(void) interrupt 1//T0中断号为1{TH0=(65536-50000)/256; //每次溢出重新置初值TL0=(65536-50000)%256;count--;if(count==0) //溢出20次,即1s{count=20;P2=~P2;}}void main(){TMOD=0x01; //T0部定时,方式1TH0=(65536-50000)/256; //置初值TL0=(65536-50000)%256;ET0=1; //允许T0中断EA=1;TR0=1; //启动T0while(1); //循环等待}//查询法#include<reg51.h>unsigned char count=20; //定时溢出次数void main(){TMOD=0x01; //T0部定时,方式1,由TR0启动TH0=(65536-50000)/256; //置初值TL0=(65536-50000)%256;TR0=1; //启动T0while(1){while(!TF0); //等待定时溢出TF0=0; //溢出标志清零TH0=(65536-50000)/256; //溢出重新置初值TL0=(65536-50000)%256;count--;if(count==0) //溢出20次,即1s{count=20;P2=~P2;}}}//单片机对从P3.4(T0)输入的脉冲信号计数,T0工作于方式1,将计数结果送至P2口显示(二进制形式)//由于输出低电平时LED亮,故需反转后输出#include<reg51.h>void main(){TMOD=0x05; //T0外部计数,方式1,由TR0启动TH0=TL0=0; //置初值(可省略)TR0=1; //启动T0while(1){P2=~TL0; //将计数值实时送P2口显示,未考虑TH0}}//单片机对从P3.4(T0)输入的脉冲信号计数,T0工作于方式1,将计数结果用4位共阳数码管动态扫描显示(P0口输出段码,P1.0~P1.3分别选择千、百、十、个位,参见实验板原理图)#include<reg51.h>char code SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0~9的段码(放在程序存储器ROM中)char code bit_sel[]={0xf7,0xfb,0xfd,0xfe}; //个、十、百、千位选信号void Delay(unsigned int x) //延时函数,在12MHz晶振下,延时约x ms{unsigned char i;while(x--)for(i=0;i<123;i++);}void main(){unsigned int count;unsigned char k;TMOD=0x05; //T0外部计数,方式1,由TR0启动TH0=TL0=0; //置初值(可省略)TR0=1; //启动T0while(1){count=TH0*256+TL0; //将计数值送countfor(k=0;k<4;k++) //动态扫描显示{P1=bit_sel[k]; //输出位选信号P0=SEG[count%10]; //输出段码Delay(5);count=count/10;}}}硬件实验四串行通信//单片机甲用于串行发送,单片机乙用于接收。