C51单片机实行流水灯程序

合集下载

单片机C51的LED流水灯实验报告

单片机C51的LED流水灯实验报告

实验3.1.2 数字量输出输出扩展——LED流水灯一、实验目的1、掌握单片机外设扩展的方法2、使用单片机和8255实现LED流水灯的控制。

二、实验内容使用汇编语言编程,功能为:通过KK1脉冲实现LED灯工作方式即时控制,完成LED 开关控制显示和LED左循环、右循环、间隔闪烁功能。

三、实验环境PC机一台,Proteus仿真软件(或TD-PIT实验系统)一套四、实验硬件电路图说明:U2为单片机SST89E554RC,U1为8255A,通过8255A的PB输出使LED工作,BUTTON 为脉冲开关。

五、程序流程图六、实验程序清单ORG 0000HAJMP 0100HORG 0100HMAIN:MOV TMOD,#60H MOV TH1,#0FFHMOV TL1,#0FFHMOV DPTR,#7300HMOV A,#80HMOVX @DPTR,ASETB TR1MOV DPTR,#7100HLEFT:MOV R0,#8MOV A,#01HAG1:MOVX @DPTR,ACALL DELAYRLC ADJNZ R0,AG1JBC TF1,RIGHTAJMP LEFTRIGHT:MOV R0,#8MOV A,#80HAG2: MOVX @DPTR,ACALL DELAYRRC ADJNZ R0,AG2JBC TF1,FLASHAJMP RIGHTFLASH:MOV R0,#8AG3: MOV A,#55HMOVX @DPTR,ACALL DELAYMOV A,#0AAHMOVX @DPTR,ACALL DELAYDJNZ R0,AG3JBC TF1,LEFTAJMP FLASHDELAY:MOV R1,#0FFHDEL0:MOV R2,#0FFHDEL: DJNZ R2,$DJNZ R1,DEL0RETEND七、实验步骤1、按实验电路图接线;2、编写实验程序,编译连接无误后进入调试状态(可用PROTEUS也可以用硬件调试);3、按动BUTTON(PROTEUS下)或KK1(实验箱),观察流水灯工作情况,验证程序功能。

51单片机经典流水灯汇编程序

51单片机经典流水灯汇编程序

51单片机经典流水灯汇编程序(共8页)单片机流水灯汇编程序设计流水灯汇编程序8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

;用最直接的方式实现流水灯ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第二个的L ED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#B LC ALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELA Y MOV P1,#B ;完成第一次循环点亮,延时约秒 AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250msPUSH PSW ;现场保护指令(有时可以不加)MOV R4,#2 L3: MOV R2 ,#00HL1: MOV R3 ,#00HL2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L 2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--51单片机汇编程序集(二)2008年12月12日星期五 10:27辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD 整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7;二进制整数(2位)转换为十进制整数(分离BCD码);入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV@R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码);入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOVR0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOVB,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZR7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码);入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINCR0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码);入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0PUSH AMOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321POP AMOVR0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOVR0,ADJNZ R7,IBD322RET第七个试验:流水灯数字显示综合练习----51单片机汇编语言试验教程收藏该程序运行结果为个位数码管轮流现实0,1,2,3,4,5,6,7,8然后十位数码管轮流现实0,1,2,3,4,5,6,7,8反复循环,, ,, ,, ,, 依次点亮然后轮流点亮小喇叭不停发出滴答声:注意该程序配套为我站的倚天版开发套件:如果是标准版:因他的数码管接法不同。

C51单片机实现呼吸灯和花样流水灯程序

C51单片机实现呼吸灯和花样流水灯程序

C51单⽚机实现呼吸灯和花样流⽔灯程序1.⽤C51单⽚机实现花样流⽔灯,代码如下:#include <reg52.h>#define LED_A P1 //led灯所⽤的接⼝,是哪个⼝就写P⼏void delayms(){unsigned char x = 0; unsigned char i;unsigned char y = 0;while(y < 0.001) //定义led灯的切换的延时时间,越⼩越快。

