【51单片机】:LED任务及汇编解释任务


学习目标:

1、用汇编或者c语言实现D1 D3 D5 D7 为一组 ;D2 D4 D6 D8 为一组 ,两组实现      
     1)一组亮约一秒 另一组灭一秒,这样的互闪现象五次后      25分
     2)所有灯灭约一秒后,    15分
     3)D1->D2->D3->D4->D5->D6->D7->D8 逐次间隔约0.5秒亮后,等全亮后,再                 从D8->D7->D6->D5->D4->D3->D2->D1 逐次间隔0.5秒灭掉,重复上面的全亮到全         灭五次后回到状态 1),重复执行 1)  2) 3)。35分


学习内容:

1、用汇编或者c语言实现D1 D3 D5 D7 为一组 ;D2 D4 D6 D8 为一组 ,两组实现      
     1)一组亮约一秒 另一组灭一秒,这样的互闪现象五次后      25分
     2)所有灯灭约一秒后,    15分
     3)D1->D2->D3->D4->D5->D6->D7->D8 逐次间隔约0.5秒亮后,等全亮后,再                 从D8->D7->D6->D5->D4->D3->D2->D1 逐次间隔0.5秒灭掉,重复上面的全亮到全         灭五次后回到状态 1),重复执行 1)  2) 3)。35分

代码如下:

#include "reg51.h"
#include "intrins.h"

#define LED_PORT P2
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;

typedef unsigned int u16;	
typedef unsigned char u8;


void delay_us(u16 a)
{
	while(a--);
}

void delay500ms(void)
{
	unsigned char i,j,k;
	for(i=15;i>0;i--)
		for(j=202;j>0;j--)
			for(k=81;k>0;k--);
}
void Led_1(void)
{
	int i = 0,k=0;
	led2 = 1;led4 = 1;led6 = 1;led8 = 1;
	led1 = 1;led3 = 1;led5 = 1;led7 = 1;
	delay500ms();
	delay500ms();		
	for(i = 0;i<3;i++)
	{
		led1 = 0;led3 = 0;led5 = 0;led7 = 0;
		led2 = 1;led4 = 1;led6 = 1;led8 = 1;
		delay500ms();
		delay500ms();
		if(k < 2)
		{
			led1 = 1;led3 = 1;led5 = 1;led7 = 1;
			led2 = 0;led4 = 0;led6 = 0;led8 = 0;
			delay500ms();
			delay500ms();	
		    k++;
		}


	}
	led2 = 1;led4 = 1;led6 = 1;led8 = 1;
	led1 = 1;led3 = 1;led5 = 1;led7 = 1;
	delay500ms();
	delay500ms();	
}
void Led_2(void)
{
	int j=0,i=0,k=0;
	u8 table[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
	
	
	
	for(j=0;j<3;j++)
	{
		for(i=0;i<9;i++) // 循环点亮8个LED
        {
            LED_PORT=~table[8-i]; // 点亮第i个LED
            delay500ms(); // 延时0.5秒
        }
		
		LED_PORT = 0xFF;
		delay500ms(); 
		LED_PORT = ~0x00;
		if( k < 2)
		{
			for(i=0;i<9;i++) // 循环点亮8个LED
			{
				LED_PORT=table[i]; // 点亮第i个LED
				delay500ms(); // 延时0.5秒
			}
			k++;
		}
	}
	for(i=0;i<5;i++)
	{
		LED_PORT = ~0x00;
		delay500ms();
		delay500ms();
		LED_PORT = ~0xFF;
		delay500ms();
		delay500ms();
	}
}
void main(void)
{
	while(1)
	{
		Led_1();
		Led_2();
	}
}


另外一种方法(全由十六进制数控制  利用左移右移完成):

        这种方法明显还是优于上一种方法。

#include <reg51.h>

#define uint unsigned int
#define uchar unsigned char

void delay(uint z) {
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}


void main()
{
	int i,j;
	//第一功能
	for(i=0;i<5;i++)
	{
		P2 = 0x55;
		delay(500);
		P2 = 0xAA;
		delay(500);
	}
	//第二功能
	P2 = 0xFF;
	delay(500);
	//第三功能
	for(j=0;j<5;j++)
    {
	   for(i=0;i<8;i++)
	   {
			P2=0XFE<<i;
			delay(100);
       }
	   for(i=0;i<8;i++)
	   {
			P2=~(0x7f>>i);
			delay(100);
	   }	
   } 
}

汇编解释:

ORG 0000H           
MAIN:         
ACALL DELAY    
SETB P1.0   
ACALL DELAY   
CLR P1.0      
AJMP MAIN      
DELAY:         
MOV R1,#0FFH   
DJNZ R1,$      
RET            
END            
 

ORG 0000H      ;程序首个地址             
MAIN:          ;主函数标识符       
ACALL DELAY    ;调用延时函数
SETB P1.0      ; 置P1.0为1
ACALL DELAY    ;调用延时函数
CLR P1.0       ;清零P1.0
AJMP MAIN      ;返回主函数循环执行以上代码,使P1.0输出脉冲信号(或者使p1.0控制灯闪烁)
DELAY:         ;延时函数标识符
MOV R1,#0FFH   ;传送立即数255给R1寄存器
DJNZ R1,$      ;R1减一不为零跳转自身位置循环执行255次
RET            ;函数返回  弹出压栈数据
END            ;程序到此结束


信仰是伟大的情感,一种创造力量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值