流水灯左右移动程序

合集下载

左右来回循环的流水灯

左右来回循环的流水灯

(大作业题目)报告单片机控制左右循环的流水灯学生学号:学生姓名:同组学号:同组姓名:指导老师:设计目的:1)学习P1口的使用方法;2)学习延时子程序的编写3)了解简单单片机应用系统的设计方法。

4)掌握应用编译源汇编程序的操作方法。

5)熟练掌握AT89c51型开发板的使用方法和注意事项。

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

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

依次实现红蓝绿黄红蓝绿黄的循环亮灭。

设计步骤:1.按照电路图在proteus7.5的环境下进行仿真连接,在keilc3的环境下进行c环境的编译,然后下载到单片机内运行进行仿真,观察发光二极管的运行状态。

要注意的的,实验中一定要再p1口接上拉电阻或是一个74HC245的芯片,以提高单片机的P口驱动,以使LED灯亮。

如果使用74HC245,则引脚OE要接地,DIR要接高电平。

2.实现单片机工作的最小系统:电源电路﹑时钟电路﹑复位电路。

3.因为LED灯是共阳极接入,编程实现灯亮的时候,要使语句取反。

设计电路图:左右来回的流水灯.PDF源程序:左右来回的流水灯.C流程图:开始判断P口电平高电平低电平变向P口加1延时设计总结:1.实验中连接电路后运行发现等没有亮,检查程序,看接相应灯的P口输出语句是否取反了;如果没有循环,看控制方向的语句是否写对;检查上拉电阻的取值是否正确,一定要有上拉电阻。

2.通过本次设计试验,我了解了单片机是如何实现控制功能的,设计中会遇到错误的结果,要仔细分析错误,然后一一去改进,试验,直到没有错误为止。

三、/**左右来回的流水灯**/#include<reg51.h>typedef unsigned char uint8;typedef unsigned int uint16;void delay(uint16 x){uint8 i,j;for(i = x; i > 0; i --)for(j = 114; j > 0; j --);}void main(){uint8 b = 0, way = 0; //移动位数变量及移动方向变量while(1){if(way == 0) //根据way选择左移还是右移P0 = ~(0x01 << b); //最低位的0被左移b位 elseP0 = ~(0x80 >> b); //最高位的0被右移b位if( ++b == 8) //如果移动到左端或右端{b = 0; //b归0way = !way; //改变方向}delay(200);}}。

51单片机流水灯左移 右移控制程序

51单片机流水灯左移 右移控制程序

51 单片机流水灯左移右移控制程序电路很简单8 位流水灯接在单片机的P1 口.如下是源代码://============================================================= //程序名:LLL22_4.C //程序功能:流水灯控制左移右移//============================================================== #include//头文件L_M(); //流水灯左移控制程序R_M();//流水灯右移控制程序//=============================================================== main() //主函数{ while(1) //无限循环{L_M(); //调用左移程序R_M(); //调用右移程序} } //========左移控制程序============================================== L_M() //左移主函数{ unsigned char i,temp,a,b; //声明无符号字符型变量A,TEMP I,B unsigned int s; //声明无符号整型变量S temp=0xfe; //左移初始值P1=temp; //P1 输出信号点亮发光管for( s=0;s>(8-i) ; //数据右移(8-I)位P1=a|b ; //逻辑或运算,并输出到P1 口for(s=0;s>i;b=temp<<(8-i); //数据右移(8-I)位P1=a|b; //逻辑或运算,并输出到P1 口for(s=0;s<30000;s++); //延时程序} }//=======================================================================tips:感谢大家的阅读,本文由我司收集整编。

pic单片机流水灯循环右移c语言,PIC单片机LED流水灯程序

pic单片机流水灯循环右移c语言,PIC单片机LED流水灯程序

