学习目标:
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 ;程序到此结束