单片机控制左右来回循环的流水灯

合集下载

51单片机流水灯程序

51单片机流水灯程序

51单片机流水灯程序51单片机是一种广泛使用的微控制器,具有丰富的IO端口和定时器资源。

流水灯程序是51单片机入门的基础示例之一,通过多个LED灯按照一定顺序逐个亮起或熄灭,形成流水灯的效果。

下面详细介绍51单片机流水灯程序的编写。

一、硬件连接要实现流水灯效果,需要将多个LED灯连接到51单片机的IO端口上。

一般使用P1端口作为输出端口控制LED灯的亮灭,P2端口作为输出口控制LED灯亮起的顺序。

具体连接方式如下:•将LED灯的阳极通过限流电阻连接到VCC。

•将每个LED灯的阴极通过限流电阻连接到P1端口。

•将P2端口的每个引脚依次连接到每个LED灯的阴极。

二、程序实现#include <reg52.h> //包含51单片机头文件#define LED P1 //定义LED为P1端口#define ORDER P2 //定义顺序控制为P2端口void delay(unsigned int t); //延时函数声明void main(){unsigned char i;while(1) //循环控制流水灯效果{for(i=0; i<8; i++) //控制8个LED灯{LED = 0x01<<i; //将第i个LED灯置亮delay(10000); //延时一段时间,使LED灯亮起后延时熄灭LED = 0x01>>(i+1); //将第i个LED灯置灭}}}void delay(unsigned int t) //延时函数定义{unsigned int i, j;for(i=0; i<t; i++){for(j=0; j<1275; j++);}}该程序首先定义了LED和ORDER两个变量,分别对应P1和P2端口的输出口。

在主函数中,使用一个while循环控制流水灯效果。

在循环内部,使用一个for循环控制8个LED灯的状态。

在每次循环中,先将第i个LED灯置亮,延时一段时间后将其置灭,然后进入下一个循环。

左右来回循环的流水灯实验报告

左右来回循环的流水灯实验报告

青 岛 科 技 大 学微机原理与接口技术综合课程设计(报告)题 目 __________________________________指导教师__________________________ 学生姓名__________________________ 学生学号_________________________________________________________院(部)____________________________专业________________班______年 ___月 ___日直流电机控制综合实验 周艳平宋雪英 01信息科学技术学院 计算机科学与技术0961 2012 12 27摘要 (2)1、单片机概述 (2)2、仿真软件介绍 (2)3、需求分析 (3)一、课程设计目的 (3)二、课程设计要求 (4)三、实验内容 (4)1、设计任务与要求 (4)2、系统分析 (4)1).硬件电路设计(画出原理图、接线图) (5)2)软件框图 (7)3、用keil建项目流程 (8)4、程序清单 (9)4、系统调试 (11)四、设计总结(结论) (12)摘要近年来,随着电子技术和微型计算机的发展,单片机的档次不断提高,起应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到广泛的应用、成为现代电子系统中最重要的智能化的核心部件。

而AT89C51就是其中一种,它是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMO8位微处理器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

本课程设计介绍一种LED小灯控制系统的设计方法,以单片机作为主控核心,与按键、排阻、电阻、电容等较少的辅助硬件电路相结合,利用软件实现对LED灯进行控制。

能够通过按键控制8个LED小灯从左到右依次点亮。

关键字:单片机、LED流水灯1、单片机概述单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。

(完整版)51单片机流水灯程序

(完整版)51单片机流水灯程序

1.第一个发光管以间隔200ms 闪烁。

2.8 个发光管由上至下间隔1s 流动,其中每个管亮500ms, 灭500ms 。

3.8 个发光管来回流动,第个管亮100ms 。

4.用8 个发光管演示出8 位二进制数累加过程。

5.8 个发光管间隔200ms 由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms 间隔全部闪烁 5 次。

重复此过程。

6.间隔300ms 第一次一个管亮流动一次,第二次两个管亮流动,依次到8 个管亮,然后重复整个过程。

7.间隔300ms 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8 个全部闪烁 3 次;关闭发光管,程序停止。

