TD lp trình C cho PIC vi CCS C – trang 1
ĐHBK Tp HCM
BMĐT
GVPT: HTrung Mỹ
Mt sTD lp trình C cho PIC vi CCS C
Chú ý:
· PIC được dùng trong các TD này là PIC16F84 hay PIC16F877.
· Trong các chương trình C không ghi #fuses (sẽ tự tạo ra khi ta chọn PIC từ đầu khi mCCS C cho
project mi)
· phỏng phn cng dùng Proteus version t7.4 trlên.
· Để đơn giản trong Proteus các hình vẽ không có vẽ phn ni vi thạch anh hay RC phần dao động.
TD 1: LED chaser (1 LED sáng được chy từ trái qua phải port B [khi chân RA0=1] hoc từ phải
sang trái [khi chân RA0=0]).
· Sơ đồ mạch: (Giả sử phím nhn không bị ny [rung])
· Chương trình C:
#include <16F84.h>
#use delay(clock=20000000)
#use_fast_io(A)
#use_fast_io(B)
void main()
{
int pattern=1;
TD lp trình C cho PIC vi CCS C – trang 2
set_tris_a(0x01); /* Chân A0 là ngõ nhp */
set_tris_b(0x00); /* Port B xut */
while (1)
{
output_b(pattern);
delay_ms(20);
if (input(PIN_A0)==1)
/* Rotate Left */
if (pattern != 0x80)
pattern <<= 1;
else
pattern = 1;
else
/* Rotate Right */
if (pattern != 1)
pattern >>= 1;
else
pattern = 0x80;
}
}
TD 2: Mạch đếm lên thp phân 2 ký svi xung nhịp kích cạnh xung
· Sơ đồ mạch: (Giả sử phím nhn không bị ny [rung] và LED 7 đoạn có sn mạch giải mã)
· Chương trình C:
#include <16F84.h>
#use delay(clock=20000000)
#use_fast_io(A)
#use_fast_io(B)
int bin2BCD(int bin)
{ // Chương trình đổi t1 số nhị phân ra sBCD 2 ký s, chỉ đúng cho số nhị phân này có trị <= 99
int BCD;
TD lp trình C cho PIC vi CCS C – trang 3
BCD = ((bin/10) << 4) + bin % 10;
return BCD;
}
void main()
{
int counter=0,counter_BCD=0;
set_tris_a(0x01); /* Pin A0 is Input port pin */
set_tris_b(0x00); /* Output Port B configuration*/
while (1)
{
output_b(counter_BCD);
while(!input(PIN_A0)); // đợi cho đến khi A0 = 1
while(input(PIN_A0)); // đợi cho đến khi A0 = 0 à phát hin cạnh xung
counter++;
if (counter == 100) counter = 0;
counter_BCD=bin2BCD(counter);
}
}
BT: Người đọc ththiết kế bộ đếm BCD 3 ký shay 4 ký svi xung nhịp kích cạnh lên?? Sa lại phn
cng dùng LED 7 đoạn CA hay CC thông thường?
TD 3: Mạch đếm lên thp phân 2 ký svi xung nhịp kích cạnh xung (dùng timer của PIC)
· Sơ đồ mạch: (Giả sử phím nhn không bị ny [rung] và LED 7 đoạn có sn mạch giải mã)
· Chương trình C:
#include <16F84.h>
#use delay(clock=20000000)
TD lp trình C cho PIC vi CCS C – trang 4
#use_fast_io(A)
#use_fast_io(B)
int bin2BCD(int bin)
{ // Chương trình đổi t1 số nhị phân ra sBCD 2 ký s, chỉ đúng cho số nhị phân này có trị <= 99
int BCD;
BCD = ((bin/10) << 4) + bin % 10;
return BCD;
}
void main()
{
int counter=0,counter_BCD=0;
set_tris_a(0x10); /* Pin A4 (external Counter) is Input port pin */
set_tris_b(0x00); /* Output Port B configuration*/
setup_counters(RTCC_EXT_H_TO_L, RTCC_DIV_1); /* Set up Timer 0 */
set_timer0(0); /* Initial value of Counter */
while (1)
{
output_b(counter_BCD);
counter=get_timer0();
if (counter == 100)
{ counter = 0;
set_timer0(0); /* Initial value of Counter */
}
counter_BCD=bin2BCD(counter);
}
}
TD 4: Tạo dạng sóng dùng máy trạng thái – Cách 1 dùng bảng
Ta mun tạo dạng sóng tun hoàn có dạng sau Port B: (mc 1 thì LED sáng ở chân đó)
Từ dạng sóng trên ta có thphân tích thành máy trạng thái Moore vi thi gian tn tại của 1 trạng thái là
20ms và trạng thái bắt đầu là trạng thái 0. Ta có thể dùng bảng để cha trị số ra tương ứng vi mi trạng
thái.
TD lp trình C cho PIC vi CCS C – trang 5
Người đọc tự vẽ phn cng của mạch cn thiết kế.
Chương trình C:
#include <16F877.h>
#use delay(clock=20000000)
#use_fast_io(B)
void main()
{ int state[5]={0x09, 0x01, 0x02, 0x0C, 0x04};
set_tris_b(0x00); // Đặt cu hình xut cho Port B
while(1)
{
for (i = 0; i <5; i++)
{
output_b(state[i]);
delay_ms(20);
}
}
}
BT: Người đọc thviết chương trình tạo tín hiệu điều khiển đèn giao thông tại ngã tư?
TD 5: Tạo dạng sóng dùng máy trạng thái – Cách 2 dùng switch … case
Làm lại thí dụ trên dùng switch case để cài đặt các trạng thái
#include <16F877.h>
#use delay(clock=20000000)
#use_fast_io(B)
void main()
{ int state=0;
set_tris_b(0x00); // Đặt cu hình xut cho Port B
while(1)