{ //(y < 0.001);(x<100);(i<100)都可以修改x = 0;while(x<100){i = 0;while(i<100){i++;}x++;}y++;}}#define LED_NUM 8 //定义led灯的数量,可快速实现不同⽤途的修改;void main(){unsigned char k;unsigned char j;unsigned char LED_ALL[] = {0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; //led灯亮灭的⼗六进制数组;unsigned char LED_ALL_2[] = {0XFC,0XF3,0XCF,0X3F}; while(1) { for(k=0;k<3;k++) //第⼀个for实现奇偶灯交叉闪烁三次,想闪烁⼏次就修改(K<3)中的数值; { LED_A = 0xAA; delayms(); LED_A = 0x55; delayms(); } for(k=3;k>0;k--) //实现⼀个流⽔灯左右三次(从左到右再从右到左算⼀次); { for(j=0;j<LED_NUM;j++) { LED_A = LED_ALL[j]; delayms(); } for(j=6;j>0;j--) { LED_A = LED_ALL[j]; delayms(); } } for(k=0;k<3;k++) //实现前四个灯亮后四个灯灭,交叉闪烁3次,修改次数同上; { LED_A = 0xf0; delayms(); LED_A = 0xf; delayms(); } for(k=3;k>0;k--) //实现两个灯依次流⽔3次; { for(j=0;j<4;j++) { LED_A = LED_ALL_2[j]; delayms(); } for(j=2;j>0;j--) { LED_A = LED_ALL_2[j]; delayms(); } } }}2.实现第⼀个灯呼吸,由暗变亮,再由亮变暗,程序如下;#include <reg52.h>sbit LED1 = P3^0;void delay(unsigned int a) //定义⼀个延时函数{ while(--a);}void main(){ unsigned int t,circle=800; //定义变量,circle=800为led灯呼吸的间隔长短,数值越⼩,间隔越短。

多种方法写出的51单片机流水灯C语言程序

多种方法写出的51单片机流水灯C语言程序

目录流水灯最原始 (1)流水灯位左移 (3)流水灯移位函数 (4)流水灯数组 (5)流水灯精确定时器 (6)流水灯最原始#include "reg51.h"sbit p0=P1^0;sbit p1=P1^1;sbit p2=P1^2;sbit p3=P1^3;sbit p4=P1^4;sbit p5=P1^5;sbit p6=P1^6;sbit p7=P1^7;voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){while(1){P1=0;p0=1;mdelay(1000);p0=0;p1=1;mdelay(1000);p1=0;p2=1;mdelay(1000);p2=0;p3=1;mdelay(1000);p3=0;p4=1;mdelay(1000);p4=0;p5=1;mdelay(1000);p5=0;p6=1;mdelay(1000);p6=0;p7=1;mdelay(1000);p7=0;}}流水灯位左移#include "reg51.h"voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char i;unsignedint led;while(1){led=0xfe;for(i=0;i<8;i++){P1=led;mdelay(1000);led=led<<1;led=led|0x01;}}}流水灯移位函数#include "reg51.h"#include "intrins.h"voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char led;led=0x01;while(1){P1=led;led=_crol_(led,1);mdelay(1000);}}流水灯数组#include "reg51.h"unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char i;while(1){for(i=0;i<8;i++){P1=table[i];mdelay(1000);}}}流水灯精确定时器#include "reg51.h"#include "intrins.h"unsignedint count=0,led;void main(){P1=0x00;led=0x01;EA=1;ET0=1;TMOD=0x01;TH0=0x3c;TL0=0xb0;TR0=1;for(;;){;}}voidbiao() interrupt 1{count++;if(count==20){count=0;P1=led;led=_crol_(led,1);}TH0=0x3c;TL0=0xb0;}。

51单片机经典流水灯程序

51单片机经典流水灯程序

单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#01111111B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#10111111B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#11101111BLCALL DELAYMOV P1,#11110111BLCALL DELAYMOV P1,#11111011BLCALL DELAYMOV P1,#11111101BLCALL DELAYMOV P1,#11111110BLCALL DELAYMOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯org 00h ;程序上电从00h开始ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成11111110loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。

基于51单片机的各种花样的流水灯c51程序

基于51单片机的各种花样的流水灯c51程序

基于51单片机的各种花样的流水灯c51程序/*-----------------------------------------------功能:流水灯对称移动闪烁(双闪烁)------------------------------------------------*/#include<REG52.H>#define uint unsigned intvoid delay(uint);main(){uint comp1=0xfe;uint comp2=0x80;P1=0x7e;delay(30000);while(1){P1=0xff;comp1<<=1;comp1|=0x01;comp2>>=1;P1&=comp1;P1^=comp2;delay(30000);if(P1==0xe7){comp1<<=1;comp1|=0x01;comp2>>=1;}if(comp1==0x7f){comp1=0xfe;comp2=0x80;}}}void delay(uint cnt){while(cnt--);}/*----------------------------------------------------------------- 只循环一次,而没有一直循环下去,出错地方在:通过添加一条测试语句:if(comp1==0x7f){comp1=0xfe; comp2=0x80; P1=0x00; delay(30000);}发现if语句没有被执行,自然继续左右移动:1111 1111&1111 1111^0000 0000==11111 1111所以看起来是执行了一次while中的代码。

具体为什么不行,还不清楚……更正下列代码后,能够实现功能。

if(P1==0x7e){comp1=0xfe;comp2=0x80;}或者:if(comp2==0x01){comp1=0xfe;comp2=0x80;}--------------------------------------------------------------*/*********************************************/*-----------------------------------------------功能:流水灯(单向单闪烁)------------------------------------------------*/#include<reg52.h>#define uint unsigned intvoid delay(uint);main(){//uint fre=0x03;//uint comp1=0xfe,comp2=0x80;P1=0xfe;while(1){/*------------------------------------------------------------------模块1:循环单向闪烁,只有一个灯亮灭执行3次,转入下一种闪烁--------------------------------------------------------------------*/ while(1){delay(30000);P1<<=1;P1|=0x01;if(P1=0x7f){delay(30000);P1=0xfe;}}}}void delay(uint cnt){while(cnt--);}/*-----------------------------------------程序运行结果左右两端跳动,原因是:if(P1=0x7f);中的等号也成了赋值号,更正为if(P1==0x7f);特别注意,不要把判断语句种的等号误写为赋值号。

51单片机8位流水灯程序设计的3种方法

51单片机8位流水灯程序设计的3种方法

51单片机8位流水灯程序设计的3种方法一、采用定义数组的方式进行LED灯流水灯调试:#include<reg52.h>unsigned char table[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};void delayms(unsigned int a){unsigned int i,j;for(j=a;j>0;j--)for(i=125;i>0;i--);}void main(){while(1){unsigned char b;for(b=0;b<8;b++){P1=table[b];delayms(1000);}}}程序编译通过,PRoteus仿真实现功能。

二、采用移位函数的方式进行LED灯流水灯调试:#include <reg52.h>#include <intrins.h>char temp;void delay(unsigned int m){unsigned int i,j;for(j=m;j>0;j--)for(i=125;i>0;i--);}void main(){unsigned char i;temp=0xfe;P1=temp;while(1){delay(300);P1=temp;}}程序编译通过,实现跑马灯循环效果,所使用的crol函数为移位专用函数,还可使用cror实现右移。

此外,还可使用>> <<移位符进行流水等程序设计。

3、实现8位流水灯来回跑动效果程序如下:#include <reg52.h>#include <intrins.h>char temp;void delay(unsigned int m){unsigned int i,j;for(j=m;j>0;j--)for(i=125;i>0;i--);}void main(){unsigned char i;temp=0xfe;P1=temp;while(1){for(i=7;i>0;i--){delay(300);P1=temp;}for(i=7;i>0;i--){temp=_cror_(temp,1);delay(300);P1=temp;}}}程序编译通过,仿真实现预期效果。

完整word版,C51单片机实行流水灯程序

完整word版,C51单片机实行流水灯程序

#include<reg51.h>#define LEDPort P1unsigned char LED01_[9]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,};//方式0,方式1灯开关数组。

unsigned char LED23_[5]={0xFF,0x7E,0xBD,0xDB,0xE7};// 方式2,方式3灯开关数组。

unsigned char LED4_[16]={0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X00,0X01,0X03,0X07,0X0f,0X1 f,0X3f,0X7f}; //方式4unsigned char LED56_[8]={0XFF,0X3F,0X9F,0XCF,0XE7,0XF3,0XF9,0XFC};unsigned char LED7_[]={0X0F,0XF0,0X33,0XCC,0X3C,0XC3,0XFF};unsigned char TAB[9]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};//定义断码表。

unsigned char i=0,j=9; //数据选择计数。

unsigned char Mode=0; //模式选择,默认为模式0。

unsigned char Count=1; //定时器中断计数。

unsigned char Delay=1; //延迟计数,通过改变改数值改变灯状态延迟时间。

//灯延迟时间=uc_Dalay*定时器溢出时间。

void main(){ P2=0X3F;TMOD=0x01; //定时器0模式一。

TH0=0x3C;TL0=0xB0; //溢出时间:50ms。

TR0=1; //定时器0开启。

IT0=1; //外部中断0下降沿触发。

IT1=1; //外部中断1下降沿触发。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//**
//*********************************************************************************************************
void vDelayChange(void) interrupt 2
{
if(Delay>=16)
//**
//*<函数功能>:当定时器0溢出时执行此函数,首先执行2个判断:*
//*(1)if判断是否改变灯的状态,可用于改变延时时间;*
//*(2)switch判断闪烁模式,根据不同模式对灯进行不同的通断。*
//*最后对定时器TH0,TL0重新赋值,溢出时间为50ms。*
//**
//*********************************************************************************************************
unsigned char LED7_[]={0X0F,0XF0,0X33,0XCC,0X3C,0XC3,0XFF};
unsigned char TAB[9]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};//定义断码表。
unsigned char i=0,j=9;//数据选择计数。
case 2:
if(i>=4)
i=0;
else i++;
LEDPort=LED23_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式3,灯从中间往两边依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 3:
if(i<=0)
while(1);
}
//*********************************************************************************************************
//**
//*************************************定时器0中断函数*************************************
i=4;
else i--;
LEDPort=LED23_[i];
break;
case 4:
if(i<16)
i++;
else i=0;
LEDPort=LED4_[i];
break;
case 5:
if(i<7)
i=i+2;
else i=0;
LEDPort=LED56_[i];
break;
case 6:
if(i<7)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式1,灯从下往上依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 1:
if(i<=0)
i=8;
else i--;
LEDPort=LED01_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式2,灯从两边往中间依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//方式2,方式3灯开关数组。
unsigned char LED4_[16]={0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X00,0X01,0X03,0X07,0X0f,0X1f,0X3f,0X7f};//方式4
unsigned char LED56_[8]={0XFF,0X3F,0X9F,0XCF,0XE7,0XF3,0XF9,0XFC};
case 8:
if(LEDPort==0xFF)
LEDPort=0x00;
else LEDPort=0xFF;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<其他>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void vModeChange(void) interrupt 0
{
if(Mode>7)
Mode=0;
else Mode++;
P2=TAB[Mode];
}
//*********************************************************************************************************
i++;
else i=0;
LEDPort=LED56_[i];
break;
case 7:
if(i>=7)
i=0;
else i++;
LEDPort=LED7_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<所有等以一定时间间隔同时闪烁。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include<reg51.h>
#define LEDPort P1
unsigned char LED01_[9]=
{0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,};
//方式0,方式1灯开关数组。
unsigned char LED23_[5]=
{0xFF,0x7E,0xBD,0xDB,0xE7};
//**
//*************************************外部中断1中断函数*************************************
//**
//*<函数功能>:当外部中断1产生下降沿信号时执行此函数,将闪灯时间从50ms,250ms,500ms,750ms循环切换。*
default:
break;
}
}Hale Waihona Puke else Count++;
TH0=0x3C;//重新给定时器赋值。
TL0=0xB0;//定时时间:50ms。
}
//*********************************************************************************************************
switch(Mode)
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式0,灯从上往下依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
相关文档
最新文档