1#include<reg52.h>#define uint unsigned intsbit led 仁P"0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x--) for(y=100;y>0;y--);}#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit p P1A0; uchar a;void delay(); void main() {a=0xfe;P1=a;while(1){ a=_crol_(a,1); delay();P1=a; delay();}}void delay(){uint b; for(b=55000;b>0;b--);}3#include<reg52.h>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void delay() {uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--);}void main() {uchar a,i;while(1)a=0xfe; for(i=0;i<8;i++){P1=a; delay(100); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(100); a=_cror_(a,1);4#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint a) { uint x,y; for(x=a;x>0;x--) for(y=110;y>0;y--);}void main() {uchar b;while(1){b++;P1=~b; delay(200);5#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void main() { uchar a,i,j;while(1){ for(j=0;j<2;j++){a=0xfe; for(i=0;i<8;i++){P1=a;delay(200); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(200); a=_cror_(a,1);}}P1=0xff; for(j=0;j<10;j++) {delay(300);P1=~P1;}}}void delay(){uint x,y; for(x=200;x>0;x--) for(y=110;y>0;y--); 6 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=300;x>0;x--) for(y=110;y>0;y--);} void main(){uchar a,i,j; while(1) {a=0xfe; for(j=0;j<8;j++) { for(i=0;i<8-j;i++) {P1=a; delay(200); a=_crol_(a,1);} a=_crol_(a,j); P1=0xff; a=a<<1;}} }7#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint z){uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar a,i,j;for(j=0;j<3;j++){P1=0x55;delay(300);P1=0xaa; delay(300);}for(j=0;j<3;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(300); a=_crol_(a,1);}}P1=0xff; for(j=0;j<3;j++){P1=0x7e;delay(300);P1=0xbd; delay(300);P1=0xdb; delay(300);P1=0xe7; delay(300);}P1=0xff;for(j=0;j<3;j++){P1=0xe7;delay(300);P1=0xdb;delay(300);P1=0xbd;delay(300);P1=0x7e;delay(300);}P1=0xff; for(j=0;j<6;j++) {P1=~P1; delay(300);}P1=0xff;while(1);}。

单片机控制左右来回循环的流水灯

单片机控制左右来回循环的流水灯

左右往返循环的流水灯设计要求8 个发光二极管 LED0~ LED7经限流电阻分别接至P1 口的~引脚上,阳极共同接高电平。

编程实现制作左右往返循环的节日彩灯,显示规律以下列图所示。

题 37 图节日彩灯的花式显示的规律为了使显示成效更为绚烂多彩, P1 端口 8 个引脚分别接有不一样颜色的发光二极管。

详细如题37 表所示。

题 37 表P1 口 8 个引脚的不一样颜色的发光二极管P1 口引脚发光二极管的颜色红色 LED蓝色 LED绿色 LED黄色 LED红色 LED蓝色 LED绿色 LED黄色 LED使用 C51 编流水灯程序以及设计相应的硬件电路十分简单,且有多种方法。

本方案力争程序最简化最清楚原则,用 NS 图(盒图)表示算法以下:程序中设置中间变量temp 用来给 P1 口赋值,命令 _crol_ 和_cror_ 用于使 temp 左移或右移,比如当 temp=B 时,履行 _crol_(temp,1) 以后 temp= ,应用此两条语句一定把头文件 <>包含进来。

所有代码以下:#include<> #include<>unsigned char temp; // 定义字符变量temp,temp 左移或右移并给连结LED 的 P1 口赋值int a;// 定义延缓函数 delay()void delay(void); void main() {temp=0xfe; // 给 temp 赋初值P1=temp; //temp 赋值给 P1 口,第一个 LED (红色)点亮 while(1) // 主程序,括号中的程序将向来循环{for(a=0;a<7;a++)// 左移部分, LED 从左到右挨次点亮{temp=_crol_(temp,1);//_crol_ 语句控制变量temp 左移delay();// 每个灯点亮以后延缓一会在点下一个灯P1=temp;}for(a=0;a<7;a++)// 右移部分,LED从右到左挨次点亮{temp=_cror_(temp,1);// 第8 个灯点亮后开始右移程序,LED从右向左点亮delay();P1=temp;}}}void delay(){// 延时子程序int i,j;for(i=200;i>0;i--)// 定义局部变量i,j//i,j 不停计数占用CPU 时间,达到延时目的for(j=1;j<150;j++); }电路连结以下:。

