网站建设 公众号seo优化方式
学习目标:
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 ;程序到此结束