51单片机实验程序
- 格式:doc
- 大小:36.92 KB
- 文档页数:16
目录目录 0第一章实验装置 (1)一.伟福开发环境的使用 (1)二.LJD-SY-5100学习实验开发板的使用 (17)第二章微机原理及应用实验 (22)实验一开发环境的使用 (22)实验二数据传送 (23)实验三数码转换 (23)实验四数值运算 (24)实验五堆栈操作 (25)实验六查表操作 (25)实验七逻辑运算操作 (26)实验八中断及I/O口实验 (26)实验九串行通讯实验 (28)第一章实验装置一.伟福开发环境的使用1.菜单文件菜单选项●文件 | 打开文件打开用户程序,进行编辑。
如果文件已经在项目中,可以在项目窗口中双击相应文件名打开文件。
●文件 | 保存文件保存用户程序。
用户在修改程序后,如果进行编译,则在编译前,系统会自动将修改过的文件存盘。
●文件 | 新建文件建立一个新的用户程序,在存盘的时候,系统会要求用户输入文件名。
●文件 | 另存为将用户程序存成另外一个文件,原来的文件内容不会改变。
●文件 | 重新打开在重新打开的下拉菜单中有最近打开过的文件及项目,选择相应的文件名或项目名就可以重新打开文件或项目。
●文件 | 打开项目打开一个用户项目,在项目中,用户可以设置仿真类型。
加入用户程序,进行编译,调试。
系统中只允许打开一个项目,打开一个项目或新建一个项目时,前一项目将自动关闭。
伟福开发环境的项目文件包括仿真器设置,模块文件,包含文件。
仿真器设置包括仿真器类型,仿真头(POD)类型,CPU类型,显示格式和产生的目标文件类型,可以用以下几种方法设置仿真器。
✧在项目窗口中双击第一行,将打开仿真器设置窗口,对仿真器进行设置。
✧按鼠标右键,在弹出菜单中选择[仿真器设置]。
✧主菜单| 仿真器| 仿真器设置。
加入模块文件✧按鼠标右键,在弹出菜单中选择[加入模块文件]。
✧主菜单| 项目| 加入模块文件。
加入包含文件✧按鼠标右键,在弹出菜单中选择[加入包含文件]。
✧主菜单| 项目| 加入包含文件。
51单片机实验手册吉林大学2018-6-3目 录1. 51单片机实验板介绍 (3)1.1各个模块介绍 (4)2. Keil工程建立 (5)3.实验板的配置与程序烧写 (10)3.1实验板的配置 (10)3.2烧写软件驱动的安装 (12)3.2烧写软件程序 (14)4.实验一8个led流水灯 (17)5.实验二数码管动态显示实验 (20)1.51单片机实验板介绍USB数据线接口九针串口接口PS2接口温度传感器接口独立按键图1-1 模块功能示意图1图1-2 模块功能示意图2 1.1各个模块介绍1:单片机芯片2:复位模块3:单片机晶振4:MAX232串口转换芯片5:9针串口6:USB接口7:电源插座8:下载芯片ch3409:电源开关10:MAX485芯片11:继电器模块12:蜂鸣器模块13:L6219步进电机驱动芯片14:74HC595驱动芯片15:五线四相步进电机驱动芯片16:点阵模块18:138译码器19:2*4位共阴数码管20:EEPROM 芯片,AT24C0221:74HC165扩展芯片22:74HC595数据输出接口:23:74HC595驱动芯片24:74HC595驱动芯片25:NE555模块26:DS1302时钟模块27:4*4矩阵按键模块28:8个独立按键29:交通灯模块30:AD/DA模块31:温度传感器接口32:红外传感器接口33:PS2接口32:AT下载接口2.Keil工程建立第一步:打开Keil编译器:创建项目:Project------New uVision Project第二步:创建一个文件夹来放工程相关的文件,给工程项目命名,点击保存:第三步:选择芯片类型,我们虽然使用的是STC90C516RD 或 STC89C52RC的单片机,但这里我们选择ATMEL------AT89C52这个芯片就行。
因为都是51的内核,STC和 ATMEL没有什么区别,只是厂商不同罢了。
选择完对应的芯片之后,点击OK。
51单片机分组控制灯实验步骤以下是基于51 单片机实现分组控制灯实验的基本步骤:
1. 硬件准备:
- 51 单片机开发板
- 连接线
- 不同颜色的LED 灯(根据需要选择)
2. 连接电路:
- 将LED 灯连接到单片机的I/O 口,确保每个LED 灯与一个单独的I/O 口相连。
3. 软件编写:
- 使用C 语言或汇编语言编写单片机程序。
- 定义LED 灯对应的I/O 口。
- 创建一个延时函数,用于控制灯的闪烁时间。
- 编写主函数,根据需要进行分组控制。
- 遍历每个分组,将相应的I/O 口设置为高电平或低电平,以控制灯的亮灭。
4. 编译和下载程序:
- 使用相应的编译器将编写的程序编译成可执行的hex 文件。
- 使用下载工具将hex 文件下载到单片机中。
5. 运行和测试:
- 连接单片机开发板到电源,并运行程序。
- 观察LED 灯的状态,确保每个分组的灯按照预期进行控制。
51单片机实验手册一、概述51单片机是一种经典的8位微控制器,具有广泛的应用领域。
本实验手册旨在提供详细的实验指导,帮助初学者快速入门,并为进一步的学习提供基础。
二、实验准备在进行51单片机实验之前,我们需要准备以下材料:1. 一块51单片机开发板2. USB数据线或者串口线3. 电脑及编程软件4. 面包板及对应的连接线5. 红、绿、蓝LED以及相应的电阻三、实验一:LED闪烁LED闪烁是最基础的实验之一,通过控制51单片机的I/O口状态,使LED灯交替亮灭。
1. 连接电路将51单片机的VCC引脚连接到正极,GND引脚连接到负极,将LED的长脚连接到P1.0引脚,短脚连接到GND引脚。
2. 编写程序使用C语言编写如下程序:```c#include <reg52.h>void main() {while(1) {P1 = 0x00; // P1置低电平,LED灯熄灭Delay(1000); // 延时1秒P1 = 0xFF; // P1置高电平,LED灯点亮Delay(1000); // 延时1秒}}void Delay(unsigned int t) {while (t--);}```3. 烧录程序将编写好的程序通过编程软件下载到51单片机中。
4. 运行实验将USB数据线或串口线连接到51单片机开发板和电脑,将开发板上的开关打开,观察LED灯的闪烁情况。
四、实验二:数码管显示通过控制51单片机的I/O口状态,驱动数码管显示数字。
1. 连接电路将51单片机的VCC引脚连接到正极,GND引脚连接到负极,将数码管的A、B、C、D、E、F、G引脚分别连接到P1.0、P1.1、P1.2、P1.3、P1.4、P1.5、P1.6引脚。
2. 编写程序使用C语言编写如下程序:```c#include <reg52.h>unsigned char code segment[] = { // 数码管段码表0x3F, // 数字00x06, // 数字10x5B, // 数字20x4F, // 数字30x66, // 数字40x6D, // 数字50x7D, // 数字60x07, // 数字70x7F, // 数字80x6F // 数字9};void main() {unsigned int i;while(1) {for(i = 0; i < 10; i++) {P1 = segment[i]; // 依次在数码管上显示数字0-9 Delay(1000); // 延时1秒}}}void Delay(unsigned int t) {while (t--);}```3. 烧录程序将编写好的程序通过编程软件下载到51单片机中。
51单片机实训报告一、引言51单片机是一种常用的微控制器,具有体积小、功耗低、功能强大等优点,广泛应用于各种电子设备中。
本文将介绍本次实训的目标、实验步骤、实验结果以及实训中遇到的问题及解决方案。
二、实训目标本次实训的目标是通过51单片机的学习和实践,掌握单片机的基本原理和编程技巧。
具体来说,我们需要实现以下几个功能:1. 熟悉51单片机的硬件组成和工作原理;2. 学习使用Keil C编译器进行单片机程序的编写和调试;3. 掌握基本的输入输出控制方法,如LED灯的控制、数码管的显示等;4. 学习使用定时器、中断等功能模块,实现一些实际应用,如蜂鸣器的发声、电机的控制等。
三、实验步骤1. 硬件准备:将51单片机与外围电路进行连接,如连接LED灯、数码管、蜂鸣器等;2. 编写程序:使用Keil C编译器编写相应的程序,包括引入头文件、定义宏、声明变量、编写主函数等;3. 调试程序:将程序下载到51单片机中,通过单片机的调试功能进行程序的调试,排除可能存在的错误;4. 运行程序:将调试好的程序运行在51单片机上,观察实验结果是否符合预期。
四、实验结果在本次实训中,我们顺利完成了以下几个实验:1. LED灯闪烁:通过控制51单片机的输出口,使LED灯以一定频率进行闪烁;2. 数码管显示:通过控制51单片机的输出口,使数码管显示指定的数字或字符;3. 蜂鸣器发声:通过控制51单片机的输出口,产生一定频率的方波信号,使蜂鸣器发出相应的声音;4. 电机控制:通过控制51单片机的输出口,控制电机的转动方向和速度。
五、实训中遇到的问题及解决方案在实训过程中,我们遇到了一些问题,但通过团队的共同努力和老师的指导,最终都得到了解决。
下面列举了其中的几个问题及解决方案:1. 问题:LED灯无法闪烁;解决方案:检查LED灯的连接是否正确,确认是否存在接触不良或短路等问题。
2. 问题:数码管无法正常显示;解决方案:检查数码管的连接是否正确,确认是否存在引脚连接错误或接触不良等问题。
51单片机秒表程序设计1. 简介秒表是一种用于测量时间间隔的计时器,常见于体育比赛、实验室实验等场合。
本文将介绍如何使用51单片机设计一个简单的秒表程序。
2. 硬件准备•51单片机开发板•LCD液晶显示屏•按键开关•连接线3. 程序流程3.1 初始化设置1.设置LCD液晶显示屏为8位数据总线模式。
2.初始化LCD液晶显示屏。
3.设置按键开关为输入模式。
3.2 主程序循环1.显示初始界面,包括“00:00:00”表示计时器初始值。
2.等待用户按下开始/暂停按钮。
3.如果用户按下开始按钮,则开始计时,进入计时状态。
4.如果用户按下暂停按钮,则暂停计时,进入暂停状态。
5.在计时状态下,每隔1毫秒更新计时器的数值,并在LCD液晶显示屏上显示出来。
6.在暂停状态下,不更新计时器的数值,并保持显示当前数值。
3.3 计时器控制1.定义一个变量time用于存储当前的计时器数值,单位为毫秒。
2.定义一个变量running用于标记计时器的状态,0表示暂停,1表示运行。
3.定义一个变量start_time用于存储计时器开始的时间点。
4.定义一个变量pause_time用于存储计时器暂停的时间点。
5.在计时状态下,每隔1毫秒更新time的值为当前时间与start_time的差值,并将其转换为小时、分钟、秒的表示形式。
6.在暂停状态下,保持time的值不变。
3.4 按键检测1.检测按键开关是否被按下。
2.如果按键被按下,判断是开始/暂停按钮还是复位按钮。
3.如果是开始/暂停按钮,并且当前处于计时状态,则将计时状态设置为暂停状态,并记录暂停时间点为pause_time;如果当前处于暂停状态,则将计时状态设置为运行状态,并记录开始时间点为当前时间减去暂停时间的差值。
4.如果是复位按钮,则将计时器数值重置为0,并将计时状态设置为暂停。
4. 程序代码示例#include <reg51.h>// 定义LCD控制端口和数据端口sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_EN = P1^2;sbit LCD_D4 = P1^3;sbit LCD_D5 = P1^4;sbit LCD_D6 = P1^5;sbit LCD_D7 = P1^6;// 定义按键开关端口sbit START_PAUSE_BTN = P2^0;sbit RESET_BTN = P2^1;// 定义全局变量unsigned int time = 0; // 计时器数值,单位为毫秒bit running = 0; // 计时器状态,0表示暂停,1表示运行unsigned long start_time = 0; // 开始时间点unsigned long pause_time = 0; // 暂停时间点// 函数声明void delay(unsigned int ms);void lcd_init();void lcd_command(unsigned char cmd);void lcd_data(unsigned char dat);void lcd_string(unsigned char *str);void lcd_clear();void lcd_gotoxy(unsigned char x, unsigned char y);// 主函数void main() {// 初始化设置lcd_init();while (1) {// 显示初始界面lcd_clear();lcd_gotoxy(0, 0);lcd_string("00:00:00");// 等待用户按下开始/暂停按钮while (!START_PAUSE_BTN && !RESET_BTN);// 判断按钮类型并处理计时器状态if (START_PAUSE_BTN) {if (running) { // 当前处于计时状态,按下按钮将进入暂停状态 running = 0;pause_time = time;} else { // 当前处于暂停状态,按下按钮将进入计时状态running = 1;start_time = get_current_time() - pause_time;}} else if (RESET_BTN) { // 复位按钮按下,重置计时器time = 0;running = 0;}}}// 毫秒级延时函数void delay(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--) {for (j = 110; j > 0; j--);}}// LCD初始化函数void lcd_init() {lcd_command(0x38); // 设置8位数据总线模式lcd_command(0x0C); // 显示开,光标关闭lcd_command(0x06); // 光标右移,不移动显示器lcd_command(0x01); // 清屏}// 向LCD发送指令函数void lcd_command(unsigned char cmd) {LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;LCD_D4 = cmd >> 4 & 1;LCD_D5 = cmd >> 5 & 1;LCD_D6 = cmd >> 6 & 1;LCD_D7 = cmd >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = cmd >> 0 & 1;LCD_D5 = cmd >> 1 & 1;LCD_D6 = cmd >> 2 & 1;LCD_D7 = cmd >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送数据函数void lcd_data(unsigned char dat) { LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;LCD_D4 = dat >> 4 & 1;LCD_D5 = dat >> 5 & 1;LCD_D6 = dat >> 6 & 1;LCD_D7 = dat >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = dat >> 0 & 1;LCD_D5 = dat >> 1 & 1;LCD_D6 = dat >> 2 & 1;LCD_D7 = dat >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送字符串函数void lcd_string(unsigned char *str) {while (*str) {lcd_data(*str++);delay(5);}}// 清屏函数void lcd_clear() {lcd_command(0x01);}// 设置光标位置函数void lcd_gotoxy(unsigned char x, unsigned char y) {unsigned char addr;if (y == 0)addr = x | (0x80 + y);else if (y == 1)addr = x | (0xC0 + y);lcd_command(addr);}5. 总结本文介绍了使用51单片机设计一个简单的秒表程序。
《信息技术综合实践》课程实验报告
1.打开KeiluVision2应用程序,新建一个工程,将IO.c文件添加到新建的工程中(将头文件中的头文件中的regx修改为reg),在输出中选择生成相应的HEX文件并保存到相应文件夹中
2.打开KeiluVision2应用程序,新建一个工程,将IO.c文件添加到新建的工程中(将头文件中的头文件中的regx修改为reg),在输出中选择生成相应的HEX文件并保存到相应文件夹中,进行文件的编译和调试。
3.进行实验箱的连线。
4.打开下载器,擦除并将生成的HEX文件调入Flash,然后选择“自动”。
5.通过示波器观察实验现象
5.1 示波器波形图
5.1.1(i的范围是小于500,波形图如下所示)
由图可知:当不修改i的范围时,波形的频率比较高,约在150Hz左右。
5.1.2(将代码中i的范围修改为小于20000,波形图如下所示)
由图可知:将i的范围变大以后,波形的频率变低并且稳定在5Hz左右。
5.2 小灯闪烁视频
(灯亮时的图片)。
.51系列单片机原理与应用实验华南师范大学物理与工程工程学院微机教研室20010年9月目录实验须知 (2)实验一数字量输入输出实验 (4)实验二交通灯控制实验 (6)实验三定时与中断实验 (8)实验四串行通信实验 (11)实验五串行A/D转换实验 (13)实验六现实人体视觉暂留特性测试实验 (14)实验七实时时钟制作实验 (17)实验八简易电子琴制作实验 (18)实验九 EEPROM应用—数字密码锁 (20)实验十综合实验:教学板自检程序设计 (25)实验十一数据采集—火灾报警装置的软硬件设计 (26)附录一实验教学板 (27)附录二实验用软件使用说明 (28)实验须知一、预习要求1.实验前认真阅读实验指导书的相关内容,明确实验目的和实验任务。
2.实验前应做好预习报告,在报告中,要求画出所设计的实验电路原理图、程序流程图,编写好程序,并对程序加以注释,还要拟订好实验步骤。
二、实验要求1.按实验中心安排的时间到指定实验室上实验课,不要迟到、缺席。
有特殊原因不能在原安排时间来实验时,须提前一天通知实验中心负责教师。
2.认真完成每次实验的各项任务,实验结果要请指导教师检查。
教师对实验内容提问,并对完成者进行记录。
3.爱护设备,保持清洁,不得在实验室内大声喧哗,不要将食物带入实验室,不擅自更换设备。
4.在实验箱(板)通电状态下,不要用手随意触摸电路板上除按键和开关以外的芯片等其它元器件。
,严禁带电操作,即所有接线、改线和拆线操作均应在不带电的状态下进行。
5.实验中若发生异常情况应立即切断电源,并向指导教师报告,检查原因,避免再次发生类似情况。
6.实验完毕,请整理好实验设备后再离开实验室。
三、实验报告要求实验报告必须使用实验报告专用纸,书写要工整、清楚,并在下一次实验时交给指导教师。
实验报告应包括以下内容:1.实验名称、实验人姓名、学号、班级、同组人姓名。
2.实验目的、任务(内容)。
3.各任务程序流程图、自编程序清单,对程序须给出适量注释(例如:变量和某些寄存器的作用,关键程序段的功能等)。
333。
(x为0x2~+x39的整数)用查表方式编写y=x1 +#include<reg51.h>void main(){将对应的每位数字的三次方的值0~9code int a[10]={0,1,8,27,64,125,216,343,512,729};//存入中,为程序存储器,当所存的值在或之间的话就用,charcode0~255code-128~+127而现在的值明显超过这个范围,用较合适。
的范围是或。
0~65535int-32768~32767int此处定义根据习惯,也可写成但是变量一定要用来int char x1,x2,x3 int y,x1,x2,x3;//y定义。
x1=2;x2=4;三个的值是自定的,只要是当中的数值皆可,也可重复。
//x1,x2,x30~9 x3=9; y=a[x1]+a[x2]+a[x3]; 单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。
// while(1);}结果的查询在软件内部,在仿真界面点击右下角(一般初始位置是右下角)的Keilvision//的框架内双击“”文字输入后按回车,右侧会显示其进16watchdouble-click or F2 to addy制数值如,鼠标右键该十六进制,选择第一行的可查看对应的进制数。
0x3410decimal,1、有10个8位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的数据(1的个数为偶数)都要存到内RAM50H开始的数据区中。
试编写有关程序。
#include<reg51.h>void main(){将所要处理的值存入中,这些可以根据RAM int a[10]={0,1,5,20,24,54,64,88,101,105};//个人随意设定,但建议不要超过的范围。
0~255定义一个变量//char i;定义一个指针指向内部这个地址。
*q char *q=0x50; //0x50循环,共十次,也可以用for(i=0;i<10;i++) for(i=9;i>=0;i--)//9~0{将的值赋给累加器ACC a[i]ACC=a[i];//位上的奇偶校验位,如果累加器内数值的个数为偶数那么1//PSW0ACC if (P==0)为,若为奇数,为。
这里的是大写的。
0PPP1{*q=a[i];每赋一个值,指针挪一个位置指向下一个。
q++;//}}同实验一,程序不能停。
// while(1);}3.有10个8位带符号二进制数,请将10个数按从小到大的顺序排列,并存到内RAM50H开始的单元中。
#include<reg51.h>void main(){将所有值存入中,因为有负RAM;// char data a[10]={-50,-36,0,-128,1,99,127,89,-89,40}数,所以不能用。
因为是所以假设的数值不要超过之外charunsigned char-128~+127定义指针指向0x50 //*q unsigned char *q=0x50;unsigned char i,j;定义三个变量,用于循环及换位。
在换位时有赋值,所以要用不能用chart char t; //。
unsigned char for(i=0;i<10;i++)冒泡法,具体可以参考语言程序设计的书。
C for(j=0;j<10-i;j++)//{if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}将已经排好序的数组存入指向的地址。
*q for(i=0;i<10;i++) //{*q=a[i];q++;}while(1);}1、基本部分:(1)P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
#include<reg51.h>定义延迟函数,用于后面灯亮的持续时间。
//LED void delay(unsigned char x){unsigned char i,j,k;do{for(i=10;i>0;i--)for(j=100;j>0;j--)for(k=249;k>0;k--);}while(--x);}main(){第一个灯亮//11111110 P1=0xfe; while(1){delay(1);//延时500ms左移一个位即具体跟的区别与具体细节可联系<<P1=P1<<1|1;//P1crol11111101我与你讲解if(P1==0XFF){P1=0XFE;}}}(2)P1.0、P1.1作输入口接两个拨动开关,P1.2、P1.3作输出口,接两个发光二极管,编写程序读取开关状态,将此状态,在发光二极管上显示出来。
编程时应注意P1.0、P1.1作为输入口时应先置1,才能正确读入值。
#include<reg51.h>sbit p1_0=P1^0;sbit p1_1=P1^1;sbit p1_2=P1^2;程序不能对单个引脚进行编程,需要用定义才可用。
sbit p1_3=P1^3;//sbitmain(){前两个引脚置一是为了让其能获取输入信号,后两个//p1_0=1;p1_1=1;p1_2=1;p1_3=1;引脚是赋初值,方便后面取反工作。
while(1){判断的引脚是否有变化。
//P1.0if(!p1_0) {如果引脚变化,引脚也跟随变化。
//P1.0P1.2p1_2=!p1_2;}判断的引脚是否有变化。
//P1.1if(!p1_1) {如果引脚变化,引脚也跟随变化。
P1.3p1_3=!p1_3;//P1.1}}}2、扩展部分:(1)利用P1口控制发光二极管LED灯按照下面方式工作:a)LED灯从左到右依次点亮;b)LED灯从右到左依次点亮;。
500msc)按照以上步骤重复运行,其中要求灯亮的时间为#include <reg51.h>void delay(unsigned char x){unsigned char i,j,k;do{for(i=10;i>0;i--)for(j=100;j>0;j--)for(k=249;k>0;k--);}while(--x);}main(){无限循环里面的内容//while(1){右移完毕后赋初值,为左移做准备// P1=0XFE;delay(1);while(1){如果左移右移是单个灯移动的话,那么这句改为LED=LED<<1|1;//P1=P1<<1;就可以了。
delay(1);判断左移是否完毕,完毕跳出此次的while//break if(P1==0x00)break;}左移完毕后给赋初值,准备右移//P1P1=0x7f;delay(1);while(1){如果左移右移是单个灯移动的话,那么这句改为//P1=P1>>1;就可以了。
LED=LED>>1|0x80; delay(1);判断右移是否完毕,完毕后跳出break if(P1==0x00)//break;}}}(2)利用P1口控制发光二极管LED灯按照下面方式工作:a)从左到右奇数LED灯依次点亮;b)从右到左偶数LED灯依次点亮;c)按照以上步骤重复运行,其中要求灯亮的时间为500ms。
//此程序也可以用<<和>>来实现,具体细节可以来问我#include<reg51.h>//当程序中有涉及到_crol_或者_nop_等库函数时,必须添#include<intrins.h>加此头文件。
void delay(unsigned char x){unsigned char i,j,k;do{for(i=10;i>0;i--)for(j=100;j>0;j--)for(k=249;k>0;k--);}while(--x);}main(){//无限循环括号里的内容while(1){//第一个灯亮, P1=0xfe;while(1){delay(1);//P1左移两个位置P1=_crol_(P1,2);//判断左移结束if(P1==0xfe)break;}P1=0X7f;while(1){delay(1);//P1右移两个位置P1=_cror_(P1,2);//判断右移结束 if(P1==0x7f)break;}}}#include<reg51.h>500ms延时函数//void delay(unsigned char x).{unsigned char i,j,k;do{for(i=10;i>0;i--)for(j=100;j>0;j--)for(k=249;k>0;k--);}while(--x);}main(){//无限循环括号里的内容while(1){//赋值,为左移做准备 P1=0xfe; delay(1); while(1){//P1左移一个位置,补位补的是1。
此处不明白P1=(P1<<1)|0x01;可以找我。
//P1左移一个位置,补位补的是0。
P1=P1<<1;delay(1);//左移结束,跳出循环if(P1==0xaa)break;}//P1赋值,为右移做准备 P1=0X7f;delay(1);while(1){//P1右移一个位,补位补的是1,同样的,不P1=(P1>>1)|0x80;明白来找我//P1右移一个位P1=P1>>1;delay(1);//判断右移是否完毕,退出此次循环。
if(P1==0x55)break;}}}本实验模拟交通信号灯控制,一般情况下正常显示,有急救车到达时,两个方向交通信号灯全红,以便让急救车通过。
设急救车通过路口时间为5秒,急救车通过后,交通恢复正常,本实验用单次脉冲申请外部中断,表示有急救车通过。
#include<reg51.h>//设置unsigned char x,y,i,j,k;//定义四个变量用于记录中断时的现场,以便恢unsigned char d0,d1,d2,d3;复现场。
void delay(x)//延时函数{do{for(i=10;i>0;i--)for(j=100;j>0;j--)for(k=249;k>0;k--);}while(--x);}//定义中断函数,无需声明。
interrupt 0表示外部中断0的zd() interrupt 0 中断函数{y=P1;d0=x;d1=i;d2=j;//记录中断时P1的值,延时函数的x,i,j,k也要记录。
d3=k;//P1应为东西红南北红,所以设为F6。