实验三流水灯实验(io口和定时器实验)

实验三流水灯实验(io口和定时器实验)

实验三流水灯实验(I/O口和定时器实验)一、实验目的1.学会单片机I/O口的使用方法和定时器的使用方法;2.掌握延时子程序的编程方法、内部中断服务子程序的编程方法;3.学会使用I/O口控制LED灯的应用程序设计。

二、实验内容1.控制单片机P1口输出,使LED1~LED8右循环轮流点亮(即右流水),间隔时间为100毫秒。

2.控制单片机P1口输出,使LED1~LED8左循环轮流点亮(即左流水),间隔时间为100毫秒。

3.使用K1开关控制上面LED灯的两种循环状态交替进行;4. 用定时器使P1口输出周期为100ms的方波,使LED闪烁。

5.使用定时器定时,使LED灯的两种循环状态自动交替,每一种状态持续1.6秒钟(选作)。

三、实验方法和步骤1.硬件电路设计使用实验仪上的E1、E5和E7模块电路,把E1区的JP1(单片机的P1口)和E5区的8针接口L1~L8(LED的驱动芯片74HC245的输入端)连接起来,P1口就可以控制LED 灯了。

当P1口上输出低电平“0”时,LED灯亮,反之,LED灯灭。

E7区的K1开关可以接单片机P3.0口,用P3.0口读取K1开关的控制信号,根据K1开关的状态(置“1”还是置“0”),来决定LED进行左流水还是右流水。

综上,画出实验电路原理图。

2.程序设计实验1和实验2程序流程图如图3-1实验3程序流程图如图3-2所示。

图3-1 实验1,2程序流程图图3-2 实验3程序流程图实验4程序流程图如图3-3,3-4所示。

实验5程序流程图如图3-5,3-6所示。

图3-5 实验5主程序流程图图3-6 定时器中断服务子程序流程图图3-4 定时器中断服务子程序流程图图3-3 实验4主程序流程图编程要点:(1)Pl,P3口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。

例如:MOV P1,A; P1口做输出MOV P1,#0FFHMOV A,P1;P1口做输入SETB P3.0MOV C,P3.1;从P3.1口读入数据(2)每个端口对应着一个寄存器,例:P1→90H(P1寄存器地址);P3→B0H(P3寄存器地址);寄存器的每一位对应着一个引脚,例:B0H.0→P3.0(3)对寄存器写入“0”、“1”,对应的外部引脚则输出“低电平”、“高电平”。

单片机控制流水灯

单片机控制流水灯

单片机控制流水灯前言随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯不断变化闪烁。

LED灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。

但目前市场上各式样的LED灯控制器大多数用全硬件电路实现,电路结构复杂、功能单一,这样一旦制作成品只能按照固定的模式闪亮,不能根据不同场合、不同时间段的需要来调节亮灯时间、模式、闪烁频率等动态参数。

这种彩灯控制器结构往往有芯片过多、电路复杂、功率损耗大等缺点。

此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。

因此有必要对现有的彩灯控制器进行改进。

流水灯是一串按一定的规律像流水一样连续闪亮。

流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。

流水灯控制可用多种方法实现,但对现代可编程控制器而言,利用移位寄存器实现最为便利。

通常用左移寄存器实现灯的单方向移动;用双向移位寄存器实现灯的双向移动。

本案例利用价格低廉的AT89C52系列单片机控制基色LED灯泡从而实现丰富的变化。

目录前言 (1)1、课程设计的目的和要求 (3)1.1 设计目的 (3)1.2 设计要求 (3)2、设计方案选择 (4)3、硬件设计 (4)3.1 设计思路 (4)3.2 流水灯电路原理图 (4)3.2.1元件清单 (5)3.2.2 硬件电路模块分析 (6)3.3 主要元件说明 (9)3.3.3 振荡器特性 (12)3.3.4 芯片擦除 (12)4、软件设计 (12)4.1 主程序设计 (12)4.2 程序流程图 (15)5、使用keil、proteus软件调试仿真说明 (16)5.1仿真过程 (16)5.2仿真结果 (16)6、结束语 (16)7、参考文献 (17)1、课程设计的目的和要求1.1 设计目的近年来随着科技的发展,单片机的应用正在不断走向深入,同时带动传统控制检测日新月异更新,在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象点的软件结合,加以完善。