pic单⽚机流⽔灯循环右移c语⾔,PIC单⽚机LED流⽔灯程序PIC 单⽚机 LED流⽔灯程序;*************************************************************include;**************************************************__CONFIG 3F39H;设置配置位中振荡⽅式为XT,其它全部禁⽌或关闭;*----MODESEL equ 20hMODESELB equ 21hCount equ 22hCount1 equ 23hCount2 equ 24hPORTDB equ 25h;*-----org 0nopgoto startorg 4goto ISRorg 10startclrf PORTC ;清c⼝MOV lw 00hMOV wf MODESEL ;初始化模式选择寄存器MOV wf MODESELBMOV lw b'10010000'MOV wf INTCON ;初始化中断控制bsf STATUS,RP0clrf TRISC ;设C⼝全为输出MOV lw b'10111111'MOV WF OPTION_REG ;选择INT下降沿有效bcf STATUS,RP0call FMselMOV wf PORTDBMOV wf PORTCmainbtfsc PORTB,0 ;\goto $+6 ; \call Delay ; 按键去抖动btfsc PORTB,0goto $+3 ; /call FMsel ;/MOV wf PORTDBMOV f MODESELB,W ;MOV wf MODESEL ;call LongDelaybcf STATUS,Crlf PORTDB,1btfsc STATUS,Cbsf PORTDB,0MOV f PORTDB,WMOV wf PORTCgoto main;*----------Delay ; call指令占⽤2个指令周期clrf Count ; 清 Count占⽤1个指令周期Dloopdecfsz Count,f ; 这两⾏指令将延时goto Dloop ; (256 * 3) -1 个指令周期return ; return占⽤2个指令周期;*----------------LongDelayclrf Countclrf Count1MOV lw 0x01MOV wf Count2LDloopdecfsz Count,fgoto LDloopdecfsz Count1,f goto LDloopdecfsz Count2,f goto LDloopreturn;*---------------FMselMOV f MODESEL,w MOV wf MODESELB MOV f MODESEL,w addwf PCLretlw b'11111000' retlw b'11110000' retlw b'11100000' retlw b'11000000' retlw b'10000000' MOV lw 00hMOV wf MODESELB bsf INTCON,GIE retlw b'11111000' return;*-------------ISRbtfss INTCON,INTF goto $+3bcf INTCON,INTF incf MODESELretfieend。

S7-1200 PLC循环移位指令做流水灯控制

S7-1200 PLC循环移位指令做流水灯控制

案例详解 | S7-1200 PLC循环移位指令做流水灯控制在S7-1200 PLC中的移位和循环移位指令指令包括了移位指令SHL和SHR,循环移位指令ROL和ROR。

这几个指令跟S7-200/200 SMART PLC是一样的,如果学习过这几个指令的同学也可以重新温习一下,或者直接拉到后面看流水灯控制的程序案例编写~下面我们就分别来看一下这几个指令吧。

1、移位指令移位指令分为左移指令SHL和右移指令SHR这两个,它们执行的过程是一致的,只是移动的方向不同而已,左移指令是由低位往高位移动,右移指令是由高位往低位移动。

我们以左移指令来看一下,指令中的N是移位的位数,是将输入操作数IN中的二进制位按N位向左进行移位,从而输出到输出端OUT中,注意移位指令移出的位是自动丢去的,而低位中空出的位是自动补零的。

关于移位指令使用时支持的数据类型,除了支持位字符串的数据类型之外,还可以支持整数的数据类型。

2、循环移位指令循环移位指令分为循环左移ROL和循环右移ROR这两个指令,同样的它们的移动方向是不同的,循环左移指令是由低位往高位移动,循环右移指令是由高位往低位移动。

关于循环移位指令支持的数据类型只要位字符串的数据类型哦。

下面我们以循环左移指令来看一下指令的执行过程,指令中的N同样的是用于指定移动的位数,指令是将输入操作数IN中的二进制位按N位进行循环左移,这个指令和移位指令的区别是,循环移位指令移出的位并不会丢失,而是会放回到地位中空出的位置中的。

我们下面讲一个流水灯控制,是以循环移位指令实现的,主要是为了让大家能够熟悉指令的使用哦。

