久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
PIC16F877的外圍功能模塊例程
[打印本頁]
作者:
2222we
時間:
2018-8-1 15:51
標(biāo)題:
PIC16F877的外圍功能模塊例程
第5章 PIC16F877的外圍功能模塊
5.1.2 簡單應(yīng)用實(shí)例
該例用于令與PORTD口相連的8個發(fā)光二極管前4個點(diǎn)亮,后4個熄滅。在調(diào)試程序前,應(yīng)使與PORTD口相連的8位拔碼開關(guān)拔向相應(yīng)的位置。
例5.1 PORTD輸出
#include <pic.h>
main()
{
TRISD=0X00; /*TRISD寄存器被賦值,PORTD每一位都為輸出*/
while(1); /*循環(huán)執(zhí)行點(diǎn)亮發(fā)光二極管的語句*/
{
PORTD=0XF0; /*向PORTD送數(shù)據(jù),點(diǎn)亮LED(由實(shí)驗(yàn)?zāi)0?/
/*的設(shè)計決定相應(yīng)位置低時LED點(diǎn)亮)。*/
}
}
5.2.1 MSSP模塊SPI方式功能簡介
下面是一段簡單的SPI初始化例程,用于利用SPI工作方式輸出數(shù)據(jù)的場合。
例5.2 SPI初始化程序
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0; /*清除SPI中斷標(biāo)志*/
SSPCON=0x30; /* SSPEN=1;CKP=0 , FOSC/4 */
SSPSTAT=0xC0;
TRISC=0x00; /*SDO引腳為輸出,SCK引腳為輸出*/
}
5.2.3 程序清單
下面給出已經(jīng)在實(shí)驗(yàn)板上調(diào)試通過的一個程序,可作為用戶編制其它程序的參考。
#include <pic1687x.h>
/*該程序用于在8個LED上依次顯示1~8等8個字符*/
static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
volatile unsigned char data;
#define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) /*絕對尋址位操作指令*/
static bit PORTA_5 @ PORTAIT(PORTA,5);
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0;
SSPCON=0x30; /* SSPEN=1;CKP=0 , FOSC/4 */
SSPSTAT=0xC0;
TRISC=0x00; /*SDO引腳為輸出,SCK引腳為輸出*/
}
/*系統(tǒng)各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0x00; /*A口設(shè)置為輸出*/
INTCON=0x00; /*關(guān)閉所有中斷*/
PORTA_5=0; /*LACK送低電平,為鎖存做準(zhǔn)備*/
}
/*SPI發(fā)送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*啟動發(fā)送*/
do
{
;
}while(SSPIF==0); /*等待發(fā)送完畢*/
SSPIF=0; /*清除SSPIF標(biāo)志*/
}
/*主程序*/
main()
{
unsigned I;
initial(); /*系統(tǒng)初始化*/
SPIINIT() ; /*SPI初始化*/
for(i=8;i>0;i--) /*連續(xù)發(fā)送8個數(shù)據(jù)*/
{
data=table[i]; /*通過數(shù)組的轉(zhuǎn)換獲得待顯示的段碼*/
SPILED(data); /*發(fā)送顯示段碼顯示*/
}
PORTA_5=1; /*最后給鎖存信號,代表顯示任務(wù)完成*/
}
5.3.3 程序清單
下面給出已經(jīng)在實(shí)驗(yàn)板上調(diào)試通過的程序,可作為用戶編制其它程序的參考。有關(guān)顯示部分的SPI初始化,請讀者參考5.2節(jié)。
#include <pic.h>
/*該程序用于按下相應(yīng)的鍵時,在第一個8段LED上顯示相應(yīng)的1~4的字符*/
#define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) /*絕對尋址位操作指令*/
static bit PORTA_5 @ PORTAIT(PORTA,5);
#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit)) /*絕對尋址位操作指令*/
static bit PORTB_5 @ PORTBIT(PORTB,5);
static bit PORTB_4 @ PORTBIT(PORTB,4);
static bit PORTB_1 @ PORTBIT(PORTB,1) ;
static bit PORTB_2 @ PORTBIT(PORTB,2) ;
unsigned int I;
unsigned char j;
int data;
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
TRISC=0xD7; /*SDO引腳為輸出,SCK引腳為輸出*/
}
/*系統(tǒng)各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0xDF;
TRISB=0XF0; /*設(shè)置與鍵盤有關(guān)的各口的數(shù)據(jù)方向*/
INTCON=0x00; /*關(guān)閉所有中斷*/
data=0X00; /*待顯示的寄存器賦初值*/
PORTB=0X00; /*RB1 RB2 先送低電平*/
j=0;
}
/*軟件延時子程序*/
void DELAY()
{
for(i = 6553; --i ;)
continue;
}
/*鍵掃描子程序*/
int KEYSCAN()
{
while(1)
{
if ((PORTB_5==0)||(PORTB_4==0))
break;
} /*等待有鍵按下*/
DELAY(); /*軟件延時*/
if ((PORTB_5==0)||(PORTB_4==0))
KEYSERVE(); /*如果仍有鍵按下,則調(diào)用鍵服務(wù)子程序*/
else j=0x00; /*如果為干擾,則令返回值為0*/
return(j);
}
/*鍵服務(wù)子程序*/
int KEYSERVE()
{
PORTB=0XFD ;
if(PORTB_5==0) j=0X01;
if(PORTB_4==0) j=0X03;
PORTB=0XFB;
if(PORTB_5==0) j=0X02;
if(PORTB_4==0) j=0X04;/*以上根據(jù)按下的鍵確定相應(yīng)的鍵值*/
PORTB=0X00; /*恢復(fù)PORTB的值*/
while(1)
{
if((PORTB_5==1)&&(PORTB_4==1)) break;/*等待鍵盤松開*/
}
return(j);
}
/*SPI發(fā)送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*啟動發(fā)送*/
do
{
;
}while(SSPIF==0); /*等待發(fā)送完畢
SSPIF=0;
}
/*主程序*/
main()
{
static int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
initial();/*系統(tǒng)初始化*/
SPIINIT() ;/*SPI初始化*/
while(1)
{
KEYSCAN();
if(j!=0) /*如果j=0,證明先前的按鍵為干擾,則不予顯示*/
{
data=table[j];
PORTA_5=0; /*LACK信號清0,為鎖存做準(zhǔn)備*/
SPILED(data);
PORTA_5=1; /*最后給鎖存信號,代表顯示任務(wù)完成*/
}
}
}
5.4.1 PORTB端口“電平變化中斷”簡介
例5.3 PORTB口“電平變化中斷”初始化子程序
/*B口“電平變化中斷”初始化子程序*/
void PORTBINT( )
{
TRISB=0XF0; /*設(shè)置相應(yīng)口的輸入輸出方式*/
OPTION=0x7F; /*B口弱上拉有效*/
PORTB=0X00; /*RB1,RB2 先送低電平*/
RBIE=1; /*B口變位中斷允許 */
PORTB=PORTB; /*讀B口的值,以鎖存舊值,為變位中斷創(chuàng)造條件*/
}
5.4.3 程序清單
下面給出一個調(diào)試通過的例程,以供讀者參考。有關(guān)顯示的部分請讀者參考前面章節(jié)。該程序中寄存器的位都用頭文件中定義的位,如RB5表示PORTB的第5位,而不像前面幾節(jié)那樣自己定義。
#include <pic.h>
/*該程序用于通過PORTB的"電平變化中斷"進(jìn)行鍵盤的識別。*/
/*程序設(shè)置一個鍵值寄存器j,當(dāng)按下S9鍵時j=1,按下S11鍵時 */
/*j=2,按下S10鍵時,j=3,按下S12鍵時j=4*/
unsigned char data;
unsigned int I;
unsigned char j;
const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
/*B口“電平變化中斷”初始化子程序*/
void PORTBINT()
{
TRISB=0XF0; /*設(shè)置相應(yīng)口的輸入輸出方式*/
OPTION=0x7F;
PORTB=0X00; /*RB1, RB2 先送低電平*/
RBIE=1; /*B口變位中斷允許 */
PORTB=PORTB; /*讀B口的值,為變位中斷創(chuàng)造條件*/
}
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
TRISC=0xD7; /*SDO引腳為輸出,SCK引腳為輸出*/
}
/*系統(tǒng)各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0xDF;
INTCON=0x00; /*關(guān)閉所有中斷*/
data=0X00; /*待顯示的寄存器賦初值*/
}
/*鍵服務(wù)子程序*/
void KEYSERVE()
{
PORTB=0XFD ;
if(RB5==0) j=0X01;
if(RB4==0) j=0X03;
PORTB=0XFB ;
if(RB5==0) j=0X02;
if(RB4==0) j=0X04; /*以上通過逐行逐列掃描,以確定是何鍵按下*/
PORTB=0X00; /*恢復(fù)PORTB的值*/
}
/*軟件延時子程序*/
void DELAY()
{
for(i = 6553; --i ;)
continue;
}
/*SPI發(fā)送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*啟動發(fā)送*/
do
{
;
}while(SSPIF==0);
SSPIF=0;
}
void IDEDIS()
{
KEYSERVE(); /*進(jìn)行鍵盤的識別*/
data=table[j]; /*獲得需要送出顯示的段碼*/
RA5=0; /*LACK信號清0,為鎖存做準(zhǔn)備*/
SPILED(data);
RA5=1; /*最后給一個鎖存信號,代表顯示任務(wù)完成*/
}
/*中斷服務(wù)程序*/
void interrupt keyint(void)
{
DELAY(); /*軟件延時*/
if ((RB5==0)||(RB4==0)) /*該語句除了能夠確認(rèn)按鍵是否為干擾外,*/
/*還可以屏蔽一次鍵松開時引起的中斷*/
IDEDIS(); /*鍵識別和顯示模塊*/
PORTB=PORTB; /*讀B口的值,改變中斷發(fā)生的條件,避免鍵*/
/*一直按下時,連續(xù)進(jìn)行鍵識別*/
RBIF=0; /*鍵掃描時可能會產(chǎn)生"電平變化"而使RBIF*/
/*置1,再清除一次RBIF以避免額外中斷*/
}
main()
{
initial(); /*系統(tǒng)初始化*/
PORTBINT(); /*B口變位中斷初始化*/
SPIINIT() ; /*利用SPI顯示初始化*/
ei(); /*總中斷允許*/
while(1)
{
;
} /*等待中斷*/
}
5.5.2 程序清單
下面給出一個調(diào)試通過的例程,可作為讀者的參考。調(diào)試該程序把模板J7上的短路跳針拔下,以免產(chǎn)生沖突。
#include <pic1687x.h>
volatile unsigned char data;
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0;
SSPCON=0x30; /* SSPEN=1;CKP=0 , FOSC/4 */
SSPSTAT=0xC0;
TRISC=0x10; /*SDI引腳為輸入,SCK引腳為輸出*/
}
/*系統(tǒng)各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0x00;
TRISD=0x00; /*D口為輸出方式*/
INTCON=0x00; /*關(guān)閉所有中斷*/
}
/*SPI接收子程序*/
int SPIIN()
{
RA4=0; /*74HC165并行置數(shù)使能,將8位開關(guān)量置入器件*/
/* (LOAD為低電平時8位并行數(shù)據(jù)置入74HC165)*/
RA4=1; /*74HC165移位置數(shù)使能(LOAD為高電平時芯*/
/*片才能串行工作)*/
SSPBUF=0; /*啟動SPI,此操作只用于清除SSPSTAT的
*BF位,因此W中的實(shí)際數(shù)據(jù)無關(guān)緊要*/
do{
;
}while(SSPIF==0); /*查詢數(shù)據(jù)接收完畢否?*/
SSPIF=0;
data=SSPBUF;
return(data); /*返回接收到的數(shù)據(jù)*/
}
/*把SPI接收的數(shù)據(jù)通過D口顯示在8個發(fā)光二極管上的子程序*/
void SPIOUT(int data)
{
PORTD=~data;
}
/*主程序*/
main( )
{
initial(); /*系統(tǒng)初始化*/
SPIINIT(); /*SPI初始化*/
while(1)
{
SPIIN(); /*SPI接收外部數(shù)據(jù)*/
SPIOUT(data); /*送出數(shù)據(jù)顯示*/
}
}
5.6.1 CCP模塊的PWM工作方式簡介
下面給出一個CCP模塊設(shè)置為PWM操作時的初始化程序
例5.4 CCP模塊設(shè)置為PWM方式時的初始化程序
/*CCP1模塊的PWM工作方式初始化子程序*/
void CCP1INIT()
{
CCPR1L=0X7F;
CCP1CON=0X3C; /*設(shè)置CCP1模塊為PWM工作方式,且其工作循環(huán)
*的低2位為11,高8位為01111111=7F*/
INTCON=0X00; /*禁止總中斷和外圍中斷*/
PR2=0XFF; /*設(shè)置PWM的工作周期*/
TRISC=0XFB; /*設(shè)置CCP1引腳為輸出方式*/
}
該初始化子程序設(shè)置CCP1模塊輸出分辨率為10位的PWM波形,且占空比為50%。
5.6.3 程序清單
下面給出一個調(diào)試通過的例程,可作為讀者編制程序的參考。
#include <pic.h>
/*該程序用于使CCP1模塊產(chǎn)生分辨率為10位的PWM波形,占空比為50%*/
/*CCP1模塊的PWM工作方式初始化子程序*/
void CCP1INIT()
{
CCPR1L=0X7F;
CCP1CON=0X3C; /*設(shè)置CCP1模塊為PWM工作方式,且其工作
*循環(huán)的低2位為11,高8位為01111111=7F*/
INTCON=0X00; /*禁止總中斷和外圍中斷*/
PR2=0XFF; /*設(shè)置PWM的工作周期*/
TRISC=0XFB; /*設(shè)置CCP1引腳為輸出方式*/
}
/*主程序*/
main()
{
CCP1INIT(); /*CCP1模塊的PWM工作方式初始化*/
T2CON=0X04; /*打開TMR2,且使其前分頻為0,
*同時開始輸出PWM波形*/
do
{
;
}while(1); /*系統(tǒng)開始輸出PWM波形。如果系統(tǒng)是
*多任務(wù)的,則可以在此執(zhí)行其它任務(wù),而
*不會影響PWM波形的產(chǎn)生*/
}
5.7.3 應(yīng)用程序
2. 程序清單
#include <pic.h>
/*此程序?qū)崿F(xiàn)"看門狗"WDT的功能*/
unsigned long I;
/*系統(tǒng)初始化子程序*/
void initial()
{
OPTION = 0X0F; /*把前分頻器分配給WDT,且分頻倍率為1:128*/
TRISD = 0X00; /*D口設(shè)為輸出*/
}
/*延時子程序*/
void DELAY()
{
for (i=19999;--i;)
continue;
}
/*主程序*/
main ()
{
initial(); /*初始化,設(shè)定看門狗的相關(guān)寄存器*/
PORTD = 0X00; /*D口送00H,發(fā)光二極管亮*/
DELAY(); /*給予一定時間的延時*/
PORTD = 0XFF; /*D口送FFH,發(fā)光二極管滅*/
while(1)
{
;
} /*死循環(huán),等待看門狗溢出復(fù)位*/
}
5.8.3 程序清單
該例在PIC16F877休眠前使8個發(fā)光二極管的高4個發(fā)光,然后進(jìn)入休眠工作方式;若按鍵引起的中斷將其激活,則低4個發(fā)光。用C語言編寫程序時,語句SLEEP()相當(dāng)于匯編語言中的語句“sleep”,使單片機(jī)進(jìn)入休眠狀態(tài)。
#include <pic.h>
/*該程序?qū)崿F(xiàn)PIC16F877的休眠工作方式,并由實(shí)驗(yàn)板上的按鍵產(chǎn)生"電平變化中斷"將其*從休眠狀態(tài)中激活。休眠與激活的狀態(tài)由與D口相連的8個LED顯示。休眠時高4個
*LED發(fā)光,低4個LED熄滅; 激活以后高4個LED熄滅,低4個LED發(fā)光*/
unsigned long i;
/*系統(tǒng)初始化子程序*/
void initial()
{
di(); /*全局中斷禁止,"電平變化中斷"只執(zhí)行喚醒功能*/
RBIE=1; /*PORTB口電平變化中斷允許*/
RBIF=0; /*清除B口電平變化中斷標(biāo)志*/
TRISB4=1;
TRISB5=1;
TRISB2=0;
TRISB1=0; /*設(shè)置與鍵盤有關(guān)的各I/O口的輸入輸出方式*/
TRISD=0X00; /*D口為輸出*/
PORTB=0X00; /*鍵盤的行線送低電平,為“電平變化中斷” 作準(zhǔn)備*/
PORTB=PORTB; /*讀PORTB的值,鎖存舊值,也為“電平變化
*中斷”作準(zhǔn)備*/
}
/*主程序*/
main ()
{
initial(); /*初始化*/
PORTD=0X0F; /*高4個LED燈亮*/
SLEEP(); /*單片機(jī)開始進(jìn)入休眠狀態(tài)*/
PORTD=0XF0; /*激活后,低4個LED燈亮*/
while(1)
{
;
}
}
復(fù)制代碼
PIC單片機(jī)C語言編程實(shí)例一.doc
2018-8-1 15:50 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
138 KB, 下載次數(shù): 31, 下載積分: 黑幣 -5
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
中文字幕视频一区
|
亚洲色诱
|
日韩成人精品
|
亚洲精品一区二区三区在线观看
|
欧美视频在线一区
|
一级片在线观看视频
|
一级免费毛片
|
午夜高清
|
成人免费毛片片v
|
日韩在线不卡视频
|
深夜福利网
|
在线观看av片
|
亚洲成人精品一区
|
成人福利在线观看
|
国产一区精品在线观看
|
亚洲视频一区二区
|
国产二区视频在线观看
|
日本一级大毛片a一
|
欧美日韩国产在线观看
|
日韩激情一区二区
|
韩国精品一区
|
日韩一区二区三区视频
|
日韩精品小视频
|
色偷偷噜噜噜亚洲男人
|
亚洲日本精品
|
亚洲www
|
亚洲三级在线
|
国产亚洲视频在线观看
|
亚洲成人av一区二区
|
欧美做爰xxxⅹ性欧美大片
|
99久久精品国产毛片
|
国产三级视频在线播放
|
日本丰满少妇做爰爽爽
|
日韩中文字幕第一页
|
影音先锋在线观看视频
|
日本三级久久
|
国产精品91在线
|
中文字幕在线观看免费视频
|
四虎久久久
|
日韩午夜片
|
日韩av免费看
|