View
10
Download
0
Category
Preview:
Citation preview
專題製作專題製作--PIC16PIC16系列系列/PIC18/PIC18系列應用實務系列應用實務報告人:黃嘉輝
1
問題
為什麼要選用為什麼要選用PICPIC,而不用,而不用8051 ?8051 ?
為什麼要選用為什麼要選用C ?C ?
為什麼要選用為什麼要選用PIC16?PIC16?
為什麼要選用為什麼要選用MikroCMikroC ??
容易上手嗎容易上手嗎??
發展設備貴嗎發展設備貴嗎 ??
2
大綱
單晶片概論1
程式發展步驟2
專題常用技術3
技能競賽相關技術4
3
單晶片概論(1)
單晶片全球現況
28.4%Others
3.4%10Samsung
4.4%9ST
4.8%8NXP
5.5%7Fujitsu
5.5%6Texas
6.6%5Infineon
6.7%4Microchip
7.4%3ATMEL
10.1%2Freescale17.3%1Renesas
佔有率2011排名MCU廠商
4
單晶片概論(2)
8 bit 單晶片概況(2009)
5
單晶片概論(3)
PIC與8051硬體特性有何不同?
便宜貴燒錄器
I:25mA O:5mAI/O:25mA~50mAI/O能力
稍慢(12T)快(4T)執行速度
多少資源
稍低高C/P値
XO內部振盪
少多種類
XO內部RESET
稍差稍好抗干擾
20 PIN6 PIN最小包裝
2.7~5.52~5.5工作電壓
8051PIC
6
單晶片概論(4)
PIC與8051寫法有何不同? PIC需有初始化,8051不用 PIC需有輸出入設定,8051不用 PIC暫存器多,必需規劃,8051較少 PIC組態必須設定,8051不用
例:單純I/O PIC16F883 8051
PORTA=0; P1.0=1;ANSEL=0;TRISA=0;PORTA.B0=1;
7
單晶片概論(5)
PIC的系列產品 8位元晶片:PIC10系列、PIC12系列、PIC16系
列、PIC18系列 16位元晶片:PIC24系列、dsPIC系列 32位元晶片:PIC32系列
適用場合 8 bit:一般控制用 16 bit:馬達控制、DSP需求 32 bit:SOC、通訊、PDA
常用包裝 6PIN、8 PIN、 14 PIN、16 PIN、28 PIN、40 PIN
8
單晶片概論(6)
PIC16F883特性 振盪頻率:1Hz~20MHz
工作電壓:2~5.5V
EEPROM:256 bytes
ROM:4K
RAM: 256 Bytes
I/O:I: 25 PIN O:24 PIN
Watch Dog:防止當機
A/D:11 CH 10 bit
PWM:2個
(1 Enhance , 1 Normal )
USART:1個,可與
RS232,RS485,SPI, I2C通訊
計時器: T0,T1,T2
9
單晶片概論(7)
PIC16F883單晶片腳位
10
單晶片概論(8)
PIC16F883完整必備電路
使用內部振盪及RESET使用外部振盪電路及RESET
11
單晶片概論(9)
PIC實驗板
12
單晶片概論(10)
PIC16F883實驗板能做什麼? LED 實驗 七段顯示+解碼實驗 LCD實驗 喇叭實驗 SSR實驗 直流馬達正反轉實驗 步進馬達實驗 PWM實驗 計時實驗 計次實驗
按鈕實驗 DIP SW實驗 4*3鍵盤實驗 麥克風實驗 A/D實驗 EEPROM實驗 溫度感測實驗 串列埠實驗 看門狗實驗 外部中斷實驗
13
程式發展步驟(1)
PIC C編譯器比較 MicroChip
• PIC18、PIC24/dsPIC、PIC32• MPLAB XC8、XC16、XC32(ALL US495)
Hi-Tech• PIC10/12/16/18、PIC24、PIC32• Microchip原廠合作,US495/US???/US895
MikroC• PIC12/16/18、dsPIC/PIC24、PIC32• 3rd party,US249/US249/US299
CCS• PIC12/16/18、PIC24、PIC32• 3rd party,US350/US500/US600
KEIL C (不支援) IAR (不支援)
14
程式發展步驟(2)
撰寫撰寫CC原始碼原始碼 編譯編譯//除錯除錯 燒錄燒錄//執行執行HEXHEX檔檔
Mikro CIDE
EZ PIC實驗板
Mikro CDebug
15
程式發展步驟(3)
8051組合語言delay:
mov r7,#100l1_delay:
mov r6,#217l2_delay:
mov r5,#10djnz r5,$djnz r6,l2_delaydjnz r7,l1_delayret
16
程式發展步驟(4)
KEIL C KEIL C(Delay ms) // 函數須自己撰寫void Delay_ms(int temp) //11.0592MHz{ //頻率換了又得重寫
int i,j;for(i=0;i
17
程式發展步驟(5)
KEIL C與MikroC的不同例:按鈕處理 KEIL C (按鈕處理)
• 硬體處理 //• 軟體處理 // 程序須自己撰寫
// 彈跳要自己處理 MikroC (按鈕處理)
• 硬體處理• 軟體處理 // 內建函數
Button(&PORTB,0,x,y); //x你要的彈跳延遲//y為作動的準位
例:PWM處理 KEIL C
• 需自己轉寫程式 MikroC
• PWM1_init(5000); // 內建函數
18
程式發展步驟(6)
STEP1:撰寫C程式(Mikro C IDE) C 程式的樣子:全域變數宣告;func1(){
區域變數宣告;::
}void main() //一開機後開始執行的地方{
區域變數宣告;初始化部分; // 這是跟8051不同的地方您的程式;
}
19
程式發展步驟(7)
STEP 2:編譯與除錯 MikroC IDE 介紹
STEP 3:燒錄與執行MikroC 檔案概述 *.mcppi:MikroC Pro專案檔 *.c:C原始檔 *.hex:十六進制檔(燒錄檔) *.asm:編譯之後的組語檔 *.mcl:編譯之後的二進制函數檔 *.lst:編譯後的記憶體配置情形
20
程式發展步驟(8)
PIC組態介紹(Mikro IDE ctrl+shift+E) OSC設定
• HS:石英振盪器 4MHz
21
程式發展步驟(9)
撰寫MikroC PIC16程式:初始化輸出篇 PIC數位控制規劃三步驟:
• STEP 1. 給定I/O初始值• STEP 2. 關閉複合功能• STEP 3. 規劃I/O方向
例:PORTA全部數位輸出void main() // 一開機後開始執行的地方{
PORTA=0; //1.讓PORTA輸出低電位ANSEL=0; //2.關閉PORTA的類比功能TRISA=0; //3.PORTA所有I/O為輸出::
}
22
程式發展步驟(10)
撰寫MikroC PIC18程式:初始化輸出篇 PIC數位控制規劃三步驟:
• STEP 1.給定I/O初始值• STEP 2. 關閉複合功能• STEP 3. 規劃I/O方向
例:PORTA全部數位輸出void main() // 一開機後開始執行的地方{
PORTA=0; //1.讓PORTA低電位LATA=0; //2.讓LATA低電位ADCON1=0x0F; //3.關閉PORTA類比功能CMCON=7; //4.關閉PORTA比較器功能TRISA=0; //5.PORTA所有I/O為輸出::
}
23
程式發展步驟(11)
撰寫MikroC PIC16程式:初始化輸出篇 例: RB0~RB3輸出,RB4~RB7輸入
void main() // 主程式開始{
PORTB=0; //讓PORTB輸出低電位ANSELH=0; //關閉PORTB類比功能TRISB=0b11110000; //0b:二進制
}
24
程式發展步驟(12)
撰寫MikroC PIC18程式:初始化輸出篇 例: RB0~RB3輸出,RB4~RB7輸入
void main() // 主程式開始{
PORTB=0; //1. 讓PORTB低電位LATB=0; //2. 讓LATB低電位ADCON1=0x0F; //3. 關閉AN8~AN12功能TRISB=0b11110000; //4. 0b:二進制:
:
}
25
程式發展步驟(13)
撰寫MikroC PIC16程式:初始化輸出篇 例: RC0~RC3輸出,RC4~RC7輸入
void main() // 主程式開始{
PORTC=0; //讓PORTC輸出低電位C1ON_bit=0; //關閉PORTC比較器C2ON_bit=0;
TRISC=0xf0; //0x:十六進制:
:
}
26
程式發展步驟(14)
撰寫MikroC PIC18程式:初始化輸出篇 例: RC0~RC3輸出,RC4~RC7輸入
void main() // 主程式開始{
PORTC=0; //1. 讓PORTC低電位LATC=0; //2. 讓LATC低電位TRISC=0xf0; //3. 0x:十六進制:
:
}
27
程式發展步驟(15)
撰寫MikroC PIC18程式:初始化輸出篇 例: PORTD輸出
void main() // 主程式開始{
PORTD=0; //1. 讓PORTD低電位LATD=0; //2. 讓LATD低電位TRISD=0x00; //3.
:
:
}
28
程式發展步驟(16)
撰寫MikroC PIC18程式:初始化輸出篇 例: PORTE輸出
void main() // 主程式開始{
PORTE=0; //1. 讓PORTE低電位LATE=0; //2. 讓LATE低電位ADCON1=0x0A; //3. 關PORTE上AD功能TRISE=0x03; //4. RE0、RE1為輸入:
:
}
29
程式發展步驟(17)
操作示範:PIC16 EX:利用RA0閃爍一顆LED
void main() // 程式一開始{
PORTA=0; // 初始化ANSEL=0; // 關閉類比功能TRISA=0; // 規劃I/O方向while(1){
PORTA.B0=1; //也可以改為PORTA=0x01;Delay_ms(500);PORTA.B0=0; //也可以改為PORTA=0x00;Delay_ms(500);
}}
30
程式發展步驟(18)
操作示範:PIC18 EX:利用RA0閃爍一顆LED
void main() // 程式一開始{
PORTA=0; // 初始化LATA=0;ADCON1=0xF; // 關閉類比功能CMCON=7; // 關閉比較器功能TRISA=0; // 規劃I/O方向while(1){
LATA=1; //也可以改為LATA.B0=1;Delay_ms(500);LATA=0;Delay_ms(500);
}}
31
專題常用技術(1)
101年 臺中高工-自動調節車流號誌系統
• NE555+IR(8051) 臺中高工-智慧型停車場引導系統
• Cds+PLC(8051) 100年 台中高工-智慧型追蹤電風扇
• IR+焦電感測(A/D)+LCD+步進馬達(89S8252) 台中高工-LED環保香
• Cds+驅蚊蟲電路(22KHz)(8051) 99年 台中高工-無線數位語音時鐘
• IR+4*1 SEG(8051) 台中高工-步進馬達轉速控制
• 步進馬達(8051)
32
專題常用技術(2)
內部振盪 節省週邊電路
Button 按鈕輸入
ADC cds照度偵測 焦電感測 溫度感測(LM35)
PWM IR
DC Motor速度控制 頻率產生 LED照度控制
KeyPad 輸入
LCD 顯示
EEPROM 參數記錄 資料記錄
馬達控制 步進馬達控制 DC Motor控制
溫度感測 環境控制 參數修正
33
專題常用技術(3)
內部震盪器之使用• 優點:無外部振盪電路• 缺點:振盪頻率有1%的誤差。
內部振盪器使用方式(MikroC IDE)• 組態設定:選擇INTOSCIO• 軟體書寫void main(){
區域變數區;OSCCON=0x7F; // 8 MHz, 0x6F=4MHz: // 參考:OSCCON暫存器:
34
專題常用技術(4)
按鈕技術 硬體電路
• 同8051
軟體• 使用內建函數
內建函數Button Button(&PORTA,0,20,0) ;//檢查RA0是否為0(按下)
//避開彈跳時間為20ms
• 傳回値:1有 0無
35
專題常用技術(5)
使用方式(Active Low) 有無按下(按下瞬間):直接偵測是否為0Vif(button(&PORTB,0,20,0)){
按鈕被按下時,想做的事;}
按下又放開(放開瞬間):先偵測按下,然後再測放開if(button(&PORTB,0,20,0))
KeyPressed=1; // 使用變數記錄起來if(KeyPressed==1 && button(&PORTB,0,20,1)) // &&:AND{
看你要幹嘛!}
36
專題常用技術(6)
LCD顯示技術 腳位介紹
D0~D7:資料線 Vo:控制對比 RS:暫存器選擇 E:晶片制能 R/W:讀取/寫入 A、K:背光
EGN
D
Vo RS
VCC
R/W D0
D1
D2
D3
D4
D5
D6
D7 A K
37
專題常用技術(7)
LCD顯示器之使用 STEP1:規劃控制腳位(RS,E,R/W)及資料腳
(D7,D6,D5,D4)
STEP 2:利用輸出函數輸出ASCII內建函數 Lcd_Init() //初始化LCD的函數
• 例:Lcd_Init();
Lcd_Cmd(命令) //可以對LCD下命令的函數• 例:Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,“This is a test”) // (1,1)輸出字串 Lcd_Chr(2,1,’0’) // (2,1)輸出字元 Lcd_Chr_Cp(0x30); // 游標位置輸出字元
38
專題常用技術(8)
LCD硬體 R/W:必須直接接地
軟體書寫範例(LCD使用範例)sbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D7 at RB3_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D4 at RB0_bit;sbit LCD_RS_Direction at TRISB4_bit;sbit LCD_EN_Direction at TRISB5_bit;sbit LCD_D7_Direction at TRISB3_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D4_Direction at TRISB0_bit;
39
專題常用技術(9)
void main(){
PORTB=0;
ANSELH=0;
TRISB=0;
Lcd_Init(); // 初始化LCDLcd_Cmd(_LCD_CLEAR); // 清除LCD螢幕Lcd_Cmd(_LCD_CURSOR_OFF); // 關閉游標Lcd_Out(1,3,”PIC EASY GO!”); // (1,3) 顯示
}
40
專題常用技術(10)
ADC技術 硬體
• 請參閱接腳圖
內建函數• Adc_Read(x); // x:channel NO.
信號計算:
軟體• 開啟A/D功能
– ANSEL=0x01; // 打開RA0之AD功能• AD PIN規劃為輸入
– TRISA=0x01; // 規劃RA0為輸入
1023
)(_V
VrefVrefDataADin
41
專題常用技術(11)
例:Cds+ADCvoid main()
{
unsigned AD_Data=0;
float Vin=0.0;
PORTA=0;
ANSEL=0x01;
TRISA=0x01;
AD_Data=ADC_Read(0); // AN0:AD輸入Vin=AD_Data*(5-0)/1023;
::
42
專題常用技術(12)
PWM技術• 硬體:
• PWM1:RC2• PWM2:RC1
內建函數• PWM1_Init(freq); // 所需頻率• PWM1_Set_Duty(百分比*255/100); // 設定Duty• PWM1_Start(); // PWM啟動• PWM1_Stop(); // 停止PWM
43
專題常用技術(13)
使用方式 STEP 1:PWM初始化
• Pwm1_Init(38000); // 38KHz
STEP 2: PWM開始• Pwm1_Start () ; // PWM開始
STEP 3:設定Duty• Pwm1_Set_Duty(50*255)/100); // Duty=50%
44
專題常用技術(14)
例:IR+PWMvoid main(){
PORTC=0;CCP1CON=CCP2CON=0;TRISC=0;Pwm1_Init(38000); // 38KHzPwm1_Start () ; // PWM開始Pwm1_Set_Duty(50*255)/100); // Duty=50%while(1){
::
}}
45
專題常用技術(15)
例:IR+PWM(硬體)
2N2222
220
IR LED
Vcc
VCC
U9
PIC16F883
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RE3/MCLR/VPP1
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA3/AN3/VREF+/C1IN+5
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RC2/P1A/CCP113
RC4/SDI/SDA15RC5/SDO16RC6/TX/CK17RC7/RX/DT18
RB2/AN8/P1B23RB3/AN9/PGM/C12IN2-24RB4/AN11/P1D25RB5/AN13/T1G26
VSS19VDD20RB0/AN12/INT21RB1/AN10/P1C/C12IN3-22
RB6/ICSPCLK27RB7/ICSPDAT28
VSS8
RC3/SCK/SCL14
38KHz
46
技能競賽相關技術(1)
ADC之使用(使用內建函數即可) RA0 RA1
PWM之使用(使用內建函數即可) RC1(PWM2)
LCD之使用(使用內建函數即可) D4~D7:RD4~RD7 RS:RE0 R/W:直接接地 E:RE2
74HC595之使用(使用內建函數) CK:RC0 SDO:RC2 LATCH:RC3
47
技能競賽相關技術(2)
例:74HC595N之使用(腳位被固定)
48
技能競賽相關技術(3)
自寫函數寫法#define clock LATC.B0
#define latch LATC.B1
#define SDI LATC.B2void hc595 (unsigned unsigned char temp){
unsigned int i;i=8;while (i>0){
if (temp.F7==0) SDI = 0;else SDI = 1;temp = temp
49
技能競賽相關技術(4)
void latch595(){
latch = 1;Delay_us(1);latch = 0;
}void main(){
char i;PORTC=0; //1. 讓PORTC低電位LATC=0; //2. 讓LATC低電位TRISC=0x0; //3. 讓PORTC都輸出while(1){
for(i=0;i
50
技能競賽相關技術(5)
使用內建SPI函數#define latch LATC.B1sbit SoftSpi_SDI at RC7_bit;sbit SoftSpi_SDO at RC2_bit;sbit SoftSpi_CLK at RC0_bit;sbit SoftSpi_SDI_Direction at TRISC7_bit;sbit SoftSpi_SDO_Direction at TRISC2_bit;sbit SoftSpi_CLK_Direction at TRISC0_bit;void latch595(){
latch = 1;Delay_us(1);latch = 0;
}
51
技能競賽相關技術(6)
void main(){
char i;PORTC=0; //1. 讓PORTC低電位LATC=0; //2. 讓LATC低電位TRISC=0x0; //3. 讓PORTC都輸出Soft_SPI_Init();while(1){
for(i=0;i
Recommended