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、写出上述两试验程序各条指令的含义(与预习时相比是否一致)。
一、实验目的1. 理解单片机外部中断的概念和工作原理。
2. 掌握MCS-51单片机外部中断的编程方法。
3. 通过实验验证外部中断在实际应用中的效果。
二、实验环境1. 实验设备:MCS-51单片机实验板、按键、LED灯、面包板、连接线等。
2. 开发环境:Keil uVision5软件。
三、实验原理外部中断是单片机的一个重要功能,用于响应外部事件。
当外部事件发生时,CPU可以暂停当前程序,转而执行中断服务程序,处理外部事件。
MCS-51单片机有两个外部中断源,即INT0和INT1。
四、实验内容1. 硬件连接将按键连接到单片机的INT0或INT1引脚,LED灯连接到单片机的某个I/O口。
具体连接方式如下:- 将按键的一端连接到单片机的INT0或INT1引脚,另一端连接到地。
- 将LED灯的正极连接到单片机的某个I/O口,负极连接到地。
2. 程序设计(1)初始化单片机```cvoid main() {EA = 1; // 开启总中断EX0 = 1; // 开启INT0中断IT0 = 1; // 设置INT0为下降沿触发P1 = 0xFF; // 初始化P1口为高电平,关闭LED灯 while(1) {// 主循环}}```(2)编写中断服务程序```cvoid ext0_isr() interrupt 0 {P1 = 0x00; // 点亮LED灯delay(500); // 延时0.5秒P1 = 0xFF; // 熄灭LED灯}```(3)编写延时函数```cvoid delay(unsigned int ms) {unsigned int i, j;for(i = 0; i < ms; i++)for(j = 0; j < 123; j++);}```3. 实验步骤1. 编写程序,并使用Keil uVision5软件进行编译和烧录。
2. 将程序烧录到单片机中,并连接好硬件电路。
3. 按下按键,观察LED灯是否闪烁。
单片机原理与应用实验报告学院(部):专业:学生姓名:班级:学号:最终评定成绩:实验一存储器读写一、实验目的:1、掌握寄存器、存储器读写等汇编指令;2、掌握编程软件编辑、编译、调试等基本操作。
二、实验仪器设备1.PC机,1台2.WAVE软件开发系统三、实验内容及步骤:1、将下面的汇编程序输入到W A VE集成开发软件中ORG 0000HSJMP STARTORG 0030HSTART:MOV R0,#07HMOV 70H,#08HMOV R1,#70HMOV DPTR,#2000HLOOP:MOVX A,@R1MOVX A,@DPTRINC R1INC ADJNZ R7,LOOPSJMP $END2、选择菜单“仿真器”→“仿真器设置”,按下图所示完成软件初始设置。
3、选择菜单“项目”下“编译”,编译通过后,选择“单步运行”,观察记录寄存器(R0、R1)、累加器(A)、程序状态字(PSW)、外部存储器(2000H单元)、I/O端口(P1)的数据变化。
四、源程序源程序:ORG 0000H ;定义起始地址SJMP STARTORG 0030HSTART:MOV R0,#07HMOV 70H,#08H ;给内部RAM的70H单元赋初值MOV R1,#70H ;使R1指向内部70H单元MOV DPTR,#2000H ;定义外部存储器开始单元LOOP:MOVX A,@R1 ;将R1所指向的70H的内容赋给AMOVX @DPTR,A;将A的内容赋给外部存储器单元INC R1 ;内部RAM地址加1INC DPTR ;外部存储器地址加1DJNZ R7,LOOP ;循环,直到RAM中70H~7FH;单元的内容全部相应赋给;外部2000H~2007H单元SJMP $END3、记录下程序单步运行时,寄存器(R0、R1)、累加器(A)、程序状态字(PSW)、外部存储器(2000H单元)、I/O端口(P1)的数据变化。
五、仿真效果图实验二I/O端口操作一、实验目的:1、掌握I/O端口读写等基本汇编指令;2、掌握单片机最小系统硬件电路设计及仿真软件PROTEUS仿真、调试等基本操作方法。
单片机原理与应用实验报告学校:合肥工业大学姓名:吕增威学号:班级:计算机科学与技术08-03班目录前言 ------------------------3 第一章 MC51 单片机原理及应用软件实验实验1:系统认识实验--------------------6实验6:数据排序实验(验证性)---------- 11第二章 MC51 单片机原理及应用硬件实验实验1:广告灯实验----------------------15实验2:P1 口实验(验证性)-------------21实验16:串口转并口实验 ----------------32 实验心得与体会---------------37前言一.单片机原理实验的任务单片机原理实验是单片机原理及应用课程的一部分,它的任务是:1.通过实验进一步了解和掌握单片机原理的基本概念、单片机应用系统的硬件设计及调试方法。
2.学习和掌握单片机应用系统程序设计技术。
3.提高应用计算机的能力及水平,提高逻辑动手能力。
二.实验设备单片机实验所使用的设备由计算机、单片机实验开发系统(,其中计算机是软件开发平台,主要完成程序编辑、编译、下载程序等任务;单片机实验开发系统是硬件开发平台,是基于51/196 单片机的扩展实验系统。
计算机和单片机实验开发系统之间是通过RS232 串行接口进行通信的。
单片机实验开发系统配有开关电源、单片机、晶振、存储器、可编程并行接口芯片、键盘显示控制芯片、24 键键盘、六位LED 数码管显示、A/D 及D/A 转换芯片、简单输出口2个、简单输入口1 个、逻辑电平输入开关、发光二极管显示电路,并配有小直流电机、步进电机、继电器、音响等驱动电路。
在计算机软件的控制下可完成单片机基本实验及综合3设计性实验项目。
所有的MCS51 单片机原理及应用课程实验都是在这套实验系统上完成的。
Keil与Proteus的联合使用: Keil C51 6.02的使用:1.打开Keil,新建一个程序文件(File--New),在上面输入要调试的程序,保存为*.asm格式;2.新建一个工程(project--Newproject),保存,在CPU选项了选择Atmel--AT89C51,点击确定,在弹出的选项框中选择“否”。
单片机仿真实验系统MCS-51实验指导书南昌大学本实验指导是为适应单片机原理与应用方面的课程需做大量软硬件实验的需要而编写的,供学生编程用。
完成本实验指导中的实验,可使学生基本掌握MCS-51单片机的结构原理、接口技术、程序设计技巧。
实验指导书中详细叙述了各实验的目的、内容,列出了接线图、程序框图和实验步骤。
单片机实验注意事项:1:主CPU为8032,需要扩充一片6264作为数据区,连接6264的读写信号到CPU的读写信号,连接CS1到A15;连接数据线,连接地址高低线;2:实验仪上的波段开关必须选择9600波特率,和51系统;3:接线和拔线时必须断电, PC微机必须与本实验系统保持联机状态,即软件界面右上角有编译进度条,确定连机状态才可调试程序;4:通过RS232通信接口,利用上位机实现用户程序的编辑、编译和调试运行。
在软件的设置栏内,点击仿真模式,选择系统、系统;注意:上位机的存盘文件名只能用英文字母和数字组合,长度不能超过8位且存盘路径必须在默认的C 盘DAIS目录下;5:系统接口实验电路为单元电路方式,数据总线以8芯扁平线形式引出,硬件学生连线为电路图上粗实线。
部分机器硬件介绍可参考微机原理实验指导书。
目录软件实验部分:实验一清零程序实验二拆字程序实验三拼字程序实验四数据区传送子程序实验五数据排序实验实验六查找相同数个数实验七无符号双字节快速乘法子程序实验八多分支程序实验九脉冲计数(定时/计数器实验)实验十电脑时钟(定时器、中断综合实验)硬件实验部分:实验一 P1口亮灯实验实验二 P1口转弯灯实验实验三 P3.3口输入,P1口输出实验四工业顺序控制实验五继电器控制实验六 8255控制交通灯实验七 LED16×16点阵显示实验实验八串并转换实验实验九 A/D转换实验实验十 D/A转换实验十一电子音响实验十二步进电机控制实验十三 8032串行口应用实验㈠——双机通信实验十四小直流电机调速实验软件实验部分本节共编了十个软件实验,通过这些实验程序的调试,使学生熟悉MCS-51的指令系统,了解程序设计过程,掌握汇编语言设计方法以及如何使用实验系统提供的调试手段来排除程序错误。
下面是一份基于C51的三用表源程序的示例:```c#include <reg51.h>sbit TRIG = P1^0; // 发射引脚sbit ECHO = P1^1; // 接收引脚sbit LED = P2^0; // LED指示灯void delay(unsigned int ms) {unsigned int i, j;for(i = 0; i < ms; i++) {for(j = 0; j < 114; j++);}}void main() {unsigned int distance;while(1) {TRIG = 0; // 发送低电平信号,准备下一次触发 delay(10);TRIG = 1; // 发送高电平信号,触发超声波测距 delay(10);TRIG = 0;while(!ECHO); // 等待接收引脚变高TL0 = 0; // 计时器0低8位清零TH0 = 0; // 计时器0高8位清零while(ECHO); // 等待接收引脚变低TR0 = 1; // 启动计时器0while(!ECHO); // 等待接收引脚变高TR0 = 0; // 关闭计时器0distance = TL0 | (TH0 << 8); // 读取计时器0的值if(distance <= 30) {LED = 1; // LED亮起} else {LED = 0; // LED熄灭}// 暂停500毫秒delay(500);}}```这是一个基于C51单片机的三用表源程序。
程序通过超声波模块测量距离,并根据测量结果控制一个LED指示灯的亮灭状态。
当距离小于等于30厘米时,LED亮起,否则LED熄灭。
程序通过计时器模块实现对超声波传感器测量时间的计时,通过引脚的输入输出来与硬件连接。
程序使用延时函数实现时间的精确控制和延时操作。
循环不断地进行测量和LED状态的更新,以实现三用表的功能。
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;}}}硬件实验四串行通信//单片机甲用于串行发送,单片机乙用于接收。