(完整版)51单片机流水灯程序

(完整版)51单片机流水灯程序

1.第一个发光管以间隔200ms 闪烁。

2.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms。

3.8 个发光管来回流动,第个管亮100ms。

4.用8 个发光管演示出8 位二进制数累加过程。

5.8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁 5 次。

重复此过程。

6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。

7.间隔300ms 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。

1#include<reg52.h>#define uint unsigned intsbit led 仁P"0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x--) for(y=100;y>0;y--);}2#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit p 仁P1A0;uchar a;void delay(); void main() {a=0xfe;P1=a;while(1){ a=_crol_(a,1); delay();P1=a;delay();}}void delay(){uint b; for(b=55000;b>0;b--);}3#include<reg52.h>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--);}void main(){uchar a,i;while(1)a=0xfe;for(i=0;i<8;i++){P1=a; delay(100); a=_crol_(a,1);}a=0x7f;for(i=0;i<8;i++){P1=a; delay(100); a=_cror_(a,1);}}}4#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint a){uint x,y;for(x=a;x>0;x--) for(y=110;y>0;y--);}void main(){uchar b;while(1){b++;P1=~b; delay(200);5#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void main(){uchar a,i,j;while(1){ for(j=0;j<2;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(200); a=_crol_(a,1);}a=0x7f;for(i=0;i<8;i++){P1=a;delay(200); a=_cror_(a,1);}}P1=0xff; for(j=0;j<10;j++) {delay(300);P1=~P1;}}}void delay(){uint x,y; for(x=200;x>0;x--) for(y=110;y>0;y--); 6 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=300;x>0;x--) for(y=110;y>0;y--);} void main(){uchar a,i,j; while(1) {a=0xfe; for(j=0;j<8;j++) { for(i=0;i<8-j;i++) {P1=a; delay(200); a=_crol_(a,1);} a=_crol_(a,j); P1=0xff; a=a<<1;}} }7#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint z){uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar a,i,j;for(j=0;j<3;j++){P1=0x55;delay(300);P1=0xaa;delay(300);}for(j=0;j<3;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(300);a=_crol_(a,1);}}P1=0xff;for(j=0;j<3;j++){P1=0x7e;delay(300);P1=0xbd;delay(300);P1=0xdb;delay(300);P1=0xe7;delay(300);}P1=0xff;for(j=0;j<3;j++){P1=0xe7;delay(300);P1=0xdb;delay(300);P1=0xbd;delay(300);P1=0x7e;delay(300);}P1=0xff; for(j=0;j<6;j++) {P1=~P1; delay(300);}P1=0xff;while(1);}。

单片机的流水灯实验原理

单片机的流水灯实验原理

单片机的流水灯实验原理
单片机的流水灯实验原理主要包括以下几个步骤:
1. 硬件连接:将单片机的输出口连接到LED灯的驱动电路上,使得单片机可以控制LED灯的亮灭。

2. 软件编程:通过单片机的编程语言(如C语言)编写程序,实现流水灯效果。

一般采用循环控制语句和位操作指令来控制LED的亮灭。

3. 初始化:在程序的开始部分,需要对单片机的IO口进行初始化,设置为输出模式,以便能够控制LED灯的亮灭。

4. 流水灯效果:通过循环控制语句,依次将不同的IO口设置为高电平,即LED 亮起,然后延时一段时间。

再将前一个IO口设置为低电平,即LED熄灭,依次类推,实现LED的流水灯效果。

5. 循环控制:为了能够实现反复循环的流水灯效果,可以在程序末尾使用一个死循环语句,使得程序不断执行,从而实现流水灯不断闪烁。

总的来说,单片机的流水灯实验原理就是通过控制不同IO口的高低电平状态,控制LED的亮灭,从而实现LED灯的流水灯效果。

单片机控制流水灯

单片机控制流水灯

