Professional Documents
Culture Documents
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
http://www.holiaco.com
PICAT Class
CCSC for Embedded System Guide
Lecturer: Nguyễn Tuấn Anh
Mobile: 098.808.6099
http://picat.dieukhien.net
Nick chat: ktmt_tact@yahoo.com,
email: tuananhktmt@gmail.com
PICAT = Công nghệ tự ñộng với mạch thông minh lập trình ñược
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Chương 1. PIC18F452
Tính năng
RISC CPU hiệu năng cao:
Tập lệnh, cấu trúc ñược tối ưu hóa theo ngôn ngữ C
o Mã nguồn tương thích với tập lệnh PIC17 và PIC16
Địa chỉ bộ nhớ chương trình tuyến tính ñến 32 Kbytes
Địa chỉ bộ nhớ dữ liệu tuyến tính ñến 1.5 Kbytes
S ñ và ý nghĩa chân
3
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Ý nghĩa các chân:
Loại
Tên Chân Loại
Bộ Giải thích
chân số IO
ñệm
MCLR 1 I ST Chân reset PIC, PIC sẽ reset khi chân này mức thấp
VPP 1 I ST Chân lập trình (nạp PIC), ngõ vào ñiện áp cao
OSC1 13 I ST Dao ñộng thạch anh ñầu vào hoặc nguồn ñầu vào ñồng hồ bên ngoài.
Bộ ñệm ST khi cấu hình trong chế ñộ RC, CMOS khác.
OSC2 14 O - Đầu ra của bộ dao ñộng thạch anh
VDD 11, 32 P Nguồn 5v cho PIC và logic 1 cho các IO
VSS 12, 31 P Mass cho PIC và các mức logic 0 cho IO
CLKI 13 I CMOS Nguồn dao ñộng từ bên ngoài vào. Luôn luôn kết hợp với chức năng
OSC1 pin. (Xem liên quan chân OSC1/CLKI, OSC2/CLKO)
CLKO 14 O - Trong chế ñộ RC, chân OSC2 xuất xung ra CLKO, trong ñó có tần số
bằng 1/4 của OSC1 và biểu thị tần số thực hiện lệnh
RAi/ANi Chân vào ra 2 chiều, cổng RA (i=0..6)
RAi … TTL Vào ra số
ANi Analog Vào tương tự (cho chuyển ñổi ADC)
VREF- 4 Analog Điện áp tham chiếu thấp cho ADC
VREF+ 5 Analog Điện áp tham chiếu cao cho ADC
SS 7 ST Đầu vào chọn Slave trong truyền thông SPI
LVDIN 7 Analog Đầu vào phát hiện ñiện áp thấp
RBi 33..40 IO TTL Đầu vào/ra hai chiều, có thể lập trình tạo ñiện trở treo (yếu)
nội(i=0..7)
INTi I ST Đầu vào ngắt ngoài (i=0..2)
CCPi IO Capture input, Compare output, PWM output. (i=1..2)
PGM 38 IO ST Chân cho phép lập trình ICSP ñiện áp thấp
PGC 39 IO ST Chân Clock khi lập trình ICSP và gỡ rối tại mạch (In-Circuit)
PGD 40 IO ST Chân dữ liệu khi lập trình ICSP và gỡ rối tại mạch (In-Circuit)
RCi IO TTL Đầu vào ra hai chiều, cổng RC (i=0..7)
T1OSO 15 O - Chân ra bộ dao ñộng timer1
T1CKI 15 I ST Dao ñộng từ ngoài vào Timer1/Timer3
T1OSI 16 I CMOS Đầu vfo bộ dao ñộng Timer1
SCK 18 IO ST Xung clock nối tiếp ñồng bộ vào/ra cho SPI
SCL 18 IO ST Xung clock nối tiếp ñồng bộ vào/ra cho I2C
SDI 23 I ST Chân dữ liệu vào trong SPI
SDA 23 IO ST Chân dữ liệu vào/ra trong I2C
SDO 24 O ST Chân dữ liệu ra trong SPI
TX 25 O - Chân truyền dữ liệu không ñồng bộ USART
CK 25 IO ST Chân xung nhịp truyền thông ñồng bộ USART
RX 26 I ST Chân nhận dữ liệu nối tiếp trong truyền thông không ñồng bộ USART
DT 26 IO ST Chân dữ liệu truyền thông ñồng bộ USART
RDi 19..30 IO ST Vào ra số cổng RD (i=0..7)
PSPi 19..30 IO TTL Dữ liệu cổng song song (Slave) (i=0..7)
REi 8..10 IO ST Vào ra số cổng RE (i=0..2)
RD 8 TTL Điều khiển ñọc cho cổng song song Slaver
WR 9 TTL Điều khiển ghi cho cổng song song Slaver
CS 10 TTL Điều khiển chọn chip trong giao tiếp song song Slaver
Trong ñó:
TTL = TTL tương thích với ñầu vào ST = Schmitt Trigger ñầu vào với mức CMOS
O = ra, I=vào P = Power
OD = Open Drain (không có diode P nối tới vdd) CMOS = CMOS compatible input or output
4
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Chương 2. Sơ ñồ tối thiểu ñể PIC có thể chạy ñược:
5 ICSP_Data_PGD 40 1
RB7/PGD
4 ICSP_Clk_PGC 6 2 39 2
RA0/AN0 RB6/PGC
3 VPP 5 3 38 3
RA1/AN1 RB5/PGM
2 4 4 37 4
GND RA2/AN2/VREF- RB4
1 3 5 36 5
VCC RA3/AN3/VREF+ RB3/CCP2*
2 6 35 6
J1 RA4/T0CKI RB2/INT2
1 7 34 7
RA5/AN4/SS/LVDIN RB1/INT1
3 8 33 8
j2 RE0/RD/AN5 RB0/INT0
D1 R1 10k 2 9
RE1/WR/AN6 J3
1 2 1 10 26 1
VCC RE2/CS/AN7 RC7/RX/DT
25 2
J4 RC6/TX/CK
24 3
RC5/SDO
Reset1 VPP 1 23 4
GND MCLR/VPP RC4/SDI/SDA
18 5
RC3/SCK/SCL
C1 13 17 6
OSC1/CLKI RC2/CCP1
16 7
RC1/T1OSI/CCP2*
22p Y1 15 8
2
RC0/T1OSO/T1CKI
20MHz 14
OSC2/CLKO/RA6 J5
C2 30 1
RD7/PSP7
VCC 11 29 2
1
VDD RD6/PSP6
GND 32 28 3
22p VDD RD5/PSP5
27 4
RD4/PSP4
C3 C4 22 5
RD3/PSP3
VCC 22p 21 6
J6 22p RD2/PSP2
2 12 20 7
VSS RD1/PSP1
1 31 19 8
VSS RD0/PSP0
J7
Power Input
GND GND
U1 18F452 http://picat.dieukhien.net
5
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
6
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Ví dụ:
//Clock= 32KHz, restart watchdog timer
//ñể dùng các hàm trễ: delay_us() và delay_ms()
#use delay (clock=32000, RESTART_WDT)
//Dùng thạch anh 10Mhz nhưng sử dụng bộ nhân tần lên 4 lần: 4x PLL
//Xung nhịp ñạt ñược = 40Mhz. CCS tự cấu hình, dùng cho PIC có PLL
#use delay(clock=40M, oscillator=10M)
int result;
#bit result_odd = result.0
...
if (result_odd)
7
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Chương 4. Kiểu dữ liệu
Type-Specifier Giá trị
0
int1 2 : 0-1 Defines a 1 bit number
8
int8 2 : 0-255 Defines an 8 bit number
16
int16 2 : 0-65536 Defines a 16 bit number
32
int32 2 : Defines a 32 bit number
8
char 2 ; biểu diễn ký tự Defines a 8 bit character
32
float 2 : số thực 32 bit Defines a 32 bit floating point number
short =int1 By default the same as int1
Int =int8 By default the same as int8
long =int16 By default the same as int16
void Không kiểu Indicates no specific type
Chương 5. Câu lệnh và biểu thức trong C
5.1. Câu lệnh (Statements)
Câu lệnh Ví dụ
if (expr) stmt; [else stmt;] if (x==25){x=1;}else{ x=x+1;}
while (expr) stmt; while (get_rtcc()!=0){putc(‘n’);}
do stmt while (expr); do{ putc(c=getc());}while (c!=0);
for (expr1;expr2;expr3) stmt; for (i=1;i<=10;++i)
printf(“%u\r\n”,i);
switch (expr) { switch (cmd){
case cexpr: stmt; //one or more case case 0: printf(“cmd 0”); break;
[default:stmt] case 1: printf(“cmd 1”); break;
... } default: printf(“bad cmd”);break;
}
return [expr]; return (5);
goto label; goto loop;
label: stmt; loop: I++;
break; break;
continue; continue;
expr; i=1;
; ;
{[stmt]} //Zero or more {a=1; b=1;}
8
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
6.3.3. GETC( ): Hàm nhận dữ liệu từ cổng RS232. Kết quả trả về: 1 byte
value = getc()
value = fgetc(stream)
value=getch()
value=getchar()
Ví dụ: Char answer;
.......
printf("Continue (Y,N)?");
do {
answer=getch();
}while(answer!='Y' && answer!='N');
10
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Chương trình sau minh họa việc nhấp nháy LED ñơn, dịch một ñiểm sáng từ phải sang trái. Và
cứ lặp ñi lặp lại như vậy.
11
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Nhấp nháy LED Nháy LED từ trái sang phải, phải sang trái:
#include <18F452.h> #include <18F452.h>
#use delay(oscillator=8MHz) #fuses NOWDT, XT, NOLVP
void flash_pattern_0() { #use delay(clock=4000000)// 4MHz
byte i;
byte led; byte const SHIFT_COUNT = 8;
led = 0b10000000; byte const MS = 100;
for (i = 0; i < 8; i++) {
output_b(led); void left_to_right() {
delay_ms(100); byte i, led;
led >>= 1;
} } led = 0b01000000;
for (i=0;i<SHIFT_COUNT-1;i++)
void flash_pattern_1() { {
byte i; output_b(led);
byte led; delay_ms(MS);
led = 1; led >>= 1;
for (i = 0; i < 8; i++) { }
output_b(led); }
delay_ms(100);
led <<= 1; void right_to_left() {
} } byte i, led;
void main() {
//set_tris_b(0); // set as output
output_b(0x00);
while (true)
{
flash_pattern_0();
flash_pattern_1();
flash_pattern_2();
flash_pattern_3();
}
}
12
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Mở rộng: Chương trình chạy thực tế:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Tiêu ñề, phần khai báo chung cho toàn bộ chương trình
// Ngày viết: 11/04/2007, sửa chữa: 09/03/2011 23:11:22
// Tên file: All type of bling.c
// Tác giả: Nguyễn Tuấn Anh: 098.808.6099 – Giáo viên lớp PICAT
// Mục ñích viết: Làm chương trình mẫu chuẩn cho lớp PICAT
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<18F452.h>
#Fuses HS,NOWDT,NOPUT,NOPROTECT, NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=8000000)
int16 Trai,Phai,KQ,loop,i,j,k;
////////////////////////////////////////////////////////
void lanbi(int SoLanLap){ void Cuon(int SoLanLap){
for(loop=0; loop<SoLanLap; loop++){ k=0; for(loop=0; loop<SoLanLap; loop++){
for(i=256; i>=1; i/=2){ k=i|k; Trai=0x10; Phai=0x08; KQ=0;
for(j=1; j<i; j*=2){ kq=k|j;kq=~kq; for(i=0; i<4; i++){
output_b(kq); delay_ms(100); KQ+=Trai+Phai; output_b(~KQ);
} } } } // for(j=}//for(i=//for(loop=//void delay_ms(200);Trai<<=1; Phai>>=1;
} //for(i=
void lanbi16(int SoLanLap){ int32 i,j;
for(loop=0; loop<SoLanLap; loop++){k=0; Trai=0x10; Phai=0x08; KQ=0xFF;
for(i=0x10000; i>=1; i>>=1){ k=i|k; for(i=0; i<4; i++){
for(j=1; j<i; j<<=1){ kq=~(k|j); KQ-=Trai+Phai; output_b(~KQ);
output_b(kq>>8);output_d(kq); delay_ms(200); Trai<<=1; Phai>>=1;
delay_ms(100); } } } //for(i=//for(loop=// void ////// Cuon16
} } } // for(j=}//for(i=}//for(loop=//void
void Cuon16(int SoLanLap){
void KeoLoXo(int SoLanLap){ for(loop=0; loop<SoLanLap; loop++){
for(loop=0; loop<SoLanLap; loop++){ Trai=0x8000; Phai=0x0001; KQ=0;
Trai=0x10; Phai=0x08; KQ=0; for(i=0; i<8; i++){
for(i=0; i<4; i++){ KQ+=Trai+Phai; KQ+=Trai+Phai; output_d(~(KQ>>8));
output_b(~KQ); delay_ms(200); output_b(~KQ); delay_ms(100);
Trai<<=1; Phai>>=1; Trai>>=1; Phai<<=1;
}//for(i= }//for(i=
Trai=0x80; Phai=0x01; KQ=0xFF;
for(i=0; i<4; i++){ Trai=0x8000;Phai=0x0001;KQ=0xFFFF;
KQ-=Trai+Phai; for(i=0; i<8; i++){
output_b(~KQ); delay_ms(200); KQ-=Trai+Phai; output_d(~(KQ>>8));
Trai>>=1; Phai<<=1; output_b(~KQ); delay_ms(100);
} } } //for(i=//for(loop=// void Trai>>=1; Phai<<=1;
///////////////////////////////// KeoLoXo16 } } } //for(i=//for(loop=//void
13
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
14
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
15
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
7.2. LED 7 thanh
17
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
#include <16f877a.h>
#use delay(clock=8000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP
18
19
void main()
{ printf("Truyen thong noi tiep giua PC va PIC\n\r");
#include <18F452.h> printf("Bam phim bat ky:\n\r");
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, NoPUT while(true){ c=getc();
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Mô phỏng
7.3.
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
7.4. LCD
Các module sử dụng trong ví dụ Sử dụng module LCD
Rất nhiều hàm dùng ñể hiển thị lên LCD Dùng hàm ñể ñiều khiển LCD
File: PICAT_LCD.c #include <18F452.h>
(Tham khảo trong mã nguồn các ví dụ.) #fuses HS, NOLVP, NOWDT, NOPROTECT
#use delay (clock=8MHz)
//Use built-in function: delay_ms() &
delay_us()
#include "PICAT_LCD.c"
//use module function
void main(void)
{
while(true)
{
lcd_init();
lcd_gotoxy(17,1);
printf(lcd_putc, "PICAT Class");
lcd_gotoxy(18,2);
printf(lcd_putc, "Holiaco.com");
lcd_moveLeft(16);
delay_ms(500);
lcd_init();
lcd_gotoxy(5,1);
printf(lcd_putc, "The best of");
lcd_gotoxy (1,2);
printf(lcd_putc, "PIC,AVR,8051...");
delay_ms(500);
lcd_moveright(16);
}
}
20
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
void main() {
lcd_init(); delay_ms(50);
while(true){
printf(lcd_putc,"\fPICAT Class"); delay_ms(1000);
printf(lcd_putc,"\fWhere "); delay_ms(500);
printf(lcd_putc,"\n Start your job"); delay_ms(1000);
}
}
21
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
7.5. Chuyển ñổi ADC
Chuyển ñổi ADC hiển thị lên Chuyển ñổi ADC – Truyền thông
LED
(Đọc ADC hiển thị ra LED trên cổng B) (Đọc ADC rồi truyền lên máy tính thông qua cổng RS232)
#include <18F452.h> #include <18F452.h>
#device ADC=8 #device ADC=10 // 10 bits ADC
#use delay(oscillator=8000000) #use delay(clock=8MHz)
#fuses HS, NOWDT, NOPROTECT, NOLVP
void main() #use rs232(baud=9600, xmit=PIN_C7, rcv=PIN_C6, stream=MYPC)
// rs232 setting
{
#define DO_NOTHING 0
setup_adc(adc_clock_internal); #define DO_START_ADC 1
setup_adc_ports(ALL_ANALOG); #define DO_END_ADC 2
set_adc_channel(2); //ñặt kênh void main(void) {
// EasyPIC Board: int16 int_volt;
// VR P1=RA2, int8 str_volt[21], tmp;
// VR P2=RA3 float flt_volt;
delay_ms(10); int8 do_what = DO_NOTHING;
set_tris_b(0x00); printf( "S: Start ADC\n\r");
while (true) Printf( "Q: END ADC\n\r");
while(true){
output_b(read_adc());
if(0 != kbhit()){ // if rs232 get char
} tmp = fgetc(MYPC);
switch(tmp) {
case 'S':
case 's':
printf( "S: Start ADC\n\r" );
do_what = DO_START_ADC;
setup_adc_ports(RA0_RA1_RA3_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(3);
break;
case 'Q':
case 'q':
printf( "Q:EndADC\n\r" );
do_what = DO_END_ADC;
// adc off
setup_adc(ADC_OFF);
break;
default : // rs232 get other char
putc(tmp);
break;
}//end switch(tmp)
}//end if(kbhit())
switch(do_what) {
case DO_START_ADC:
// start adc and send result to PC
int_volt = read_adc();
flt_volt = 5.0 * int_volt / 0x3ff;
sprintf(str_volt, "ADC: %1.3fV\n\r", flt_volt);
printf(str_volt);
printf( "\n\r" );
delay_ms(500);
break;
case DO_END_ADC: break;// you want to do
case DO_NOTHING: break;// you want to do
default:
} } }//end switch(do_what) //end while(1) //end main()
22
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
7.6. I2C và Thời gian thực
EasyPIC sử dụng real time clock DS1307 giao tiếp chuẩn I2C. 2 chân SCL và SDA nối
với RC3 và RC4. có thể tách rời hoặc kết nối qua DIPSW. Pin backup nằm bên dưới LCD
dùng ñể lưu dữ liệu cho DS1307 khi ngắt nguồn ngoài VCC.
23
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Giản ñồ truyền dữ liệu:
OUT (Output control): Bit này ñiều khiển mức của chân SQW/OUT khi ñầu ra sóng vuông là vô
hiệu. Nếu SQWE = 0, mức logic trên chân SQW /OUT là 1 nếu OUT = 1 và là 0 nếu OUT = 0.
SQWE (Square Wave Enable): Bit này, khi thiết lập một logic 1, sẽ cho phép ñầu ra dao ñộng.
Các tần số của ñầu ra sóng vuông phụ thuộc vào giá trị của các bit RS0 và RS1. Với ñầu ra sóng
vuông là 1Hz, các thanh ghi clock cập nhật trên các cạnh thuộc của sóng vuông.
RS (Rate Select): Các bit này ñiều khiển ñầu ra của sóng vuông khi bit ñiều khiển xung vuông ra
ñược cho phép. Bảng sau thiết lập mức ra của xung:
24
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Ví dụ áp dụng:
Module thời gian thực Đọc giờ và hiển thị
(Các module khởi tạo, ghi, ñọc thời gian trên DS1307) (Đọc giờ từ DS1307 rồi hiển thị lên máy tính qua RS232 )
File: ds1307.c #include <18F452.h>
#define DS1307_SDA PIN_C4 #use delay(clock=4000000)
#define DS1307_SCL PIN_C3 #fuses xt,NOWDT,NOPROTECT,NOLVP
#use #use rs232(baud=9600, xmit=PIN_C7, rcv=PIN_C6)
i2c(master,sda=DS1307_SDA,scl=DS1307_SCL) #include "ds1307.c"
//==========================
// initial DS1307 void main(void)
//========================== {
void init_DS1307() int8 sec,min,hour,day,date,month,year;
{
output_float(DS1307_SCL); delay_ms(50);
output_float(DS1307_SDA); init_ds1307(); // initial DS1307
} sec=read_ds1307(0);
//========================== write_ds1307(0,sec & 0x7F); // enable oscillator(bit 7 =0)
// write data one byte to
// DS1307 while(true)
//========================== {
void write_DS1307(byte address, BYTE data) sec=read_ds1307(0); // read second
{ min=read_ds1307(1); // read minute
short int status; hour=read_ds1307(2); // read hour
i2c_start(); day=read_ds1307(3); // read day
i2c_write(0xd0); date=read_ds1307(4); // read date
i2c_write(address); month=read_ds1307(5); // read month
i2c_write(data); year=read_ds1307(6); // read year
i2c_stop(); putc(0x0c);
i2c_start(); printf("Time : %02X:%02X:%02X\r\n",hour,min,sec);
status=i2c_write(0xd0); printf("Day : %02X\r\n",day);
while(status==1) printf("Date : %2X/%2X/20%2X\r\n",date,month,year);
{ printf("----------------------------------- \n");
i2c_start(); delay_ms(5000);
status=i2c_write(0xd0); }
} }
}
//==========================
// read data one byte from DS1307
//==========================
BYTE read_DS1307(byte address)
{
BYTE data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return(data);
}
25
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
26
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Module truyền thông 1 dây Module ñọc nhiệt ñộ Đọc và hiển thị nhiệt ñộ
Theo datasheet của DS1820,
(Truyền thông giữa cảm biến nhiệt và PIC dùng hàm truyền thông một dây Sử dụng các hàm trong module trên,
chỉ bằng một bit tín hiệu) ñể ñọc nhiệt ñộ ñọc và hiển thị nhiệt ñộ lên LCD
Tham khảo datasheet DS1820
File: 1wire.c File: DS1820.c #include <18F452.h>
/*------- Định nghĩa chân -------*/ float ds1820_read() { #device adc=8
#define OWPIN PIN_E2 int8 busy=0, temp1, temp2; #use delay(OSCILLATOR =8MHz)
signed int16 temp3;
/*-----Truyền thông 1 dây------*/ float result; #include <1wire.c>
#include < PICAT_LCD.c>
void onewire_reset() { onewire_reset(); #include <ds1820.c>
output_low(OWPIN); delay_us( 500 ); onewire_write(0xCC);
output_float(OWPIN); delay_us( 500 ); onewire_write(0x44);
output_float(OWPIN); void main()
} while (busy == 0) {
busy = onewire_read(); float Ndo;
/* ******* onewire_write() **/
/*Ghi 1 byte vào cảm biến.*/ onewire_reset(); setup_adc_ports(NO_ANALOGS);
onewire_write(0xCC); setup_adc(ADC_OFF);
void onewire_write(int data) { onewire_write(0xBE);
int count; temp1 = onewire_read(); lcd_init();
for (count=0; count<8; ++count){ temp2 = onewire_read(); lcd_putc("\f");
output_low(OWPIN); temp3 = make16(temp2,
delay_us( 2 ); temp1); while (TRUE) {
27
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
7.8. Mở rộng: LED ma trận
Dau=cnt=0;
while(1)
{ j=128;
if(++cnt==20){Dau=(Dau+1)%Nmax;cnt=0;}
for(i=7;i>=0;i--){
output_d(~mf[(Dau+i)%Nmax]);
output_b(j); j/=2;
delay_ms(DT);
output_b(0);
} } }
28
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
void main() {
set_tris_d(0xff);
lcd_init(); delay_ms(50);
while(true){
printf(lcd_putc,"\fAn nut Start!"); while(!input(PIN_D0));
printf(lcd_putc,"\nAn nut More!"); while(!input(PIN_D2));
printf(lcd_putc,"\fAn nut Clear"); while(input(PIN_D5));
printf(lcd_putc,"\nAn nut Again!"); while(input(PIN_D7));
}
}
29
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK)
void main() {
char selection;
byte value;
printf("\r\nFrequency:\r\n");
printf(" 1) 19.5 khz\r\n");
printf(" 2) 4.9 khz\r\n");
printf(" 3) 1.2 khz\r\n");
do {
selection=getc();
} while((selection<'1')||(selection>'3'));
setup_ccp1(CCP_PWM);
switch(selection) {
case '1' : setup_timer_2(T2_DIV_BY_1, 127, 1); break;
case '2' : setup_timer_2(T2_DIV_BY_4, 127, 1); break;
case '3' : setup_timer_2(T2_DIV_BY_16,127, 1);break;
}
setup_port_a(ALL_ANALOG);
setup_adc(adc_clock_internal);
set_adc_channel( 0 );
printf("%c\r\n",selection);
while( TRUE ) {
value=read_adc();
printf("%2X\r",value);
set_pwm1_duty(value);
}
}
30
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Chương 8. Viết và Dịch chương trình cơ bản (cho người mới học):
Chương trình C tối thiểu không lỗi. Dùng ñể test CCS:
Trong CCS, Click chuột phải, chọn Make Project, bấm F9 hoặc Click chuột phải chọn Complier ñể
dịch chương trình ra file .Hex
Khi thấy không có lỗi là ổn. Hình sau là kết quả của chương trình trên:
31
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Chương 9. Một số cổng giao tiếp, linh kiện, thiết bị cần tìm hiểu
trong quá trình học :
Y5
3. Thạch anh Tạo dao ñộng cho VĐK
32.768 KHz
4. R33 R1
Điện trở
1,2K 10k
32
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
6. D12 Diode Chỉ cho dòng ñiện ñi theo 1
chiều
DIODE
1
H
A
B
E
F
4
5
7
9
10
2
1
6
U3
10. LED thu hồng ngoại
LDR
18. 1
2 Transmit+ Sơ ñồ chân cổng
3 Transmit- 8 RJ45
4 Receiv e+ 7
6
N/A1
5
N/A2 45
6 3
Receiv e- 2
7 1
8 N/A3
N/A4
L1
19. 3
Cuộn dây
1
S
LS3
20. Rơ le Loại này có 8 chân.
8
6
7
1,2: chân ñiều khiển
3
4 3,6: chân chung
1
5
4,8: thường ñóng với 3,6
2
5,7:thường mở với 3,6
20-2051-DPDT
2
21. Thu phát hồng ngoại Tích hợp sẵn cả thu và phát
ISO1
3N263
khoảng cách gần
4
33
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
23. D614 Diode zenner ổn áp, tuỳ thuộc vào trị số
của zenner
BZX84C10/SOT
:
Ma trận LED
D615
34
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
9.6. Vi mạch chọn kênh 74 151
35
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
9.9. Vi mạch ñệm dữ liệu 74 245
36
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
Mục lục
Phần 1: Giới thiệu về PIC ..........................................................................................................2
Chương 1. PIC18F452........................................................................................................ 2
Chương 2. Sơ ñồ tối thiểu ñể PIC có thể chạy ñược: ......................................................... 5
Phần 2 Ngôn ngữ lập trình CCS cho PIC .............................................................................6
Chương 1. Tổng quan......................................................................................................... 6
Chương 2. Môi trường CCS ............................................................................................... 6
Chương 3. Định hướng chương trình dịch ......................................................................... 6
3.1. #include <filename> ............................................................................................. 6
3.2. #define <Tên ñại diện> <Nội dung cần ñại diện> ............................................. 6
3.3. #INT_xxxx: Chỉ dẫn ngắt ...................................................................................... 6
3.4. #use delay(clock=speed, restart_wdt) .................................................................... 6
3.5. #bit id = x.y ........................................................................................................... 7
Chương 4. Kiểu dữ liệu ...................................................................................................... 8
Chương 5. Câu lệnh và biểu thức trong C.......................................................................... 8
Chương 6. Các hàm tích hợp sẵn ....................................................................................... 9
6.1. Các hàm vào ra cơ bản (DESCRETE I/O)............................................................. 9
6.2. Thao tác với bit ...................................................................................................... 9
6.3. RS232 I/O ............................................................................................................ 10
Chương 7. Ví dụ mẫu - Chỉ có tại lớp PICAT .............................................................. 11
7.1. Nháy LED ñơn ..................................................................................................... 11
7.2. LED 7 thanh ......................................................................................................... 16
7.3. RS232................................................................................................................... 19
7.4. LCD...................................................................................................................... 20
7.5. Chuyển ñổi ADC.................................................................................................. 22
7.6. I2C và Thời gian thực .......................................................................................... 23
7.7. Truyền thông 1 dây và bài toán ño nhiệt ñộ DS1820........................................... 26
7.8. Mở rộng: LED ma trận......................................................................................... 28
7.9. Mở rộng: Nút bấm................................................................................................ 29
7.10. Mở rộng: PWM .................................................................................................... 30
Chương 8. Viết và Dịch chương trình cơ bản (cho người mới học): ............................... 31
Chương 9. Một số cổng giao tiếp, linh kiện, thiết bị cần tìm hiểu trong quá trình học : . 32
9.1. Cổng song song (LPT): ñịa chỉ ? chân vào/ra? .................................................... 32
9.2. Cổng nối tiếp (RS232) ......................................................................................... 32
9.3. Một số ký hiệu các linh kiện ................................................................................ 32
9.4. Vi mạch phân kênh 74 138 .................................................................................. 34
9.5. Vi mạch phân kênh 74 154 .................................................................................. 34
9.6. Vi mạch chọn kênh 74 151 .................................................................................. 35
9.7. Thanh ghi dịch 74 595 ......................................................................................... 35
9.8. Vi mạch chốt ñệm 74 573 .................................................................................... 35
9.9. Vi mạch ñệm dữ liệu 74 245 ................................................................................ 36
9.10. Mạch khuếch ñại công suất.................................................................................. 36
9.11. Động cơ và nguyên tắc ñiều khiển ñộng cơ ......................................................... 36
37
PICAT Class 098.808.6099 – Trung tâm dạy Lập trình cho các loại vi ñiều khiển.
38