下面就先看看控制要求吧!控制要求:有八盏指示灯分别对应于PLC输出Q0.0~Q0.7,按下启动按钮,从第一盏灯开始每隔1s点亮,点亮下一盏的同时熄灭上一盏。

当第八盏灯点亮后延时5秒,然后以反反向点亮,回到第一盏时又延时5秒进行下一轮循环,按下停止按钮所有指示灯都熄灭。

我们分析一下以上的程序,当按下启动按钮时,M20.0接通,M20.0接通同时随1s 时钟脉冲每隔一秒进行向左移位,依次点亮一盏灯并熄灭上一盏灯,当第八盏灯点亮了则Q0.7接通,置位切换方向信号M20.1,M20.1触点接通并开始延时5秒,5秒时间到后M20.2线圈接通,M20.2触点接通同时随1s 时间脉冲每隔1秒进行向右移位,直到点亮第一盏灯时,不再执行ROR 右移指令,而去执行程序段5,Q0.0触点接通,定时器开始延时5秒时间,延时时间到后复位M20.1,也就是复位切换方向的信号,同时置位启停标志M20.0,接着又开始下一次的轮回。

51单片机程序代码

51单片机程序代码
流水灯左移
ORG 0000H
START: MOV R2,#8
MOV A ,#0FEH
CLR C
LOOP: MOV P1,A
LCALL DELAY
RR A
DJNZ R2,LOOP
LJMP START
DELAY: MOV R5,#30
END
1-8 连续稳定显示
ZWMADDR EQU P2
ZXMADDR EQU P0
ORG 0000H
ST: LJMP MAIN
ORG 0100H
MAIN: MOV R3,#0FEH
MOV R4,#01H
LOOP:MOV DPTR,#CHAR
MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
MOV P2,R3
MOV R2,#05H
LCALL DELAY
MOV A,R3
RL A
MOV R3,A
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
END
4 中断1次8移动
ZWMADDR EQU P2
ZXMADDR EQU P0
ORG 0000H
LJMP ST
ORG 0003H
INTO:LJMP INT0S
ST: SETB PX0
SETB PT0
SETB ET0
SETB EA
SETB TR0
MOV A,#80H
MOV ZXMADDR,A
MOV A,#0FEH
LOOP: MOV ZWMADDR,A
LJMP LOOP

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

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

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

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

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

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

单片机控制左右来回循环的流水灯-推荐下载

单片机控制左右来回循环的流水灯-推荐下载

