51单片机实验程序

合集下载

51单片机实验指导书

51单片机实验指导书

目录目录 0第一章实验装置 (1)一.伟福开发环境的使用 (1)二.LJD-SY-5100学习实验开发板的使用 (17)第二章微机原理及应用实验 (22)实验一开发环境的使用 (22)实验二数据传送 (23)实验三数码转换 (23)实验四数值运算 (24)实验五堆栈操作 (25)实验六查表操作 (25)实验七逻辑运算操作 (26)实验八中断及I/O口实验 (26)实验九串行通讯实验 (28)第一章实验装置一.伟福开发环境的使用1.菜单文件菜单选项●文件 | 打开文件打开用户程序,进行编辑。

如果文件已经在项目中,可以在项目窗口中双击相应文件名打开文件。

●文件 | 保存文件保存用户程序。

用户在修改程序后,如果进行编译,则在编译前,系统会自动将修改过的文件存盘。

●文件 | 新建文件建立一个新的用户程序,在存盘的时候,系统会要求用户输入文件名。

●文件 | 另存为将用户程序存成另外一个文件,原来的文件内容不会改变。

●文件 | 重新打开在重新打开的下拉菜单中有最近打开过的文件及项目,选择相应的文件名或项目名就可以重新打开文件或项目。

●文件 | 打开项目打开一个用户项目,在项目中,用户可以设置仿真类型。

加入用户程序,进行编译,调试。

系统中只允许打开一个项目,打开一个项目或新建一个项目时,前一项目将自动关闭。

伟福开发环境的项目文件包括仿真器设置,模块文件,包含文件。

仿真器设置包括仿真器类型,仿真头(POD)类型,CPU类型,显示格式和产生的目标文件类型,可以用以下几种方法设置仿真器。

✧在项目窗口中双击第一行,将打开仿真器设置窗口,对仿真器进行设置。

✧按鼠标右键,在弹出菜单中选择[仿真器设置]。

✧主菜单| 仿真器| 仿真器设置。

加入模块文件✧按鼠标右键,在弹出菜单中选择[加入模块文件]。

✧主菜单| 项目| 加入模块文件。

加入包含文件✧按鼠标右键,在弹出菜单中选择[加入包含文件]。

✧主菜单| 项目| 加入包含文件。

51单片机C程序设计100例

51单片机C程序设计100例

《单片机 C 语言程序设计实训 100 例---基于 8051 和 PROTEUS 仿真》案例
//延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1); //P0 的值向左循环移动 DelayMS(150); } } 03 /* 8 只 LED 左右来回点亮 名称:8 只 LED 左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
名称:LED 模拟交通灯 说明:东西向绿灯亮若干秒,黄 灯闪烁 5 次后红灯亮, 红灯亮后,南 北向由红灯变为绿灯,若干秒后南北 向黄灯闪烁 5 此后变红灯,东西向变 绿灯,如此重复。 */ #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; //东西向灯 sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P0^3; //南北向灯 sbit YELLOW_B=P0^4; sbit GREEN_B=P0^5; uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量
2 上海师范大学信息与机电工程学院—倪继锋
《单片机 C 语言程序设计实训 100 例---基于 8051 和 PROTEUS 仿真》案例
for(i=0;i<7;i++) { P2=_crol_(P2,1); //P2 的值向左循环移动 DelayMS(150); } for(i=0;i<7;i++) { P2=_cror_(P2,1); //P2 的值向右循环移动 DelayMS(150); } } } 04 /* 花样流水灯

51单片机实验手册

51单片机实验手册

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单片机分组控制灯实验步骤

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单片机实验手册

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单片机应用程序实例
图 9.1 3.系统板上硬件连线 (1. 把“单片机系统”区域中的 P3.7/RD 端口连接到“独立式键盘”区域中的 SP1 端口上; (2. 把“单片机系统”区域中的 P1.0-P1.4 端口用 8 芯排线连接到“八路发光二 极管指示模块”区域中的“L1-L8”端口上;要求,P1.0 连接到 L1,P1.1 连接到 L2,
广告灯的左移右移
1. 实验任务
做单一灯的左移右移,硬件电路如图 4.1 所示,八个发光二极管 L1-L8 分别接在单 片机的 P1.0-P1.7 接口上,输出“0”时,发光二极管亮,开始时 P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0 亮,重复循环。
2. 电路原理图
图 4.1
每次送出的数据是不同,具体的数据如下表 1 所示
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 L8 L7 L6 L5 L4 L3 L2 1111111 1111110 1111101 1111011
P1.0 L1 0 1 1 1
说明
L1 亮 L2 亮 L3 亮 L4 亮
1110111 1 1101111 1 1011111 1 0111111 1
一键多功能按键识别技术
1.实验任务 如图 9.1 所示,开关 SP1 接在 P3.7/RD 管脚上,在 AT89S51 单片机的 P1 端口接有四 个发光二极管,上电的时候,L1 接在 P1.0 管脚上的发光二极管在闪烁,当每一次按 下开关 SP1 的时候,L2 接在 P1.1 管脚上的发光二极管在闪烁,再按下开关 SP1 的时 候,L3 接在 P1.2 管脚上的发光二极管在闪烁,再按下开关 SP1 的时候,L4 接在 P1.3 管脚上的发光二极管在闪烁,再按下开关 SP1 的时候,又轮到 L1 在闪烁了,如此轮 流下去。 2.电路原理图

51单片机实训报告

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单片机秒表程序设计

51单片机秒表程序设计

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

相关文档
最新文档