程序框架设计
01
主程序框架
主程序是单片机程序的核心,负 责程序的启动、初始化、中断处 理等任务。
02
中断服务程序框架
03
功能模块框架
中断服务程序用于处理外部中断 事件,如按键按下、定时器溢出 等。
功能模块是实现特定功能的程序 块,如LED灯控制、定时器计数 等。
程序功能模块设计
LED灯控制模块
该模块负责控制LED灯的亮灭状态, 可以通过编程实现流水灯效果。
物联网技术的应用
未来,单片机可能会更多地应用于物联网领域, 与互联网结合,实现更广泛的控制和应用。
3
人工智能与单片机的结合
未来,人工智能技术可能会与单片机结合,实现 更智能的控制和应用。
THANKS
[ 感谢观看 ]
02
包括主程序和中断服务程序,主程序负责循环控制LED灯,中断
服务程序负责处理外部中断。
调试过程
03
通过串口调试工具或示波器等工具对程序进行调试,确保程序
正确运行。
实际运行效果展示
流水灯效果
通过单片机控制LED灯的亮灭,实现流水灯效果 。
速度控制
通过程序延时控制LED灯亮灭的时间间隔,实现 流水灯的速度变化。
硬件连接
将单片机与LED灯连接,通过GPIO口控制LED灯的亮灭。
控制逻辑
通过编写程序控制单片机GPIO口的输出,实现LED灯的顺序亮 灭,形成流水灯效果。
延时控制
通过程序延时控制LED灯亮灭的时间间隔,实现流水灯的速度变 化。
控制程序编写及调试
编程语言
01
使用C语言或汇编语言编写单片机程序。
程序结构
电源管理优化
采用高效的电源管理方案,降 低流水灯的能耗。

任务二 单片机控制流水灯

任务二  单片机控制流水灯

任务二 单片机控制流水灯
国家级“十一五”规划教 材
(3)短转移指令
SJMP rel;(PC)←(PC)+2,(PC)←(PC) +rel
指令中rel是一个有符号数偏移量,其范围为-128~+127,以补码 形式给出。若rel是正数,则向前转移;若rel是负数,则向后转移。 1)一条带有FEH偏移量的 存储器 SJMP指令,将实现无限循环。 –128 这是因为FEH是-2的补码,目 的地址=PC+2-2=PC,结果转 PC 80H 向自己,无限循环,一般在程 PC+1 rel 序用SJMP $来表示SJMP PC+2 0FEH。 +127 2)该指令中寻址方式称相对 寻址方式。
任务二 单片机控制流水灯
国家级“十一五”规划教 材
(3) 循环控制转移指令ห้องสมุดไป่ตู้
DJNZ Rn, rel ;(PC) ←(PC)+2, (Rn)←(Rn)-1 当(Rn)≠0时, (PC) ←(PC) +rel; 当(Rn)=0时, 程序顺序执行。 DJNZ direct,rel;(PC)←(PC)+3,(direct)←(direct)-1 当(direct)≠0时, (PC) ←(PC) +rel; 当(direct)=0时, 程序顺序执行。 执行本指令时,将第一个操作数减1后判断结果是否为0,若 为0,则终止循环程序段的执行,程序往下顺序执行;若不为0, 则转移到目的地址继续执行循环程序段。用两条指令可以构成 循环程序,循环次数就是第一个操作数的值。rel为相对偏移量。
LP0: MOV DPTR, #TAB ; 取表头地址 MOV A, R0 ADD A, R0 JNC LP1 INC DPH ; R0内容乘以2 ; 无进位转移 ; 加进位位

单片机制做流水灯的,一个流程图

单片机制做流水灯的,一个流程图

I LOVE YOU的制做第1步:实现从左到右的顺序一个一个的亮。

第2步:实现全灭。

第3步:实现从右到左的顺序一个一个的亮。

第4步:实现全灭。

第5步:实现全亮。

第6步:实现从左到右的顺序一个一个的灭。

第7步;实现“I”亮。

其它的灭。

第8步;实现“LOVE”亮。

其它的灭。

第9步;实现“YOU”亮。

其它的灭。

第10步;实现全灭。

第11步;实现“YOU”亮。

其它的灭。

第12步;实现“LOVE”亮。

其它的灭。

第13步;实现“I”亮。

其它的灭。

第14步;实现全灭。