#include<intrins.h>
unsigned char temp;
LED 的 P1 口赋值
int a;
void delay(void);
void main()
{
temp=0xfe;
P1=temp;
while(1)
{
for(a=0;a<7;a++)
{
}
//定义字符变量 temp,temp 左移或右移并给连接
//定义延迟函数 delay()
//给 temp 赋初值
//temp 赋值给 P1 口,第一个 LED(红色)点亮
//主程序,括号中的程序将一直循环
//左移部分,LED 从左到右依次点亮
temp=_crol_(temp,1); //_crol_语句控制变量 temp 左移
delay();
P1=temp;
左右来回循环的流水灯
设计要求 8 个发光二极管 LED0~LED7 经限流电阻分别接至 P1 口的 P1.0~P1.7 引脚 上,阳极共同接高电平。编程实现制作左右来回循环的节日彩灯,显示规律如 下图所示。
题 37 图 节日彩灯的花样显示的规律
为了使显示效果更加绚丽多彩,P1 端口 8 个引脚分别接有不同颜色的发光
程序中设置中Leabharlann 变量 temp 用来给 P1 口赋值,命令_crol_和_cror_用于使 temp 左移或右
移,例如当 temp=11111110B 时,执行_crol_(temp,1)之后 temp=11111101,应用此两条语句
必须把头文件<intrins.h>包含进来。
全部代码如下:
#include<reg51.h>

[设计]80C51控制流水灯

[设计]80C51控制流水灯

80C51单片机控制流水灯1使用汇编语言编写程序,8个LED灯接在P0口,显示出流水灯效果2用mov指令移位3用查表法显示流水灯4将P1口拨码开关设置状态读出,作为流水灯设置显示模式5在4的基础上加入控制功能,K0为低电平时,LED停止移动,K0高电平时,LED开始移动;K1为低电平时,LED左移,K1高电平时,LED 右移。

接线如下图:(一)用mov指令编写ORG 0000H ;定义程序初始地址JMP MAIN ;跳转至MAINORG 0030HMAIN: MOV A,#0FEH ;MOV R0,#08H ;设置移动8位LOOP1:MOV P0,A ;点亮第一个灯CALL DELAY ;调用延时程序RL A ;左移DJNZ R0,LOOP1 ;循环左移MOV R1,#08H ;设置移动8位LOOP2:RR A ;右移MOV P0,A ;输出CALL DELAY ;调用延时程序DJNZ R1,LOOP2 ;循环右移JMP MAIN ;跳转至MAIN DELAY:MOV R3,#20 ;延时程序定义D1: MOV R4,#100D2: MOV R5,#230DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND(二)用查表法ORG 0000H ; 定义程序地址从0000H开始存放JMP MAIN ;跳转至主程序ORG 0030H ;设置主程序地址MAIN:MOV DPTR,#TABLE ;将TABLE的地址赋给DPTRONE: CLR A;累加器清零MOVC A,@A+DPTR ;取出表中的数据CJNE A,#0FFH,TWO ;判断是不是表中最后的0FFH,如果不是则跳转至TWOJMP MAIN ;如果是表中最后的0FFH,则跳转至main,重新运行TWO: MOV P1,A ;将数据输出至p1口CALL DELAY ;调用延时程序INC DPTR ;修改指针DPTR,指向表中下一个数据JMP ONE ;跳转至oneDELAY:MOV R3,#20 ; 延时子程序定义D1: MOV R4,#100D2: MOV R5,#230DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETTABLE: ; 花样流水灯的表,可以自由定义DB 01111111BDB 10111111BDB 11011111BDB 11101111BDB 11110111BDB 11111011BDB 11111101BDB 11111110BDB 11111110BDB 11111101BDB 11111011BDB 11110111BDB 11101111BDB 11011111BDB 01111111B DB 11100111B DB 11011011B DB 10111101B DB 01111110B DB 10111101B DB 11011011B DB 11100111B DB 11100111B DB 11011011B DB 10111101B DB 01111110B DB 10111101B DB 11011011B DB 11100111B DB 01010101B DB 10101010B DB 00110011B DB 11001100B DB 11110000B DB 00001111BDB 0FFH ;用作表的结尾的标志,可自由定义END(三)拨码开关控制ORG OOOOH ;JMP MAINORG 0030H ;MAIN:MOV P1,#0FFH ;准双向口,先写1再读,防止读取出错MOV A,P1 ;读取P1的状态MOV P0,A ;将p1的状态输出到P0CALL DELA Y ;调用延时子程序JMP MAIN ;跳转到MAINDELAY:MOV R3,#20 ;延时子程序定义D1: MOV R4,#100D2: MOV R5,#230DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND(四)在(三)的基础上加上控制功能ORG 0000HJMP MAINORG 0030HMAIN: MOV P1,#0FFH ;准双向口,先写1再读,防止出错MOV A,P1 ;读取P1的状态MOV R0,A ; 保存A的状态TEST: JB P2.0,MOVING ;判断P2.0的电平,高电平时跳转至MOVINGJMP DISPLA Y ;跳转到DISPLA YMOVING:JB P2.1,RIGHT ;判断P2.1的状态,高电平时右移LEFT: RL A ;A左移一位JMP DISPLA Y ;跳转至DISPLA YRIGHT:RR A ;A右移一位JMP DISPLA Y ;跳转至DISPLA YDISPLA Y:MOV P0,A ;输出到P0口MOV R1,A ;保存A的状态CALL DELAY ;调用延时程序MOV A,R0 ;将R0保存的状态存到A中XRL A,P1 ;判断P1口的状态是否变化JNZ MAIN ;P1口状态变化,跳转至MAIN重新显示MOV A,R1 ;P1口状态不变,继续当前的状态显示JMP TEST ;跳转至TESTDELAY:MOV R3,#20 ; 延时程序定义D1: MOV R4,#100D2: MOV R5,#200DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RET。

用四个独立按键控制流水灯的左移右移加速减速

用四个独立按键控制流水灯的左移右移加速减速

用四个独立按键控制流水灯的左移右移加速减速用四个独立按键控制流水灯的左移右移加速减速实现6个数码管的分时显示在一个数码管上实现0到9的循环显示2009-05-30 16:11:52| 分类:汇编程序| 标签:|字号大中小订阅;////////////////////////////////////////;程序编写人:汤军;编写时间2009年5月23日星期六;功能: 在一个数码管上实现0到9的循环显示;////////////////////////////////////////;/////////////自定义及初始化////////////BAOHU EQU 60HJISHU EQU R4ORG 0000HAJMP MAIN;////////////////主程序////////////////MAIN: CLR P2.2 ;开片选CLR P2.1CLR P2.0MOV BAOHU,#0 ;查表变量赋初值MOV R4,#10 ;循环次数MOV DPTR,#TAB2 ;表首地址赋数据指针LDD1: ACALL CABIAO ;调用查表子程序ACALL DISPLAY ;调用显示子程序ACALL CHULI ;调用处理子程序DJNZ R4,LDD1 ;判断是否显示到9AJMP MAIN ;循环;/////////////查表子程序///////////////;输入:BAOHU;输出:A;功能:取出段数据CABIAO: MOV A,BAOHUMOVC A,@A+DPTR ;查表RET ;返回;//////////////显示子程序//////////////;输入:A;输出:P0;功能:段数据送数码管显示DISPLAY: MOV P0,#0FFHMOV P0,A ;显示ACALL DELAY ;调用延时子程序RET ;返回;//////////////处理子程序//////////////;输入:BAOHU;输出:BAOHU;功能:显示下一个数值CHULI: MOV A,BAOHUINC A ;显示下一个数值MOV BAOHU,ARET;//////////////延时子程序//////////////;输入:无;输出:无;功能:延时一段时间,稳定数码管的显示DELAY: MOV R5,#06H DD: MOV R6,#0FFHDD2: MOV R7,#0FFHDJNZ R7,$DJNZ R6,DD2DJNZ R5,DDRET;//////////////TAB2段数据表//////////// TAB2: DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90H ;/////////////////结束/////////////////END。

51单片机流水灯左移右移控制程序

51单片机流水灯左移右移控制程序

51单片机流水灯左移右移控制程序51单片机流水灯左移右移控制程序电路很简单 8位流水灯接在单片机的P1口.如下是源代码://===================================== ========== ==============//程序名:LLL22_4.C//程序功能:流水灯控制左移右移//===================================== ========== ===============#include;//头文件L_M(); //流水灯左移控制程序R_M(); //流水灯右移控制程序//===================================== ========== ================main() //主函数{while(1) //无限循环{L_M(); //调用左移程序R_M(); //调用右移程序}}//========左移控制程序====================================== ======== L_M() //左移主函数{unsigned char i,temp,a,b; //声明无符号字符型变量A,TEMP I,B unsigned int s; //声明无符号整型变量Stemp=0xfe; //左移初始值P1=temp; //P1输出信号点亮发光管for( s=0;s;>;(8-i) ; //数据右移(8-I)位P1=a|b ; //逻辑或运算,并输出到P1口for(s=0;s;>;i;b=temp<<(8-i); //数据右移(8-I)位P1=a|b; //逻辑或运算,并输出到P1口for(s=0;s<30000;s++); //延时程序}}//===================================== ==================================。

左右流水灯,蜂鸣器响

左右流水灯,蜂鸣器响
#define uchar unsigned char
#define GPIO_LED P2 //将P2口另外取名为GPIO_LED
sbit beep = P1^5;
void delay(uchar c)
{
for(;c>0;c--);
}
void Delay10ms(unsigned int); //误差 0r(n=0;n<7;n++) //左移7次,这样子就会到达最左边
{
GPIO_LED=_crol_(GPIO_LED,1); //将GPIO_LED左移一位
Delay10ms(43); //延时
for(a=1000;a>0;a--)
/*******************************************************************************
* 实 验 名 : 左右流水灯,蜂鸣器响实验
* 使用的IO : P2
* 实验效果 : 点亮的LED从右边往左边移动,到达左边再往右边移动,蜂鸣器同时响,间隔500ms,依此循环。
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
* 函 数 名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/

基于51单片机的C语言程序设计

基于51单片机的C语言程序设计

基于51单片机的C语言程序设计实训100例第 01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid 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_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){{P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsignedchar#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。

PROTEUS仿真100实例

PROTEUS仿真100实例

《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时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_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){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 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。

(四)开关控制的跑马灯以及流水灯电路图以及程序

(四)开关控制的跑马灯以及流水灯电路图以及程序

(四)开关控制的跑马灯以及流⽔灯电路图以及程序电路图:⽬的:K1 开始跑马灯左->右K2 停⽌K3 跑马灯右-> 左K4 流⽔灯参考程序:#include<reg52.h>#include<intrins.h>#define uchar8 unsigned char#define uint16 unsigned int#define LED P1sbit key1=P2^0;sbit key2=P2^1;sbit key3=P2^2;sbit key4=P2^3;/*****************************/// 函数名称: DelayMS( )// 函数功能:延时// ⼊⼝函数:延时毫秒// 出⼝函数:⽆/************************* void DelayMs(uint16 val){uint16 i,j;for( i=0;i<val;i++)for(j=0;j<113;j++);}/****************************/// 函数名称: keyscan( )// 函数功能:检测按键// ⼊⼝函数:⽆// 出⼝函数: keyscan_num/*****************************/uchar8 keyscan(){uchar8 keyscan_num,temp;P2=0xff; // 置电平temp=P2; // 读P2⼝电平,送⼊ temp 中(因为这时候可能改变按键了)// if(~(temp&0xff)) 不会⽤,先不看,⽤下⾯的if(temp!=0xff) // 说明有键按下{if(key1==0){keyscan_num=1;}else if(key2==0){keyscan_num=2;}else if(key3==0){keyscan_num=3;}else if(key4==0){keyscan_num=4;}else{keyscan_num=2;}}return keyscan_num;}void main(){uchar8 key_num , temp , i ;while(1){key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: break ;}function0: // 跑马灯从左向右⾛temp=0x01; // 0000 0001for(i=0;i<8;i++){LED= ~temp;DelayMs(1000);temp=temp<<1;}key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: goto function0;break ;}function1: //停⽌LED=0xff;key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: goto function1;break ;}function2: // 从右向左temp=0x80; // 1000 0000for(i=0;i<8;i++){LED= ~temp;DelayMs(1000);temp=temp>>1;}key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: goto function2;break ;}function3: // 流⽔灯LED=0xff ; // 这⾥端⼝全被设置为 1111 1111 ,相当于全灭for(i=0;i<8;i++){LED=LED<<1; // 选择了左移循环DelayMs(1000);}key_num = keyscan(); // 将按键扫描的键值送⼊ key_num 中switch(key_num){case1: goto function0;case2: goto function1;case3: goto function2;case4: goto function3;default: goto function3;break ;}}}分析以及相关疑点:1、按键按下,是遵循实验现象了,但是不太好,按其他键不能⽴即响应,当然我们不要求2、实际⽤弹性开关,⽐较好,具体⾃⼰体会,⼀按下松开对程序没影响,。

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