[BÀI TẬP VỀ PIC 16F877]
1
1/ Chương trình dịch Led P2.7 – P2.0. CTC delay có thể tùy chỉnh, delay tối đa là 12,75s
ORG 0030H
MOV TMOD,#01H
MOV A,#80H
LAP:
MOV P2,A
CALL DELAY
RR A
SJMP LAP
DELAY:
MOV R7,0
LP: MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
INC R7
CLR TF0
CLR TR0
CJNE R7,#20,LP
RET
END
2.
#include "16F877A.H"
#use delay(clock=20000000)
#use Fast_IO(A)
#byte porta=0x05
#bit ra0=porta.0
int8 k;
#bit b0=k.0
#bit b1=k.1
#bit b2=k.2
unsigned mang1[]={0, 1, 2, 3, 4, 5, 6, 7};
unsigned mang2[]={0, 1, 3, 2, 6, 7, 5, 4};
void main()
{
set_tris_A(255);
int8 i;
while(1)
{
for(i=0;i<8;i++)
{
if (ra0==0)
k=mang1[i];
else
k=mang2[i];
output_bit(PIN_B0,b0);
[BÀI TẬP VỀ PIC 16F877]
2
output_bit(PIN_B1,b1);
output_bit(PIN_B2,b2);
delay_ms(200);
}
}
}
3. Thực hiện mạch logic
#include "16F877A.H"
#use delay(clock=20000000)
#use Fast_IO(A)
#byte porta=0x05
#bit ra0=porta.0
#bit ra1=porta.1
#bit ra2=porta.2
void main()
{
int1 a,b,c;
set_tris_a(0b000000111);
while(1)
{
a=~(((~ra0) | ra1) & (~ra2));
b=~((~ra2) & ra1);
c=~(a^b);
output_bit(PIN_A3,c);
}
}
4. Dịch Led 2 chiều !!!
#include "16F877A.H"
#use delay(clock=20000000)
#use Fast_IO(D)
#byte portd=0x08
void main()
{
int8 i,led=1;
set_tris_d(0);
[BÀI TẬP VỀ PIC 16F877]
3
while(1)
{
for(i=1;i<15;i++)
{
portd=led;
delay_ms(100);
if (i<8)
led=led<<1;
else
led=led>>1;
}
}
}
5. Tạo sóng có điều kiện đầu vào ở RB0
#include "16F877A.H"
#use delay(clock=20000000)
#use Fast_IO(B)
#byte portB=0x06
#bit RB0=portB.0
void main()
{
set_tris_B(0x00000001);
while(1)
{
if (RB0==0)
{
output_high(PIN_B6);
delay_us(125);
output_low(PIN_B6);
delay_us(125);
}
else
{
output_high(PIN_B7);
delay_ms(10);
output_low(PIN_B7);
delay_ms(10);
}
}
}
[BÀI TẬP VỀ PIC 16F877]
4
6. Đếm cạnh xuống, giải mã BCD cho vô 2 Led 7 đoạn xuất cùng 1 port
#include "16F877A.H"
#use delay(clock=20000000)
#use Fast_IO(B)
#byte portb=0x06
void main()
{
int8 count=0,a,b;
set_tris_B(0);
set_tris_A(1);
while(1)
{
b= ((count/10)<<4) + (count % 10);
portb=b;
while(!input(PIN_A0));
while(input(PIN_A0));
count=count+1;
if (count==100)
count=0;
}
}
** Thuật toán phát hiện cạnh xuống:
while(!input(PIN_A0));
while(input(PIN_A0));
** Thuật toán phát hiện cạnh lên:
while(input(PIN_A0));
while(!input(PIN_A0));