单片机流水灯所有程序
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反复循环,, ,, ,, ,, 依次点亮然后轮流点亮小喇叭不停发出滴答声:注意该程序配套为我站的倚天版开发套件:如果是标准版:因他的数码管接法不同。
多种方法写出的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;}。
单片机流水灯程序
单片机流水灯程序流水灯是一种简单而常见的电子技术实验项目,也是学习掌握单片机编程的基本操作之一。
本文将介绍如何使用C语言编写单片机流水灯程序,并通过Markdown文本格式输出。
硬件准备在开始编写流水灯程序之前,我们需要准备以下硬件设备:1.单片机开发板(如:Arduino、STM32等)2.LED灯(可根据自己的需求选择,一般使用红色、黄色、绿色等常见颜色的LED灯即可)3.杜邦线(用于连接单片机和LED灯)程序编写引入头文件首先,我们需要引入相应的头文件,以便使用单片机相关的功能库和定义常量。
#include <Arduino.h>定义引脚接下来,我们需要定义引脚,将LED灯的接口与开发板的引脚连接起来。
#define LED_PIN_1 2#define LED_PIN_2 3#define LED_PIN_3 4#define DELAY_TIME 500在这个例子中,我们使用了3个LED灯,分别连接到开发板的2、3、4号引脚。
DELAY_TIME用于控制每个灯亮起的时间间隔,单位是毫秒。
初始化引脚在进入主程序之前,我们需要对引脚进行初始化,设置引脚的输出模式。
void setup() {pinMode(LED_PIN_1, OUTPUT);pinMode(LED_PIN_2, OUTPUT);pinMode(LED_PIN_3, OUTPUT);}主程序接下来就是我们的主程序部分,我们可以使用循环语句来实现LED灯的流水效果。
void loop() {digitalWrite(LED_PIN_1, HIGH);delay(DELAY_TIME);digitalWrite(LED_PIN_1, LOW);digitalWrite(LED_PIN_2, HIGH);delay(DELAY_TIME);digitalWrite(LED_PIN_2, LOW);digitalWrite(LED_PIN_3, HIGH);delay(DELAY_TIME);digitalWrite(LED_PIN_3, LOW);}在这个例子中,我们依次点亮每个LED灯,并延迟一定的时间后熄灭,然后依次点亮下一个LED灯,以此循环。
单片机流水灯程序大全
1、用Proteus软件画出电路原理图。
要求在P1.0至P1.7口线上分别接LED0至LED7八个发光二极管,在P3.0口线上接一蜂鸣器。
2、编写程序:要求LED0至LED7以秒速率循环右移。
3、编写程序:要求LED0至LED7以秒速率循环左移。
4、编写程序:要求在灯移动的同时,蜂鸣器逐位报警。
查询方式右移ORG 0000HCLRO: MOV IE, #00H;关闭中断MOV TMOD, #10H;方式1MOV SP, #30H; 开辟栈底MOV TH1, #3CH;采用定时器1定时50msMOV TL1, #0B0H;SETB TR1;开启定时器MOV P1, #07FH;起始状态LED7亮MOV A, #7FH;MOV P3, #0FFH;MAIN: MOV R3,#14H;20次LCALL TIME; 定时一秒CLR P3.0;RR A;右移MOV P1, A;灯右移LJMP MAIN;定时一秒的子程序TIME: JBC TF1, LOOP2;溢出标志位为1跳转AJMP TIME;LOOP2: MOV TH1, #3CH;MOV TL1, #0B0H;DJNZ R3, TIME;R3先自减再,判断R3是否为0,为0跳转RET;返回主程序END中断方式左移低电平有效START: LJMP MAINORG 000BHLJMP TTCOORG 0100HMAIN: MOV SP, #30H; 开辟栈底SETB EA; 打开总中断SETB ET0; 打开定时器中断MOV R1, #00H;MOV R2, #14H;MOV A, #0FEH; 给A送值MOV P1, A;初始状态LED0亮LOOP: LCALL TIME;调用一秒的延时子程序RL A;左移MOV P1, A;灯左移CLR P3.0;开启蜂鸣器LJMP LOOP;定时为1S,TIME: MOV TMOD, #01H; 设置定时器为工作方式1MOV TH0, #3CH; 初始化定时时间50usMOV TL0, #0B0H;SETB TR0;LOOP2: CJNE R1, #14H, LOOP2; 出现R1=14H才往下执行,MOV R1, #00H;RETORG 2000H中断程序TTCO: MOV TH0, #3CHMOV TL0, #0B0H; 再次初始化定时时间INC R1LOOP1: RETIEND双向流水灯循环ORG 0000HLJMP MAINORG 000BHLJMP TTC0MAIN: MOV R0, #08HMOV R1, #00HMOV A, #0FEHSETB EASETB ET0;LOOP1: LCALL TIMEMOV P1, ARL ACPL P3.0;DJNZ R0, LOOP1MOV R0,#08H;LOOP2: LCALL TIMERR A ;MOV P1,A;CPL P3.0DJNZ R0, LOOP2;MOV R0,#08H;LJMP LOOP1;TIME: MOV TMOD, #01HMOV TH0, #3CHMOV TL0, #0B0HSETB TR0;HERE: CJNE R1, #14H, HEREMOV R1, #00HRETORG 2000HTTC0: INC R1;MOV TH0, #3CHMOV TL0, #0B0HRETIEND十六进制数,12MHZ,ORG 0000HCLRO: MOV IE, #00H;MOV TMOD, #10H;方式1MOV TH1, #3CH;定时器1定时50msMOV TL1, #0B0H;SETB TR1;开始定时器MOV R3, #00H;MOV P1, #0FFH;led初始全灭MOV A, #00H;MOV P3, #0FFH;MOV SP, #30H;开辟堆栈MAIN: LCALL TIME;MOV R3, #00H;ADDC A, #01H;高电平有效MOV R2, A;保护A,CPL A;对A取反MOV P1, A;把A赋格P1MOV A, R2;取出以前的ACLR P3.0;开启蜂鸣器CJNE A, #0FFH, MAIN;MOV A, #00H;清零重新开始LJMP MAIN;延时1ms子程序TIME: JBC TF1, LOOP2;溢出标志位AJMP TIME;LOOP2: INC R3;MOV TH1, #3CH;MOV TL1, #0B0H;CJNE R3, #14H, TIME;执行20次RETENDLED0表示第七位--LED7表示第0位ORG 0000H ; 十六进制计数规律翻转亮灯(由原来子程序——查询改写)MAIN: MOV A, #01HCLR EAMOV R0, #14H;定20次MOV P1, #80HLOOP1: LCALL DELAYMOV R0, #14HINC AMOV 20H, A; 将A的值存入20H位寻址区JB 20H.0, FZ1; 判断20H.0是否为1NEXT1: JB 20H.1, FZ2; 。
51单片机经典流水灯程序
mov r3,#20 ;最外层循环二十次
ACALL DELAY
CLR P1.5
ACALL DELAY
CLR P1.5
ACALL DELAY
CLR P1.0
ACALL DELAY
SETB P1.0
ACALL DELAY
CLR P1.1
ACALL DELAY
SETB P1.1
ACALL DELAY
CLR P1.2
ACALL DELAY
SETB P1.2
DJNZ R7,D1 ;D1循环执行R7次
RET ;返回主程序
END ;结束程序
开关控制的单片机流水灯 汇编
在单片机控制下,用一个拨动开关K1,控制8个发光二极管L1-L8,发光的时间间隔为0.5秒。
具体要求:
当拨动开关K1发出低电平(K1=0)时,L1-L8从两头向中间逐个点亮,当L1-L8全部点亮后延时2秒钟全部熄灭,如此往复循环。
ACALL DELAY
CLR P1.4
ACALL DELAY
SETB P1.4
ACALL DELAY
CLR P1.5
ACALL DELAY
SETB P1.5
ACALL DELAY
CLR P1.6
ACALL DELAY
CLR P1.6
ACALL DELAY
CLR P1.0
ACALL DELAY
SETB P1.0
ACALL DELAY
CLR P1.2
ACALL DELAY
CLR P1.2
ACALL DELAY
CLR P1.0
ACALL DELAY
SETB P1.0
ACALL DELAY
8个流水灯程序
i = 10000; // SW Delay
do i--;
while(i != 0);
break;
}
}
P2DIR=BIT0;//P1.0显示按键起作用
P2OUT=BIT0+BIT3;//P2IN低电平跳转
P2REN=BIT3;//上拉电阻,缺了好像不能用
while(i != 0);
P1OUT ^= 0X20; // Toggle P1.5 using exclusive-OR
i = 10000; // SW Delay
do i--;
while(i != 0);
break;
}
}
while(i != 0);
P1OUT ^= 0X04; // Toggle P1.2 using exclusive-OR
i = 10000; // SW Delay
do i--;
while(i != 0);
P1OUT ^= 0X08; // Toggle P1.3 using exclusive-OR
while(i != 0);
P1OUT ^= 0X04; // Toggle P1.2 using exclusive-OR
i = 10000; // SW Delay
do i--;
while(i != 0);
break;
}
}
{
P1DIR |= 0X01; // Set P1.0 to output direction
P1DIR |= 0X02;
P1DIR |= 0X04;
P1DIR |= 0X08;
P1DIR |= 0X10;
简单的单片机的流水灯程序
;----- 主程序开始-----START:CLR P1.0 ;P1.0输出低电平,使LED1点亮ACALL DELAY;调用延时子程序SETB P1.0;P1.0输出高电平,使LED1熄灭CLR P1.1;P1.1输出低电平,使LED2点亮ACALL DELAY;调用延时子程序SETB P1.1;P1.1输出高电平,使LED2熄灭CLR P1.2;P1.2输出低电平,使LED3点亮ACALL DELAY;调用延时子程序SETB P1.2;P1.2输出高电平,使LED3熄灭CLR P1.3;P1.3输出低电平,使LED4点亮ACALL DELAY;调用延时子程序SETB P1.3;P1.3输出高电平,使LED4熄灭CLR P1.4;P1.4输出低电平,使LED5点亮ACALL DELAY;调用延时子程序SETB P1.4;P1.4输出高电平,使LED5熄灭CLR P1.5;P1.5输出低电平,使LED6点亮ACALL DELAY;调用延时子程序SETB P1.5;P1.5输出高电平,使LED6熄灭CLR P1.6;P1.6输出低电平,使LED7点亮ACALL DELAY;调用延时子程序SETB P1.6;P1.6输出高电平,使LED7熄灭CLR P1.7;P1.7输出低电平,使LED8点亮ACALL DELAY;调用延时子程序SETB P1.7;P1.7输出高电平,使LED8熄灭ACALL DELAY;调用延时子程序AJMP START;8个LED流了一遍后返回到标号START处再循环;----- 延时子程序-----DELAY:MOV R0,#255;延时一段时间D1:MOV R1,#255DJNZ R1,$DJNZ R0,D1RET;子程序返回END;程序结束。
单片机流水灯所有程序
单片机流水灯所有程序#include#define uchar unsigned char //char是字符数组#define unit unsigned intuchar num;sbit led1=P1^0;void main(){TMOD=0x01; // 打开工作方式寄存器,选择工作方式1(0000 0001)TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1); //程序停止在这里等待中断发生}void T0_time()interrupt 1{TH1=(65536-45872)/256; //装初值50msTL1=(65536-45872)%256;num++; //num每加一次判断是否到了20次if(num==20) // 20*50ms=1000ms=1s,间隔1s{num=0; //然后把num清0重新再计20次led1=~led1; //让发光管状态取反}}用定时器使1灯间隔1s闪烁#include#define uchar unsigned char#define unit unsigned intunit num ;#define ucha unsigned char#define uni unsigned intuni a ;uchar table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; // ucha table1[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};void delayms(unit);void main(){while(1){for(num=0;num<8;num++) //{P1=table[num];delayms(500);}for(a=8;a>0;a--) //改成for(a=0;a>8;a++){P1=table1[a];delayms(500);}}void delayms(unit xms){unit i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}没有实现理想的流水灯,问题已解决,见下面程序#include#define uchar unsigned char#define unit unsigned intunit num ;uchar table[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; void delayms(unit);void main(){while(1){for(num=0;num<9;num++){P1=table[num];delayms(500);}for(num=9;num>0;num--)P1=table[num];delayms(500);}}}void delayms(unit xms){unit i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}用数组实现流水灯循环,依次点亮,然后依次熄灭#include#define uchar unsigned char //char是字符数组#define unit unsigned intunit num ;uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 改变数组void delayms(unit);void main(){while(1){for(num=0;num<8;num++) //for循环P1=table[num];delayms(500);}}}void delayms(unit xms){unit i,j;for(i=xms;i>0;i--) //延迟0.5s,下一灯亮 // 加for语句for(j=110;j>0;j--);}用数组实现流水灯#include#include //包含_crol_函数所在的头文件#define unit unsigned intunit i,j;#define uchar unsigned charuchar a;void delayms(unit);void main(){a=0xfe; //赋给a初值0xfe,即1111 1110,第一个灯亮while(1){P1=a;delayms(500);a=_crol_(a,1); //循环左移指令或 a=a<<1;8 7 6 5 4 3 2 1灯}}void delayms(unit xms) //自定义毫秒X{unit i,j;for(i=xms;i>0;i--) //延迟Xmsfor(j=110;j>0;j--);}用循环左移指令实现流水灯#include //头文件#define unit unsigned int //宏定义unit i,j; //定义i;jvoid delay1s();sbit led1=P1^0; //连接1灯的是锁存器的P10端口sbit led2=P1^1;sbit led3=P1^2;sbit led4=P1^3;sbit led5=P1^4;sbit led6=P1^5;sbit led7=P1^6;sbit led8=P1^7;void main(){while(1) //循环永不停止{led1=0;delay1s(); //1灯亮1Sled1=1; led2=0 ; //1灯灭,二灯亮delay1s();led2=1;led3=0 ;delay1s();led3=1;led4=0;delay1s();led4=1;led5=0;delay1s();led5=1;led6=0;delay1s();led6=1;led7=0;delay1s();led7=1;led8=0;delay1s();led8=1;led1=0;}}void delay1s(){unit i,j; //for(i=500;i>0;i--) //延迟0.5s,下一灯亮for(j=110;j>0;j--);}流水灯#include#define unit unsigned intunit i,j;void delay1s();sbit led=P1;sbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit led4=P1^3;sbit led5=P1^4;sbit led6=P1^5;sbit led7=P1^6;sbit led8=P1^7; void main(){while(1){led1=0;delay1s();led2=0 ;delay1s();led3=0 ;delay1s();led4=0;delay1s();led5=0;delay1s();led6=0;delay1s();led7=0;delay1s();led8=0;delay1s();led8=1; delay1s();led7=1; delay1s();led6=1; delay1s();led5=1; delay1s();led4=1; delay1s();led3=1; delay1s();led2=1; delay1s();led1=1; delay1s();P1=0;delay1s(); P1=0xff;delay1s();}}void delay1s(){unit i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}依次点亮,一亮二亮----全亮---依次熄灭---全灭------全亮#include#define unit unsigned intunit i,j;void delay1s();sbit led=P1;sbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit led4=P1^3;sbit led5=P1^4;sbit led6=P1^5;sbit led7=P1^6;sbit led8=P1^7;void main(){while(1){led1=0;delay1s(); //1灯亮1Sled1=1; led2=0 ; //1灯灭,二灯亮delay1s();led2=1;led3=0 ;delay1s();led3=1;led4=0;delay1s();led4=1;led5=0;delay1s();led5=1;led6=0;delay1s();led6=1;led7=0;delay1s();led7=1;led8=0;delay1s();led8=1;P1=0;delay1s();P1=0xff ;}}void delay1s(){unit i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);} 依次亮,全亮,全灭,循环#include#define unit unsigned int unit i,j;void delay1s();sbit LED4=P1^3;sbit LED5=P1^4;sbit dula=P2^1;void main(){while(1){LED4=0;delay1s();LED4=1; LED5=0 ;delay1s();}}void delay1s(){unit i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}4闪5亮#includesbit LED2=P1^1;sbit dula=P2^6;void main(){ dula=1;LED2=0;dula=0;} 二灯亮#includesbit LED4=P1^3;sbit LED5=P1^4;sbit dula=P2^1;#define unit unsigned intvoid main(){ while (1){ LED4=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);LED4=1;LED5=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);}dula=1;LED4=0;dula=0;}4闪5亮#include#define unit unsigned int sbit led1=P1^0;void delays(unit);void main(){while(1){led1=0;delay1s();delay1s();}}void delay1s(){unit i,j; //使用局部变量可节约单片机内存for(i=500;i>0;i--)for(j=110;j>0;j--);}#includesbit led=P1^0;unsigned int a;void main() //主函数{while(1){a=51000;led=0;while(a--);led=1;a=51000;while(a--);}}用while函数实现延迟,延迟0.5s#include#define unit unsigned intsbit led1=P1^0;unit i,j;void main (){ while (1){ led1=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);led1=1;for(i=1000;i>0;i--)for(j=110;j>0;j--);}}一灯亮,延迟1s,灭。
各种流水灯程序
各种流水灯程序Lesso2.1: 第一个发光管以间隔200ms闪烁(这是最原始的程序没有用延迟子函数)。
#include<reg52.h>sbit D1=P1^0;int a;void main(){while(1){D1=0;a=25000;while(--a);D1=1;a=25000;while(--a);}}Lesson2.2: 8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint);uchar temp;sbit beep=P2^3;void main(){temp=0xfe;while(1){P1=temp;beep=0;delay(500);P1=0xff;beep=1;delay(500);temp=_crol_(temp,1);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}Lesson2.3:8个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint);uchar temp;int i,j;sbit beep=P2^3;void main(){temp=0xfe;while(1){for(i=7;i>0;i--) { beep=0;delay(100);beep=1;delay(100);beep=0;delay(100);beep=1;P1=temp;delay(500);temp=_crol_(temp,1); }for(i=7;i>0;i--) {beep=0;delay(100);beep=1;delay(100);beep=0;delay(100);beep=1;P1=temp;delay(500);temp=_cror_(temp,1);}}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}Lesson2.4:用8个发光管演示出8位二进制数累加过程。
单片机-流水灯的程序
#include<reg51.h> sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void delay (unsigned char x);
其中void表示这 个函数执行完后 不返回任何数据。 ()内无任何东西, 所以这是个无参 数的函数。 Delayms是函数名。
1
2
3
4
5
6
2)带参数函数的用位定义实现流水灯(8位二极管循环点亮)
编程思路: a) 先点亮第一盏灯,延时点亮第二盏, 依次延时8盏灯全部点亮。 b) 当8盏灯全部点亮时,熄灭8盏灯。 c) 进入循环。
循环移动
循环左移 最高位移入最低位,其它依次向左移动一位。C语言中 没有专门的指令,通过移位指令和简单逻辑运算来实现循环左移,或直接利用C51库中自带的函数-crol-实现。
循环右移 最低位移入最高位,其它位依次向右移一位,C语言中没有专门的指令,通过移位指令与简单的逻辑运算可以实现循环右移,或专门利用C51库中自带函数-cror-实现
方法二:利用总线控制实现流水灯(8位二极管循环点亮)
相关知识 二进制和十六进制之间的相互转换
二进制
十六进制
二进制
十六进制
0000
0
0100
4
0001
1
0101
5
0010
2
0110
6
0011
3
0111
7
二进制
十六进制
二进制
stc89c51单片机流水灯程序
51单片机流火灯步调之阳早格格创做步调一(用C谈话编的最前提的步调)#include<reg52.h>#include<stdio.h>sbit D0=P1^0;//位定义,把P1心的第一个管足定义为D0 sbit D1=P1^1;// 位定义,把P1心的第二个管足定义为D1 sbit D2=P1^2;// 位定义,把P1心的第3个管足定义为D2 sbit D3=P1^3;// 位定义,把P1心的第4个管足定义为D3 sbit D4=P1^4;// 位定义,把P1心的第5个管足定义为D4 sbit D5=P1^5;// 位定义,把P1心的第6个管足定义为D5 sbit D6=P1^6;// 位定义,把P1心的第7个管足定义为D6 sbit D7=P1^7;// 位定义,把P1心的第8个管足定义为D7 void main(){while(1)//修坐大的死循环.{unsigned int i,j;D0=0,D7=1;//明灯1,闭灯8for(i=50;i>0;i)for(j=200;j>0;j);//二个FOR组成的延时D0=1,D1=0;// 明灯2,闭灯1for(i=50;i>0;i)for(j=200;j>0;j);D1=1,D2=0;for(i=50;i>0;i)for(j=200;j>0;j);D2=1,D3=0;for(i=50;i>0;i)for(j=200;j>0;j);D3=1,D4=0;for(i=50;i>0;i)for(j=200;j>0;j);D4=1,D5=0;for(i=50;i>0;i)for(j=200;j>0;j);D5=1,D6=0;for(i=50;i>0;i)for(j=200;j>0;j);D6=1,D7=0;for(i=50;i>0;i)for(j=200;j>0;j);}}步调二(用swich case语句编的)#include<reg52.h>//51单片机的头文献. sbit d1=P1^0;//sbit d2=P1^1;sbit d3=P1^2;sbit d4=P1^3;sbit d5=P1^4;sbit d6=P1^5;sbit d7=P1^6;sbit d8=P1^7;void main(){unsigned int i=1,a,b;while(1)//大循环{for(i=1;i<15;i++){for(a=0;a<80;a++)//延时.for(b=0;b<200;b++);switch(i){case 1:d2=1,d1=0,d8=1;break; case 2:d1=1,d2=0; break; case 3:d2=1,d3=0; break; case 4:d3=1,d4=0; break; case 5:d4=1,d5=0; break; case 6:d5=1,d6=0; break; case 7:d6=1,d7=0; break; case 8:d7=1,d8=0; break;case 9:d8=1,d7=0;break;case 10:d7=1,d6=0;break;case 11:d6=1,d5=0;break;case 12:d5=1,d4=0;break;case 13:d4=1,d3=0;break;case 14:d3=1,d2=0;break;}};}}步调三(最简净的):#include<reg52.h>#include<intrins.h>//_crol_战_cror_的头文献. void delay(unsigned int z)//修坐延时子函数. {unsigned int i,j;for(i=0;i<z;i++)for(j=0;j<200;j++);}void main(){unsigned char d;d=0xfe;while(1)//{for(;d>0x7f;){P1=d;delay(100);//调用延时子函数延时.d=_crol_(d,1);//循环左移.}for(;d<0xfe;){P1=d;delay(100);d=_cror_(d,1);//循环左移,让灯倒回来.}}}数码管流火灯:#include<reg52.h>#include<intrins.h>void delay(unsigned int a){unsigned int b;b=a;while(b>0)b;}void main(){unsigned int i,j;unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0x3f:为0,即数码管明“0”.P2=0;//挨开数码管的第一个,P0=j;//对于数码管举止赋值while(1){i=0;for(j=0;j<16;j++){P2=i;P0=A[j];delay(50000);i++;}}}数码管步调二:#include<intrins.h>void delay(unsigned int a){unsigned int b;b=a;while(b>0)b;}void main(){int i,j;unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};P2=0;P0=j;while(1){j=0;for(i=0;i<8;i++){P2=i;P0=A[j];delay(50000);j++;}for(i=7;i>=0;i){P2=i;P0=A[j];delay(50000);j++;}}}中断步调一#include<reg52.h>#include<intrins.h>void delay(unsigned int a){unsigned int b;b=a;while(b>0)b;}void main(){int i,j;unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};EA=1;//挨开总中断EX0=1;//挨开中部中断0.IT0=0;//采用其为矮电仄灵验灵验.当CPU检测到P3.3引足上出现灵验的中断旗号时,中断标记IE1(TCON.3)置1,背CPU申请中断.P2=0;P0=j;P1=0xfe;while(1){j=0;for(i=0;i<8;i++){P2=i;P0=A[j];delay(50000);j++;}for(i=7;i>=0;i){P2=i;P0=A[j];delay(50000);j++;}}}void exist() interrupt 0//中断子步调,其中“0”为中部中断的序号{P1=_crol_(P1,1);delay(50000);}定时步调;include<reg52.h>unsigned int i=0,j=0,t;unsigned code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void main(){TMOD=0x01;//对于TMOD赋值,以决定T0战T1的处事办法.TH0=(6553650000)/256;TL0=(6553650000)%256;//定时/计数器的真量是加1计数器(16位),由下8位战矮8位二个寄存器组成.对于下8位战矮8位赋值.EA=1;//开总中断ET0=1;//则对于IE赋值,开搁中断TR0=1;//使TR0或者TR1置位,开用定时/计数器定时. while(1){if(t==20){t=0;if(j==8)j=0;if(i==16)i=0;P2=j;P0=a[i];i++;j++;}}}void time() interrupt 1//定时子步调,其中“1”为定时/计数器序号{TH0=(6553650000)/256;TL0=(6553650000)%256;t++;}。
51单片机经典流水灯程序
单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成loop: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个发光二极管,产生流水灯的移动效果。
ORG 0;程序从0地址开始START: MOV A,#0FEH ;让ACC的内容为LOOP: MOV P2,A ;让P2口输出ACC的内容RR A;让ACC的内容左移CALL DELAY ;调用延时子程序LJMP LOOP ;跳到LOOP处执行;0.1秒延时子程序(12MHz晶振)===================DELAY: MOV R7,#200 ;R7寄存器加载200次数D1: MOV R6,#250 ;R6寄存器加载250次数DJNZ R6,$ ;本行执RET;返回主程序END;结束程序开关控制的单片机流水灯汇编在单片机控制下,用一个拨动开关K1,控制8个发光二极管L1-L8,发光的时间间隔为0.5秒。
51单片机流水灯程序
char code table4[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,};//P0123 一个灯走动
char code table5[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,};//P0123 两个灯走动
char code table6[]={0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,};//P0123 三个灯走动
for(j=0;j<8;j++)//P0123 一条龙一个灯走动
{ P0=table4[j];
delay(5);
} P0=0xff;
for(j=0;j<8;j++)//P0123 一条龙一个灯走动
{ P2=table4[j];
delay(5);
}
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
for(j=0;j<7;j++)//P0123 两个灯走动
{ P0=table5[j];
P1=table5[j];
P2=table5[j];
P3=table5[j];
for(j=1;j<7;j++)//P0123 一条龙两个灯走动
{ P2=table5[j];
delay(5);
{ P0=table10[j];
P1=table10[j];
P2=table10[j];
P3=table10[j];
delay(5);
} P0=0x00;P1=0x00;P2=0x00;P3=0x00;delay(5);
单片机-流水灯的程序
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
单片机-流水灯的程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sbit led=P1;
sbit led仁PMO;
sbit led2=P1A1;
sbit led3=P1A2;
sbit led4=P1A3;
sbit led5=P1A4;
sbit led6=P1A5;
sbit led7=P1A6;
sbit led8=P1A7;
void main()
void main()
{while(1){for(num=0;num<8;num)//for{
P1=table[num]; delayms(500);
}
}
void delayms(unit xms)
{ห้องสมุดไป่ตู้
unit i,j;
for(i=xms;i>0;i--)//
加for语句for(j=110;j>0;j--);
TLO=(65536-45872)%6;
EA=1; //开总中断
ETO=1; //开定时器O中断
TRO=1; //启动定时器O
while(1);//程序停止在这里等待中断发生
}
void TO_time()interrupt 1
{
TH1=(65536-45872)/256; //装初值5Oms
TL1=(65536-45872)%6;
#define unit unsigned int
unit num;
#define ucha unsigned char
#define uni unsigned int
uni a;
uchar table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//????uchatable1[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
unit num;
uchar table[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
void delayms(unit);
void main()
{
while(1)
{
for(num=0;num<9;num)
{
P1=table[num];
delayms(500);
{
while(1)
{led1=O;
delay1s();
led2=0;
delay1s();
led3=0;
delay1s();
void delayms(unit);
void main()
{
while(1)
{
for(num=0;num<8;num) //????
{
P1=table[num];
delayms(500);
}
for(a=8;a>0;a--) //改成for(a=0;a>8;a)
{
P1=table1[a];
delayms(500);
void main()
{
a=0xfe;//
1111 1110,第一个灯亮
while(1)
{
P1=a;
delayms(500);
a=_crol_(a,1);//
7 6 5 4 3 2 1灯
}
}
包含_crol_函数所在的头文件
赋给a初值Oxfe,即
循环左移指令或a=a<<1;8
void delayms(unit xms)//{
}
}
}
void delayms(unit xms)
{
unit i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}没有实现理想的流水灯,问题已解决,见下面程序
#include<reg52.h>
#define uchar unsigned char
#define unit unsigned int
}
for(num=9;num>0;num--)
{
P1=table[num];
delayms(500);
}
}
}
void delayms(unit xms)
{
unit i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
用数组实现流水灯循环,依次点亮,然后依次熄灭
#include<reg52.h>
unit i,j;
for(i=xms;i>0;i--)//
for(j=110;j>0;j--);
}用循环左移指令实现流水灯
led3=1;led4=0; delay1s();
led4=1;led5=0; delay1s();
led5=1;led6=0; delay1s();
led6=1;led7=0; delay1s();
num ; //num每加一次判断是否到了2O次
if(num==2O) // 2O*5Oms=1OOOms=1s,间隔1s
{
num=0;//然后把num清0重新再计20次
led1=~led1;//让发光管状态取反
}
}
用定时器使1灯间隔1s闪烁
#include<reg52.h>
#define uchar unsigned char
led7=1;led8=0; delay1s();
led8=1;led1=0;
}
}
void delay1s()
{
unit i,j;//for(i=500;i>0;i--)//
for(j=110;j>0;j--);
}流水灯
#include<reg52.h>
#define unit unsigned int unit i,j;
}
用数组实现流水灯
延迟0.5s,下一灯亮//
#include<reg52.h>
#include<intrins.h>//#define unit unsigned int unit i,j;
#define uchar unsigned char uchar a;
void delayms(unit);
#define uchar unsigned char
//char是字符数组
#define unit unsigned int unit num;
uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};变数组
void delayms(unit);
#include<reg52.h>
#define uchar unsigned char
//char是字符数组
#define unit unsigned int
uchar num;
sbit led仁PMO;
void main()
{
TMOD=OxO1; //打开工作方式寄存器,选择工作方式THO=(65536-45872)/256;