当前位置: 首页 > news >正文

【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个LEDdelay500ms(); // 延时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个LEDdelay500ms(); // 延时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 charvoid 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            ;程序到此结束


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

http://www.lryc.cn/news/56374.html

相关文章:

  • 从生活习惯到肠道微生物,揭秘胃肠道癌症的成因
  • 八十行代码实现开源的 Midjourney、Stable Diffusion “咒语”作图工具
  • Redis为什么这么快
  • JayDeBeApi对数据类型的支持
  • 一文盘点 Zebec 生态几大利好,让 ZBC 近期“狂飙”
  • 【数据结构】栈和队列(笔记总结)
  • 【Java】自定义注解和AOP切面的使用
  • 前后台协议联调拦截器
  • 【还在传统绑骨骼动画?】让AI助力你实现2D游戏角色动画流程
  • 动态规划+例题
  • 快商通荣获多个政府科技、人才奖项
  • Linux的基本命令的使用
  • RecycleView小结
  • 【Python】如何实现Redis构造简易客户端(教程在这)
  • 326. 3 的幂 ——【Leetcode每日一题】
  • UE4 Sequence学习
  • 总结MySQL、Redis的优化措施与使用 mysql_upgrade升级数据结构
  • C++11线程库
  • 智能化生产,提高效率!使用关键词采集工具助力企业数字化转型
  • 浅谈自动化测试用例创建和文档
  • [Java Web]AJAX Axios | 一种结合HTML来取代传统JSP的技术
  • 【C++】多态问答题
  • 【设计模式】适配器模式
  • 跨域之CorsFilter
  • STM32基于HAL工程读取DS1302时间数据
  • 《Effective Objective-C 2.0 》 阅读笔记 item10
  • gpt3官网中文版-人工智能软件chat gpt安装
  • 工作常用、面试必问:Hive 窗口函数汇总
  • spring5(五):AOP操作
  • functional.partial