单片机 用汇编语言 使8个单片机发光二极管管(LO~L7)从中间(L3,L4)两个两个往两边逐一点亮

导读:单片机控制LED流水灯从中间向两边,从两边向中间,两个分别从两边往中间流动三次,再从中间往两边流动三次,程序实现的第2种方法:下面是http://www.51hei.com单片机12群,从两边向中间的效果,0xFF,0xE7,0xC3,0x81,0x00,//从中间向两侧点亮0xFF,,0xFF,0x7E,0x3C,0x18,0x00,//从两侧向中间点亮0xFF,,汇编程序如下:;花样流水灯
单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的应该是这样的先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动;
#include #include #define uint unsigned int #define uchar unsigned char
void delay(); void main() { uchar temp,temp1,temp2,a,b;
while(1) {
for(b=3;b>0;b--)
delay(); temp=0x55;
P1= delay();
} for(a=3;a>0;a--)
{ temp=0 for(b=7;b>0;b--) {
P1= temp=_crol_(temp,1); delay();
P1= delay();
temp2=0x7f;
for(a=8;a>0;a--)
temp=temp1&temp2;
P1= delay();
temp1=_crol_(temp1,1);
temp2=_cror_(temp2,1);
} } void delay() { uinta,b; for(a=100;a>0;a--) for(b=600;b>0;b--); }
程序实现的第2种方法:下面是http://www.51hei.com单片机12群里的朋友木信大侠提出的,实现单片机led流水灯从中间向两边,从两边向中间的效果,下面的程序就是实现思路,这个是直接调用,应该明白吧,数组那其实也可以改一下,如采用一维数组,在多次调用;也可以采用二维数组。主要看个人喜好. ----------------------------------------------------- #include unsigned char code TABLE[]={
0xFF,0xE7,0xC3,0x81,0x00,
//从中间向两侧点亮 0xFF,0xE7,0xC3,0x81,0x00,
0xFF,0xE7,0xC3,0x81,0x00,
0xFF,0x7E,0x3C,0x18,0x00,
//从两侧向中间点亮 0xFF,0x7E,0x3C,0x18,0x00,
0xFF,0x7E,0x3C,0x18,0x00 };
for(s=0;s<30000;s++);
if(TABLE[i]!=0x01)
P1=TABLE[i];
i++; DELAY();
汇编程序如下:;
花样流水灯(8个发光二极管以各种形式循环点亮); 功能:流水灯(8个发光二极管循环以1S间隔以各种形式循环点亮)
ORG 0000H伪指令,指定程序从0000H开始存放
LJMP MAIN跳转指令,程序跳转至MAIN处执行
ORG 0030H伪指令,指定程序从0030H开始存放MAIN:
MOV SP, #60H给堆栈指针赋初值
MOV P1,#0FFH给P1口赋值
MOV DPTR,#TABLE;查表LIGHT: MOV R4,#42设置循环次数LOOP: MOV A,#42给A赋初值
SUBB A,R4将A的值与R4的值相减,结果存在A中
MOVC A,@A+DPTR ;将A+DPTR的值所对应的TABLE中的值赋给A
MOV P1,A将A的值赋给P1口
LCALL DEL1S调用1S延时子程序
DJNZ R4,LOOP判断R4是否为0,不为0跳转,为0顺序执行
LJMP LIGHT跳转指令,跳转至LIGHT处继续执行;1S延时子程序(11.0592MHz晶振,误差0微秒)DEL1S: MOV R5, #089HDL1S0:
MOV R6, #0A4HDL1S1: MOV R7, #013H
DJNZ R7, $
DJNZ R6, DL1S1
DJNZ R5, DL1S0
RETTABLE: ;定义表格数据DB 0FFH ;全灭DB 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 07FH ;依次逐个点亮DB 0FEH 0FCH 0F8H 0F0H 0E0H 0C0H 080H 000H ;依次逐个叠加DB 080H 0C0H 0E0H 0F0H 0F8H 0FCH 0FEH 0FFH ;依次逐个递减DB 07EH 0BDH 0DBH 0E7H 0E7H 0DBH 0BDH 07EH ;两边靠拢后分开DB 07EH 03CH 018H 000H 000H 018H 03CH 07EH ;两边叠加后递减DB 000H ;全亮
END程序结束指令C语言程序如下:/* 该实验是花样流水灯(8个发光二极管以各种方式循环点亮),功能是花样流水灯(8个发光二极管以1S间隔以各种方式循环点亮) */#include//包含reg.52文件#define uint unsigned int//宏定义#define uchar unsigned char//宏定义void delay(uint z);//声明延时函数//定义循环用变量uchar code table[]={0xff,//全灭0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减0x00,//全亮};//定义循环用数据表格/*亮的现象:先是全灭,然后依次逐个点亮,然后依次逐个叠加,然后依次逐个递减,然后两边靠拢后分开,然后两边叠加后递减,最后全亮。循环!*/void main()//main函数{
a=0;//给a赋初值
while(1)//while循环
P1=table[a];//将a所在的table中的值赋给P1口
delay(1000);//1S延时子程序
a++;//a的值加一
if(a==42)//测试a是否等于42
a=0;//给a赋值
}} void delay(uint z)//1ms延时子程序,通过z值改变延时时间{
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
/*动态数显的设计思路,首先是我们要先知道怎样才能使哪个位亮,显示的段是什么数值,接下来就是中断时间 的问题了,设计步骤如下,如果要让八个数码管静态显示1到8,我们可以修改中断时间,如把50000改成100或更低*/
#include #include #define uint unsigned int #define uchar unsigned char sbitduan=P2^6;
sbitwei=P2^7;
uchara,numw, uchar code tabled[]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; /*第二步骤,创建段显数值的对码表0~9数值.如果要显示1~8数值,最好多加前后两位数0跟9, 因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/
uchar code tablew[]={ 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; //第二步骤,创建位显,就是显示的位置,这个码表相对简单,用二进制表示11111,是0的为八位数显管的位置 void main() {
//定义个时间函数 numw=0;
//附位显初值为0位 numd=0;
//附段显初值为0位
TMOD=0X01;
//第四步骤,附中断暂存器初值
TH0=()/256; //附中断请求时间初值,高8位
TL0=()%6; //附中断请求时间初值,低8位
//开启总中断
//开启定时中断
//启动定时中断 while(1)
//第三步骤,执行速度,如果等20差不多是1秒,则往下执行,相当于单位数值亮的时间
//重新附值初值0 numd++;
//段显值++
if(numd==9)
//如果段值在对码表第9位则转下执行 numd=1;
/*重新附值段显值对应对码表第1位,因为++所以0位并不在数码管中显示. 如果要显示,也会因为++而在第二轮中显示出*/ duan=1;
//开启段显端
P0=tabled[numd];//附段显P0值对应段显值对码表 duan=0;
//锁存 wei=1;
//开启位显端
P0=tablew[numw];//附位显P0值对应位显值对码表 wei=0;
//锁存 numw++;
//相当于位显移位
if(numw==8)
//如果位显值到对应位显对码表第八位则转下执行 numw=0;
//重新附值位显值对应对码表第0位起 /*
下面是简单的单个数码管显示例证第一骤, 修改后在第三步骤内 #include\#include\ sbitduan=P2^6; //段显端口 sbitwei=P2^7; //位显端口
void main() {
//P0=0 数码管不显示任何信号,默认情况下通电本身就不显示,可以不写 duan=1;
//开启段显端口
P0=0x06; //附值段显数值为1,可以查阅数码管电路图相对应显示的对码表 duan=0;
//锁存,保持上一步段显状态,硬件说明请查阅74HC573功能 wei=1;
//开启位显端口
P0=0 //附值位显位置,,左边第一位,为0的显示 wei=0;
//锁存,保持上一步位显状态,硬件说明请查阅74HC573功能 } */
void timer0() interrupt 1 /*第四步骤,中断时间函数这个相当于移位数显的速度,速度够快,人眼就会有余辉效应, 感觉8位数显一直在亮着,相当于正在播放的电影胶卷*/
TH0=()/256;
TL0=()%6; a++; }
包含总结汇报、IT计算机、资格考试、办公文档、计划方案、专业文献、教程攻略、旅游景点、文档下载、出国留学以及单片机控制LED流水灯从中间向两边等内容。本文共2页
相关内容搜索&#xe621; 上传我的文档
&#xe602; 下载
&#xe60c; 收藏
该文档贡献者很忙,什么也没留下。
&#xe602; 下载此文档
最经典的51单片机经典流水灯汇编程序_免费下载
下载积分:2000
内容提示:最经典的51单片机经典流水灯汇编程序_免费下载
文档格式:DOC|
浏览次数:234|
上传日期: 22:21:20|
文档星级:&#xe60b;&#xe60b;&#xe60b;&#xe60b;&#xe60b;
全文阅读已结束,如果下载本文需要使用
&#xe71b; 2000 积分
&#xe602;下载此文档
该用户还上传了这些文档
最经典的51单片机经典流水灯汇编程序_免费下载
关注微信公众号用汇编语言使16个发光二极管从中间向两边循环点亮的程序_百度知道
用汇编语言使16个发光二极管从中间向两边循环点亮的程序
我有更好的答案
MOV R3,#7FHLOOP:
MOV P0,#200DELAY1:
LCALL DELAY
SJMP LOOPDELAY:
MOV R4ORG 0000HLJMP MAINORG 0030HMAIN:
高级工程师
用一个八位的接口,即可。
为您推荐:
其他类似问题
发光二极管的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机控制LED流水灯从中间向两边
单片机控制LED流水灯从中间向两边,从两边向中间 这个就是把先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的应该是这样的先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动;
#include #include #define uint unsigned int #define uchar unsigned char
void delay(); void main() { uchar temp,temp1,temp2,a,b;
while(1) {
for(b=3;b>0;b--)
delay(); temp=0x55;
P1= delay();
} for(a=3;a>0;a--)
{ temp=0 for(b=7;b>0;b--) {
P1= temp=_crol_(temp,1); delay();
P1= delay();
temp2=0x7f;
for(a=8;a>0;a--)
temp=temp1&temp2;
P1= delay();
temp1=_crol_(temp1,1);
temp2=_cror_(temp2,1);
} } void delay() { uinta,b; for(a=100;a>0;a--) for(b=600;b>0;b--); }
程序实现的第2种方法:下面是http://www.51hei.com单片机12群里的朋友木信大侠提出的,实现单片机led流水灯从中间向两边,从两边向中间的效果,下面的程序就是实现思路,这个是直接调用,应该明白吧,数组那其实也可以改一下,如采用一维数组,在多次调用;也可以采用二维数组。主要看个人喜好. ----------------------------------------------------- #include unsigned char code TABLE[]={
0xFF,0xE7,0xC3,0x81,0x00,
//从中间向两侧点亮 0xFF,0xE7,0xC3,0x81,0x00,
0xFF,0xE7,0xC3,0x81,0x00,
0xFF,0x7E,0x3C,0x18,0x00,
//从两侧向中间点亮 0xFF,0x7E,0x3C,0x18,0x00,
0xFF,0x7E,0x3C,0x18,0x00 };
for(s=0;s<30000;s++);
if(TABLE[i]!=0x01)
P1=TABLE[i];
i++; DELAY();
汇编程序如下:;
花样流水灯(8个发光二极管以各种形式循环点亮); 功能:流水灯(8个发光二极管循环以1S间隔以各种形式循环点亮)
ORG 0000H伪指令,指定程序从0000H开始存放
LJMP MAIN跳转指令,程序跳转至MAIN处执行
ORG 0030H伪指令,指定程序从0030H开始存放MAIN:
MOV SP, #60H给堆栈指针赋初值
MOV P1,#0FFH给P1口赋值
MOV DPTR,#TABLE;查表LIGHT: MOV R4,#42设置循环次数LOOP: MOV A,#42给A赋初值
SUBB A,R4将A的值与R4的值相减,结果存在A中
MOVC A,@A+DPTR ;将A+DPTR的值所对应的TABLE中的值赋给A
MOV P1,A将A的值赋给P1口
LCALL DEL1S调用1S延时子程序
DJNZ R4,LOOP判断R4是否为0,不为0跳转,为0顺序执行
LJMP LIGHT跳转指令,跳转至LIGHT处继续执行;1S延时子程序(11.0592MHz晶振,误差0微秒)DEL1S: MOV R5, #089HDL1S0:
MOV R6, #0A4HDL1S1: MOV R7, #013H
DJNZ R7, $
DJNZ R6, DL1S1
DJNZ R5, DL1S0
RETTABLE: ;定义表格数据DB 0FFH ;全灭DB 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 07FH ;依次逐个点亮DB 0FEH 0FCH 0F8H 0F0H 0E0H 0C0H 080H 000H ;依次逐个叠加DB 080H 0C0H 0E0H 0F0H 0F8H 0FCH 0FEH 0FFH ;依次逐个递减DB 07EH 0BDH 0DBH 0E7H 0E7H 0DBH 0BDH 07EH ;两边靠拢后分开DB 07EH 03CH 018H 000H 000H 018H 03CH 07EH ;两边叠加后递减DB 000H ;全亮
END程序结束指令C语言程序如下:/* 该实验是花样流水灯(8个发光二极管以各种方式循环点亮),功能是花样流水灯(8个发光二极管以1S间隔以各种方式循环点亮) */#include//包含reg.52文件#define uint unsigned int//宏定义#define uchar unsigned char//宏定义void delay(uint z);//声明延时函数//定义循环用变量uchar code table[]={0xff,//全灭0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减0x00,//全亮};//定义循环用数据表格/*亮的现象:先是全灭,然后依次逐个点亮,然后依次逐个叠加,然后依次逐个递减,然后两边靠拢后分开,然后两边叠加后递减,最后全亮。循环!*/void main()//main函数{
a=0;//给a赋初值
while(1)//while循环
P1=table[a];//将a所在的table中的值赋给P1口
delay(1000);//1S延时子程序
a++;//a的值加一
if(a==42)//测试a是否等于42
a=0;//给a赋值
}} void delay(uint z)//1ms延时子程序,通过z值改变延时时间{
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
/*动态数显的设计思路,首先是我们要先知道怎样才能使哪个位亮,显示的段是什么数值,接下来就是中断时间 的问题了,设计步骤如下,如果要让八个数码管静态显示1到8,我们可以修改中断时间,如把50000改成100或更低*/
#include #include #define uint unsigned int #define uchar unsigned char sbitduan=P2^6;
sbitwei=P2^7;
uchara,numw, uchar code tabled[]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; /*第二步骤,创建段显数值的对码表0~9数值.如果要显示1~8数值,最好多加前后两位数0跟9, 因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/
uchar code tablew[]={ 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; //第二步骤,创建位显,就是显示的位置,这个码表相对简单,用二进制表示11111,是0的为八位数显管的位置 void main() {
//定义个时间函数 numw=0;
//附位显初值为0位 numd=0;
//附段显初值为0位
TMOD=0X01;
//第四步骤,附中断暂存器初值
TH0=()/256; //附中断请求时间初值,高8位
TL0=()%6; //附中断请求时间初值,低8位
//开启总中断
//开启定时中断
//启动定时中断 while(1)
//第三步骤,执行速度,如果等20差不多是1秒,则往下执行,相当于单位数值亮的时间
//重新附值初值0 numd++;
//段显值++
if(numd==9)
//如果段值在对码表第9位则转下执行 numd=1;
/*重新附值段显值对应对码表第1位,因为++所以0位并不在数码管中显示. 如果要显示,也会因为++而在第二轮中显示出*/ duan=1;
//开启段显端
P0=tabled[numd];//附段显P0值对应段显值对码表 duan=0;
//锁存 wei=1;
//开启位显端
P0=tablew[numw];//附位显P0值对应位显值对码表 wei=0;
//锁存 numw++;
//相当于位显移位
if(numw==8)
//如果位显值到对应位显对码表第八位则转下执行 numw=0;
//重新附值位显值对应对码表第0位起 /*
下面是简单的单个数码管显示例证第一骤, 修改后在第三步骤内 #include\#include\ sbitduan=P2^6; //段显端口 sbitwei=P2^7; //位显端口
void main() {
//P0=0 数码管不显示任何信号,默认情况下通电本身就不显示,可以不写 duan=1;
//开启段显端口
P0=0x06; //附值段显数值为1,可以查阅数码管电路图相对应显示的对码表 duan=0;
//锁存,保持上一步段显状态,硬件说明请查阅74HC573功能 wei=1;
//开启位显端口
P0=0 //附值位显位置,,左边第一位,为0的显示 wei=0;
//锁存,保持上一步位显状态,硬件说明请查阅74HC573功能 } */
void timer0() interrupt 1 /*第四步骤,中断时间函数这个相当于移位数显的速度,速度够快,人眼就会有余辉效应, 感觉8位数显一直在亮着,相当于正在播放的电影胶卷*/
TH0=()/256;
TL0=()%6; a++; }
联系客服:cand57il.com汇编语言,51单片机八个灯从左到右间隔0.5秒,依次点亮且不灭,然后循_百度知道
汇编语言,51单片机八个灯从左到右间隔0.5秒,依次点亮且不灭,然后循
汇编语言,51单片机八个灯从左到右间隔0.5秒,依次点亮且不灭,然后循环。
我有更好的答案
MOV TMOD,#01H
MOV TH0,#HIGH()
MOV TL0,#LOW()
MOV A,#0FEH
MOV R2,#10
SJMP $T0ISR,#10
MOV TH0,#HIGH()
MOV TL0,#LOW()
DJNZ R2,T0E
MOV AORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN
高级工程师
为您推荐:
其他类似问题
51单片机的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 单片机汇编语言入门 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信