第15步;实现“I”亮,其它的灭。

第16步;实现全灭第17步;实现“LOVE”亮,其它的灭。

第18步;实现全灭第19步;实现“YOU”亮,其它的灭。

第20步;实现全灭第21步:实现全亮。

第22步:实现全灭。

第23步:实现“I ,YOU”亮。

第24步;实现全灭。

第24步:实现“LOVE”亮。

第25步:实现全灭。

第26步:循环全部。

蓝色红色绿色具体细节:实现全亮时,时间长一些,定义三个变量。

选择合适颜色的LED;焊接美观。

合适定位LED的位置。

使效果良好。

LED 灯珠:红色为85个。

蓝色为15个。

绿色为70个。

8051单片机一个。

铜柱10个万用板大3个复位材料10uf 10K电阻各一个。

单片机-流水灯的程序

单片机-流水灯的程序

void main() {
Led = 0xfe; while(1) { P2 = Led;
for(i=1;i<800;i++) for(j=1;j<800;j++); Led = Led << 1; if(P2 == 0x00 ) {Led = 0xfe; } } }
方法四:利用移位操作实现流水灯(8位二极管循环点亮)
假设机器字长为8位,变量a的值为16,将a左移二位,即 a=a<<2: 左移前 0001 0000
左移后 0100 0000
由此看出,左移一位相当于该数乘2,左移二位相当于乘4 ,即22,但这要以该数左移之后不“溢出”为前提。所谓“溢出 ”指该数已超过机器字长所能容纳的范围,如该例若继续左移二 位,该数为16× 24=256,超出了字长8位的表示范围(257),
void main() { while(1) {
led1=0; delay(120);
led2=0; delay(120);
led3=0; delay(120);
led4=0; delay(120);
led5=0 ; delay(120);
led6=0; delay(120);
led7=0; delay(120);
即产生了溢出。
二、按位右移
按位右移是将一个运算量的各位依次右移若干位, 低位被移出,高位对无符号数补0,对有符号数要按最 高符号位自身填补。
右移一位相当于该数除以2,但有可能带来误差。假设机器 字长为8位,变量a值为15,将a右移二位,即a=a>>2:
右移前 0000 1111
右移后 0000 0011
单片机-流水灯的程序

单片机控制左右循环的流水灯设计

单片机控制左右循环的流水灯设计

《单片机原理及应用课程设计》报告——控制左右循环的流水灯设计专业:电子信息工程班级:电子1111姓名:荀威学号:1120106106指导教师:肖金球2014年6月11日1.课程设计目的1.1巩固和加深对单片机原理和接口技术知识的理解;1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。

2.课程设计要求2.1认真研究设计任务书,明确设计要求、条件、内容和步骤;复习课程有关内容,熟悉有关单元电路的设计方法和步骤;搜集、分析、消化相关资料、软件等;掌握微型计算机应用系统软件设计方法;准备好设计需要的图书、资料和工具;拟定设计计划等2.2系统总体及功能设计,制定总体方案及元器件的选择;2.3硬件设计,完成硬件结构图设计、系统电路图设计和绘制及电路模块的连接;2.4软件设计,完成软件流程图的设计、程序设计;2.5使用Proteus与Keil软件仿真运行;3.硬件设计3.1元件清单3.2 单片机AT89C51该单片机功能强大,不仅能满足设计的需要,也可以在设计要求的基础上进行一些扩展。

单片机的结构如下:图1单片机引脚图在使用时VCC接电源电压,GND接地。

P0,P1,P2,P3可作为输入或输出端口,RST是复位输入,接复位电路。

XTAL1和XTAL2接复位电路。

这些可以在硬件设计部分体现出来3.3.单片机的时钟电路单片机内部有在一个振荡器,本设计采用内部时钟方式,以12MHZ 石英晶体振荡器和两个30PF的片电容组成外部电容的大小对振荡频率有微小影响,可起调节作用。

振荡器,如图所示。

片内的高增益反向放大器通过XTAL1和XTAL2外接,作为反馈元件的外部晶体振荡器与电容组成的并联谐振回路构成一个自激振荡器,向内部时钟电路提供振荡时钟。

双单片机控制流水灯

双单片机控制流水灯

案例8 双单片机通信控制流水灯用串行工作方式进行单片机之间的通信,电路图如下图所示。

两个89S51 单片机通过串行口进行通信,设置U1 使用的晶振频率是11.0592MHz,U2 使用的晶振频率是22.1184MHz,U1的RXD 接U2的TXD ,U1的TXD 接U2的RXD ,U2接8个发光二极管,要求由U1 向U2 发送数据,使8 个发光二极管按从左到右逐一点亮的流水灯效果。

MCS-51 单片机之间的串行异步通信1.串行口的编程串行口需初始化后,才能完成数据的输入、输出。

其初始化过程如下:(1)按选定串行口的工作方式设定SCON的SM0、SM1两位二进制编码。

(2)对于工作方式2或3,应根据需要在TB8中写入待发送的第9位数据(地址为1,数据为0)。

(3)若选定的工作方式不是方式0,还需设定接收/发送的波特率。

(4)设定SMOD 的状态,以控制波特率是否加倍。

(5)若选定工作方式1或3,则应对定时器T1 进行初始化以设定其溢出率。

2.案例分析由于串行口通信时传输的“ 0”或者“ 1”是通过相对于“地”的电压区分的,因此使用串行口通信时,必须将双方的“地”线相连以使其具有相同的电压参考点。

需要注意的是,异步通信时两个单片机的串行口波特率必须是一样的。

由于U1 使用的晶振频率是11.0592MHz,U2 使用的晶振频率是22.1184MHz,因此二者的串行口初始化程序不完全一样。

假设使用240bit/s 的波特率,使用串行工作方式1,Tl 使用自动装载的方式2,则Ul 的TH1 应初始化为136,U2 的TH1 应初始化为16。

对应的程序完成如下功能:Ul 和U2进行双工串行通信,Ul给U2循环发送流水灯控制字,U2 收到控制字后送到P0 口,点亮相应发光二极管,双方都用中断方式进行收发。

(1)单片机U1 的源程序#include<reg51.h>unsigned char sdata=0xfe;void isr_uart();void main(){TMOD=0X20;TH1=136;TL1=136;SCON=0x40;PCON=0;TR1=1;EA=1;ES=1;SBUF=sdata;while(1);}void isr_uart() interrupt 4{sdata<<=1;sdata |=1;if(sdata==0xff) sdata=0xfe;SBUF=sdata;TI=0;}(2)单片机U2 的源程序#include<reg51.h> unsigned char sdata; void isr_uart();void main(){TMOD=0X20;TH1=16;TL1=16;SCON=0X50;PCON=0;TR1=1;EA=1;ES=1;while(1) ;}void isr_uart() interrupt 4{RI=0;sdata=SBUF;P0=sdata;。

左右来回循环的流水灯实验报告

左右来回循环的流水灯实验报告

青 岛 科 技 大 学 微机原理与接口技术综合课程设计(报告)题 目 __________________________________指导教师__________________________学生姓名__________________________学生学号_________________________________________________________院(部)____________________________专业________________班______年 ___月 ___日直流电机控制综合实验 周艳平宋雪英 0908610211 信息科学技术学院计算机科学与技术09612012 12 27摘要 (2)1、单片机概述 (2)2、仿真软件介绍 (2)3、需求分析 (2)一、课程设计目的 .............................................................................................................. 错误!未定义书签。

二、课程设计要求 .............................................................................................................. 错误!未定义书签。

三、实验内容 ...................................................................................................................... 错误!未定义书签。

1、设计任务与要求 .................................................................................................... 错误!未定义书签。

单片机控制LED流水灯从中间向两边

单片机控制LED流水灯从中间向两边
感觉8位数显一直在亮着,相当于正在播放的电影胶卷*/
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
单片机控制LED流水灯从中间向两边,从两边向中间
这个就是把先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的应该是这样的先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动;
#include< reg52.h>
numd=1; /*重新附值段显值对应对码表第1位,因为++所以0位并不在数码管中显示.
如果要显示,也会因为++而在第二轮中显示出*/
duan=1; //开启段显端
P0=tabled[numd];//附段显P0值对应段显值对码表
duan=0; //锁存
wei=1; //开启位显端
P0=tablew[numw];//附位显P0值对应位显值对码表
void main()
{
a=0; //定义个时间函数
numw=0; //附位显初值为0位
numd=0; //附段显初值为0位
TMOD=0X01; //第四步骤,附中断暂存器初值
TH0=(65535-50000)/256; //附中断请求时间初值,高8位
TL0=(65536-50000)%256; //附中断请求时间初值,低8位
因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数பைடு நூலகம்显示电路图*/
uchar code tablew[]={
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

左右来回循环的流水灯
设计要求
8个发光二极管LED0~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。

编程实现制作左右来回循环的节日彩灯,显示规律如下图所示。

题37图节日彩灯的花样显示的规律
为了使显示效果更加绚丽多彩,P1端口8个引脚分别接有不同颜色的发光二极管。

具体如题37表所示。

题37表P1口8个引脚的不同颜色的发光二极管
P1口引脚发光二极管的颜色
P1.0 红色LED
P1.1 蓝色LED
P1.2 绿色LED
P1.3 黄色LED
P1.4 红色LED
P1.5 蓝色LED
P1.6 绿色LED
P1.7 黄色LED
使用C51编流水灯程序以及设计相应的硬件电路十分简单,且有多种方法。

本方案力求程序最简化最清晰原则,用NS图(盒图)表示算法如下:
程序中设置中间变量temp用来给P1口赋值,命令_crol_和_cror_用于使temp左移或右移,例如当temp=11111110B时,执行_crol_(temp,1)之后temp=11111101,应用此两条语句必须把头文件<intrins.h>包含进来。

全部代码如下:
#include<reg51.h>
#include<intrins.h>
unsigned char temp; //定义字符变量temp,temp左移或右移并给连接LED的P1口赋值
int a; //定义延迟函数delay()
void delay(void);
void main()
{
temp=0xfe; //给temp赋初值
P1=temp; //temp赋值给P1口,第一个LED(红色)点亮
while(1) //主程序,括号中的程序将一直循环
{
for(a=0;a<7;a++) //左移部分,LED从左到右依次点亮
{
temp=_crol_(temp,1); //_crol_语句控制变量temp左移
delay(); //每个灯点亮之后延迟一会在点下一个灯
P1=temp;
}
for(a=0;a<7;a++) //右移部分,LED从右到左依次点亮
{
temp=_cror_(temp,1); //第8个灯点亮后开始右移程序,LED从右向左点亮
delay();
P1=temp;
}
}
}
void delay() //延时子程序
{
int i,j; //定义局部变量i,j
for(i=200;i>0;i--) //i,j不断计数占用CPU时间,达到延时目的
for(j=1;j<150;j++);
}
电路连接如下:
void delay()()
{
unsigned int i;
for(i=0;i<1500;i++)
}
void fun(void)
{
unsigned char i;
for (i=0;i<8;i++)
{
P0=1<<i;
delay()();
}
while(--i)
{
P0=1<<i;
delay()();
}
}
void main()
{
while(1)
{
fun();
}
}
void L_M()//左
{
unsigned char a,b,i,temp; unsigned int s;
temp=0xfe;
P1=temp;
for(s=0;s<300000;s++);
for(i=0;i<8;i++)
{
a=temp<<i;
b=temp>>(8-i);
P1=a|b;
for(s=0;s<300000;s++);
}
}
void R_M()//右
{
unsigned char a,b,i,temp;
unsigned int s;
temp=0x7f;
P1=temp;
for(s=0;s<300000;s++);
for(i=0;i<8;i++)
{
a=temp>>i;
b=temp<<(8-i);
P1=a|b;
for(s=0;s<300000;s++);
}
}
#include<reg52.h>
#include <intrins.h> //intrins.h库中含有循环移位函数#define uint unsigned int
#define uchar unsigned char
uchar temp; //定义全局变量temp
delay() //延时子函数
{
uint i,j;
for(i=1;i<400;i++)
for(j=1;j<400;j++);
}
void main() //主函数
{
temp=0xfe;
P0=temp;
while(1)
{
temp=_crol_(temp,1); //_crol_ 字符循环左移_cror_ 字符循环右移delay();
P0=temp;
}
}。

相关文档
最新文档