单片机32个IO口流水灯C程序
- 格式:doc
- 大小:32.50 KB
- 文档页数:4
说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。
那个单片机究竟有什么功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^)我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。
一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。
#include<reg51.h> //头文件定义。
或用#include<at89x51.h>其具体的区别在于:后者定义了更多的地址空间。
//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0; //定义管脚void main (void){while(1){P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}}就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。
因为我们把LED的正通过电阻接至VCC。
P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。
那么这样就能达到了我们预先的要求了。
while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。
如果我们要试着点亮其他的LED,也类似上述语句。
这里就不再讲了。
点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。
我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。
假设我们有8个LED分别接在P1口的8个引脚上。
硬件连接,在P1_1--P1_7上再接7个LED即可。
例程如下:#include<reg51.h>sbit P1_0 = P1 ^ 0;sbit P1_1 = P1 ^ 1;sbit P1_2 = P1 ^ 2;sbit P1_3 = P1 ^ 3;sbit P1_4 = P1 ^ 4;sbit P1_5 = P1 ^ 5;sbit P1_6 = P1 ^ 6;sbit P1_7 = P1 ^ 7;void Delay(unsigned char a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
单片机控制流水灯程序汇编语言随着科技的发展和微电子技术的迅猛进步,单片机逐渐成为智能系统与设备中不可或缺的组成部分。
而流水灯作为最基础的应用之一,不仅在学习过程中具有重要意义,同时也在实际工程中发挥着重要作用。
本文将介绍如何使用汇编语言编写单片机控制流水灯程序,并详细讲解其运行原理和实现方法。
一、流水灯原理流水灯是一种由多个LED组成的灯条或灯链,在按照一定次序依次点亮和熄灭的灯光效果。
其原理基于单片机通过控制输出口的电平高低来控制LED的亮灭状态,实现灯光的变化和移动效果。
二、程序设计方法1. 初始化设置在编写流水灯程序之前,我们首先要了解单片机的相应接口和寄存器的使用方法。
在程序开始时,需要进行相应的初始化设置,包括将数据方向寄存器和端口寄存器设置为输出,并将初始值赋予输出口电平。
例如,对于51单片机,可以使用以下汇编语言代码进行初始化设置:MOV P1, #00H ;将P1端口的输出电平置为低电平MOV P1M1, #FFH ;将P1端口的数据方向设置为输出MOV P1M0, #00H2. 主程序在流水灯程序中,需要编写主程序来实现流水灯的效果。
主程序中使用循环结构控制LED的亮灭状态和移动效果。
例如,以下是一个简单的汇编语言代码,实现了由4个LED组成的流水灯的效果:MOV R0, #F0H ;初始亮灭状态MOV R1, #00H ;初始LED位置LOOP: ;循环MOV P1, R0 ;将亮灭状态赋予P1端口的输出电平ACALL DELAY ;延时,形成流水灯效果MOV A, R1SUBB A, #01H ;将LED位置减一MOV R1, AJZ CHANGE ;当LED位置为零时,改变亮灭状态MOV R0, R0SJMP LOOP ;继续循环CHANGE: ;改变亮灭状态CPL R0 ;对亮灭状态进行取反操作SJMP LOOP ;继续循环3. 延时函数为了实现流水灯的移动效果,需要设置一个合适的延时时间来控制LED的亮灭速度。
C51单片机(32路流水灯C语言程序)#include <reg52.h>void delay(int t){ //时间延迟子函数unsigned int i,j;for(j=0;j<30;j++)for(i=0;i<t;i++);}void putOne(int n,char a){ //定义变量函数unsigned int m = n%8, k = n/8, b;if(k==0) b=P0; if(k==1) b=P1; if(k==2) b=P2; if(k==3) b=P3; if(a) b = b & (~(1<<m));else b = b | (1<<m) ;if(k==0) P0=b; if(k==1) P1=b; if(k==2) P2=b; if(k==3) P3=b; }void liu(int n1,int n2){ //流水灯子程序int i;for(i=n1; i<=n2; i++ ) {putOne(i,1);delay(2000);putOne(i,0);}}main(){ //流水灯主程序while(1){P0 = P1 = P2 =P3 = 0;liu(0, 31 ); putOne(31,1);liu(0, 30 ); putOne(30,1);liu(0, 29 ); putOne(29,1);liu(0, 28 ); putOne(28,1);liu(0, 27 ); putOne(27,1);liu(0, 26 ); putOne(26,1);liu(0, 25 ); putOne(25, 1);liu(0, 24 ); putOne(24,1);liu(0, 23 ); putOne(23,1);liu(0, 22 ); putOne(22,1);liu(0, 21 ); putOne(21,1);liu(0, 20 ); putOne(20,1);liu(0, 19 ); putOne(19,1);liu(0, 18 ); putOne(18, 1);liu(0, 17 ); putOne(17,1);liu(0, 16 ); putOne(16,1);liu(0, 15 ); putOne(15,1);liu(0,14 ); putOne(14,1);liu(0, 13 ); putOne(13,1);liu(0, 12 ); putOne(12,1);liu(0, 11 ); putOne(11, 1);liu(0, 10 ); putOne(10,1);liu(0, 9 ); putOne(9,1);liu(0, 8 ); putOne(8,1);liu(0, 7 ); putOne(7,1);liu(0, 6 ); putOne(6,1);liu(0, 5 ); putOne(5,1);liu(0, 4 ); putOne(4, 1);liu(0, 3 ); putOne(3,1);liu(0, 2 ); putOne(2,1);liu(0, 1 ); putOne(1,1);liu(0, 0 ); putOne(0,1);P0 = P1 = P2 =P3 =0; delay(2000);P0 = P1 = P2 =P3 =255; delay(2000); P0 = P1 = P2 =P3 =0; delay(2000);}如主函数改成:main() //流水灯主程序{unsigned int k;while(1){P0 = P1 = P2 =P3 = 0;for(k=31;k>-1;k--){liu(0, k); putOne(k,1);}P0 = P1 = P2 =P3 =0; delay(2000);P0 = P1 = P2 =P3 =255; delay(2000);P0 = P1 = P2 =P3 =0; delay(2000);}}这样就可以代替你的主程序了/local/changchun/huochezhan-sq-jiudian-tg?sp=1。
32种花样流⽔灯c语⾔程序,32LED单⽚机⼼形花样流⽔灯程序+视频include#include#define uint unsigned int#define uchar unsigned charuchar code zou[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//单个从0到7uchar code you[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//单个从7到0uchar code liang0_7[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; // 逐个点亮0~7uchar code liang7_0[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; // 逐个点亮7~0uchar code mie0_7[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; // 逐个灭0~7uchar code mie7_0[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; // 逐个灭7~0/***********************************************************/void delay(uint t); //延时void zg(uint t,uchar a);//两边逐个亮void qs(uint t,uchar a);//全部闪烁void zgxh(uint t,uchar a); // 逆时针逐个点亮//void zgxh1(uint t,uchar a); // 顺时针逐个点亮void djs(uint t,uchar a); //对⾓闪void lbzgm(uint t,uchar a);//两边逐个灭//void sszgm(uint t,uchar a); // 顺时针逐个灭void nszgm(uint t,uchar a); // 逆时针逐个灭void sztl(uint t,uchar a);//顺时逐个同步亮void nztl(uint t,uchar a);//逆时逐个同步亮void sztm(uint t,uchar a);//顺时逐个同步灭void nztm(uint t,uchar a);//逆时逐个同步灭void hwzjl(uint t,uchar a); //横往中间亮void hwzjm(uint t,uchar a); //横往中间灭//void swzjl(uint t,uchar a); //竖往中间亮//void swzjm(uint t,uchar a); //竖往中间灭void nzdl(uint t,uchar a); //逆时逐段亮void nzdgl(uint t,uchar a); //逆时逐段⼀个点亮void jgs(uint t,uchar a); //间隔闪/**********************************************************/ void zg(uint t,uchar a)//两边逐个亮{uchar i,j;for(j=0;j{P0=P1=P2=P3=0x00;P0=0x01;delay(t);for(i=0;i<7;i++){P0=liang0_7[i+1];P3=liang7_0[i];delay(t);}P3=0xff;P1=0x01;delay(t);for(i=0;i<7;i++){P1=liang0_7[i+1];P2=liang7_0[i];delay(t);}P2=0xff;delay(t);}}void qs(uint t,uchar a) //全部闪烁{uchar j;for(j=0;j。
五种编程方式实现流水灯的单片机C程序//功能:采用顺序结构实现的流水灯控制程序/*此方式中采用的是字操作(也称为总线操作)*/#include <reg51."h>void delay(unsigned char i);//延时函数声明void main()//主函数{while(1) {P1 = 0xfe;//点亮第1个发光二极管,0."000389sdelay(200);//延时P1 = 0xfd;//点亮第2个发光二极管,0."155403s,0."1558delay(200);//延时P1 = 0xfb;//点亮第3个发光二极管delay(200);//延时P1 = 0xf7;//点亮第4个发光二极管delay(200);//延时P1 = 0xef;//点亮第5个发光二极管delay(200);//延时P1 = 0xdf;//点亮第6个发光二极管delay(200);//延时P1 = 0xbf;//点亮第7个发光二极管delay(200);//延时P1 = 0x7f;//点亮第8个发光二极管delay(200);//延时}}//函数名:delay//函数功能:实现软件延时//形式参数:unsigned char i;//i控制空循环的外循环次数,共循环i*255次//返回值:无voiddelay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{unsigned char j, k;//定义无符号字符型变量j和kfor(k = 0; k < i; k++)//双重for循环语句实现软件延时for(j = 0; j < 255; j++);}//功能:采用循环结构实现的流水灯控制程序//此方式中采用的移位,按位取反等操作是位操作#include <reg51."h>//包含头文件REG51."Hvoid delay(unsigned char i);//延时函数声明void main()//主函数{unsigned char i,w;while(1){w = 0x01;//信号灯显示字初值为01Hfor(i = 0; i < 8; i++){P1 = ~w;//显示字取反后,送P1口delay(200);//延时w <<= 1;//显示字左移一位}}}//函数名:delay//函数功能:实现软件延时//形式参数:unsigned char i;//i控制空循环的外循环次数,共循环i*255次//返回值:无voiddelay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{unsigned char j,k;//定义无符号字符型变量j和kfor(k = 0; k < i; k++)//双重for循环语句实现软件延时for(j = 0; j < 255;j++);}/**************************************************************** *****///功能:采用位运算符编写的流水灯控制程序,显示效果为依次熄灭信号灯//此方式也是典型的顺序结构#include <reg51."h>void delay(unsigned char i);//延时函数声明void main()//主函数{while(1) {P1 = 0x00;//P1口全部清0,即点亮8个发光二极管delay(200);//延时P1 = P1 | 0x01;//熄灭第1个发光二极管delay(200);//延时P1 = P1 | 0x03;//熄灭第1、"2个发光二极管delay(200);//延时P1 = P1 | 0x07;//熄灭第1~3个发光二极管delay(200);//延时P1 = P1 | 0x0f;//熄灭第1~4个发光二极管delay(200);//延时P1 = P1 | 0x1f;//熄灭第1~5个发光二极管delay(200);//延时P1 = P1 | 0x3f;//熄灭第1~6个发光二极管delay(200);//延时P1 = P1 | 0x7f;//熄灭第1~7个发光二极管delay(200);//延时P1 = P1 | 0x7f;//熄灭所有发光二极管delay(200);//延时}}//函数名:delay//函数功能:实现软件延时//形式参数:unsigned char i;//i控制空循环的外循环次数,共循环i*255次//返回值:无voiddelay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{unsigned char j, k;//定义无符号字符型变量j和kfor(k = 0; k < i; k++)//双重for循环语句实现软件延时for(j = 0; j < 255;j++);}/**********************************************************/ //功能:采用数组实现的流水灯控制程序//此方式也是典型的循环结构#include <reg51."h>//包含头文件REG51."Hvoid delay(unsigned char i);//延时函数声明void main()//主函数{unsigned char i;unsigned char display[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};(1){for(i = 0; i < 8; i++){P1 = display[i];//显示字送P1口delay(200);//延时}}}//函数名:delay//函数功能:实现软件延时//形式参数:unsigned char i;//i控制空循环的外循环次数,共循环i*255次//返回值:无voiddelay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{unsigned char j, k;//定义无符号字符型变量j和kfor(k = 0; k < i; k++)//双重for循环语句实现软件延时for(j = 0; j < 255; j++);}#include<reg52."h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint z){uint x, y;for(x = z; x > 0; x--)for(y = 110; y > 0; y--);}void main(){uchar a, i, j;(1){for(j = 0; j<2; j++){a = 0xfe; for(i = 0; i<8; i++){P2 = a;delay(200);a = _crol_(a, 1); //11110}a = 0x7f; for(i = 0; i < 8; i++){P2 = a;delay(200);a = _cror_(a, 1);}}P2 = 0xff;for(j = 0; j < 10; j++)}}{}delay(300);P2 = ~P2;。
流水灯程序闲来没事,就总结一下流水灯的工作,用两种语言实验C语言和汇编语言。
学习单片机的第一个程序就是流水灯实验!学习语言的输出的第一个程序就是hello word! 这都是一个过程!我们知道单片机执行的机器语言!汇编就是其执行的根本的语言,任何程序的编译最终还是要生成HEX语言,汇编语言~~!来回显示,并且显示时还会发出蜂咛声!P1口接八个发光二极管,P2.3接一个蜂咛器!一.汇编语言mov r7,#8main:mov r0,#8 ;一个循环需要移动8位acall ds1ms ;延时,以便人眼可以观察到acall ds1msmov a,p1 ;读P0口当前显示的数据送到Arr a ;将A中的数据循环右移1位mov p1,a ;再将A中右移过的数据送到P0djnz r0,loopdjnz r7,main ;移动不够8位,跳到LOOP处循环,ljmp rel ;流动1遍跳转到MAIN处循环流。
;---显示延时----------ds1ms: mov r1,#1ds1lo: mov r2,#200ds2lo: mov r3,#200djnz r3,$djnz r2,ds2lodjnz r1,ds1loret ;延时返回rel:end二.C语言#include<reg52.h>unsigned char i;unsigned char temp;unsigned char a,b;void delay(void) //延时子程序{unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}void main(void) //主程序{while(1) //循环条件永远为真,以下程序一直执行下去。
{temp=0xfe;P1=temp; //直接对I/O口P1赋值,使P1.0输出低点平。
delay(); //延时for(i=1;i<8;i++) //实现广告灯的移动{a=temp<<i;b=temp>>(8-i);P1=a|b;delay();}for(i=1;i<8;i++) //实现广告灯的反方向移动{a=temp>>i;b=temp<<(8-i);P1=a|b;delay();}}}实验很简单!懂的朋友完全可以在此基础上开发!比如一个爱心的流水灯。