久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
PIC16F877的外圍功能模塊例程
[打印本頁]
作者:
2222we
時間:
2018-8-1 15:51
標題:
PIC16F877的外圍功能模塊例程
第5章 PIC16F877的外圍功能模塊
5.1.2 簡單應用實例
該例用于令與PORTD口相連的8個發光二極管前4個點亮,后4個熄滅。在調試程序前,應使與PORTD口相連的8位拔碼開關拔向相應的位置。
例5.1 PORTD輸出
#include <pic.h>
main()
{
TRISD=0X00; /*TRISD寄存器被賦值,PORTD每一位都為輸出*/
while(1); /*循環執行點亮發光二極管的語句*/
{
PORTD=0XF0; /*向PORTD送數據,點亮LED(由實驗模板*/
/*的設計決定相應位置低時LED點亮)。*/
}
}
5.2.1 MSSP模塊SPI方式功能簡介
下面是一段簡單的SPI初始化例程,用于利用SPI工作方式輸出數據的場合。
例5.2 SPI初始化程序
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0; /*清除SPI中斷標志*/
SSPCON=0x30; /* SSPEN=1;CKP=0 , FOSC/4 */
SSPSTAT=0xC0;
TRISC=0x00; /*SDO引腳為輸出,SCK引腳為輸出*/
}
5.2.3 程序清單
下面給出已經在實驗板上調試通過的一個程序,可作為用戶編制其它程序的參考。
#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引腳為輸出*/
}
/*系統各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0x00; /*A口設置為輸出*/
INTCON=0x00; /*關閉所有中斷*/
PORTA_5=0; /*LACK送低電平,為鎖存做準備*/
}
/*SPI發送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*啟動發送*/
do
{
;
}while(SSPIF==0); /*等待發送完畢*/
SSPIF=0; /*清除SSPIF標志*/
}
/*主程序*/
main()
{
unsigned I;
initial(); /*系統初始化*/
SPIINIT() ; /*SPI初始化*/
for(i=8;i>0;i--) /*連續發送8個數據*/
{
data=table[i]; /*通過數組的轉換獲得待顯示的段碼*/
SPILED(data); /*發送顯示段碼顯示*/
}
PORTA_5=1; /*最后給鎖存信號,代表顯示任務完成*/
}
5.3.3 程序清單
下面給出已經在實驗板上調試通過的程序,可作為用戶編制其它程序的參考。有關顯示部分的SPI初始化,請讀者參考5.2節。
#include <pic.h>
/*該程序用于按下相應的鍵時,在第一個8段LED上顯示相應的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引腳為輸出*/
}
/*系統各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0xDF;
TRISB=0XF0; /*設置與鍵盤有關的各口的數據方向*/
INTCON=0x00; /*關閉所有中斷*/
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(); /*如果仍有鍵按下,則調用鍵服務子程序*/
else j=0x00; /*如果為干擾,則令返回值為0*/
return(j);
}
/*鍵服務子程序*/
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;/*以上根據按下的鍵確定相應的鍵值*/
PORTB=0X00; /*恢復PORTB的值*/
while(1)
{
if((PORTB_5==1)&&(PORTB_4==1)) break;/*等待鍵盤松開*/
}
return(j);
}
/*SPI發送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*啟動發送*/
do
{
;
}while(SSPIF==0); /*等待發送完畢
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();/*系統初始化*/
SPIINIT() ;/*SPI初始化*/
while(1)
{
KEYSCAN();
if(j!=0) /*如果j=0,證明先前的按鍵為干擾,則不予顯示*/
{
data=table[j];
PORTA_5=0; /*LACK信號清0,為鎖存做準備*/
SPILED(data);
PORTA_5=1; /*最后給鎖存信號,代表顯示任務完成*/
}
}
}
5.4.1 PORTB端口“電平變化中斷”簡介
例5.3 PORTB口“電平變化中斷”初始化子程序
/*B口“電平變化中斷”初始化子程序*/
void PORTBINT( )
{
TRISB=0XF0; /*設置相應口的輸入輸出方式*/
OPTION=0x7F; /*B口弱上拉有效*/
PORTB=0X00; /*RB1,RB2 先送低電平*/
RBIE=1; /*B口變位中斷允許 */
PORTB=PORTB; /*讀B口的值,以鎖存舊值,為變位中斷創造條件*/
}
5.4.3 程序清單
下面給出一個調試通過的例程,以供讀者參考。有關顯示的部分請讀者參考前面章節。該程序中寄存器的位都用頭文件中定義的位,如RB5表示PORTB的第5位,而不像前面幾節那樣自己定義。
#include <pic.h>
/*該程序用于通過PORTB的"電平變化中斷"進行鍵盤的識別。*/
/*程序設置一個鍵值寄存器j,當按下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; /*設置相應口的輸入輸出方式*/
OPTION=0x7F;
PORTB=0X00; /*RB1, RB2 先送低電平*/
RBIE=1; /*B口變位中斷允許 */
PORTB=PORTB; /*讀B口的值,為變位中斷創造條件*/
}
/*spi初始化子程序*/
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
TRISC=0xD7; /*SDO引腳為輸出,SCK引腳為輸出*/
}
/*系統各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0xDF;
INTCON=0x00; /*關閉所有中斷*/
data=0X00; /*待顯示的寄存器賦初值*/
}
/*鍵服務子程序*/
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; /*恢復PORTB的值*/
}
/*軟件延時子程序*/
void DELAY()
{
for(i = 6553; --i ;)
continue;
}
/*SPI發送子程序*/
void SPILED(int data)
{
SSPBUF=data; /*啟動發送*/
do
{
;
}while(SSPIF==0);
SSPIF=0;
}
void IDEDIS()
{
KEYSERVE(); /*進行鍵盤的識別*/
data=table[j]; /*獲得需要送出顯示的段碼*/
RA5=0; /*LACK信號清0,為鎖存做準備*/
SPILED(data);
RA5=1; /*最后給一個鎖存信號,代表顯示任務完成*/
}
/*中斷服務程序*/
void interrupt keyint(void)
{
DELAY(); /*軟件延時*/
if ((RB5==0)||(RB4==0)) /*該語句除了能夠確認按鍵是否為干擾外,*/
/*還可以屏蔽一次鍵松開時引起的中斷*/
IDEDIS(); /*鍵識別和顯示模塊*/
PORTB=PORTB; /*讀B口的值,改變中斷發生的條件,避免鍵*/
/*一直按下時,連續進行鍵識別*/
RBIF=0; /*鍵掃描時可能會產生"電平變化"而使RBIF*/
/*置1,再清除一次RBIF以避免額外中斷*/
}
main()
{
initial(); /*系統初始化*/
PORTBINT(); /*B口變位中斷初始化*/
SPIINIT() ; /*利用SPI顯示初始化*/
ei(); /*總中斷允許*/
while(1)
{
;
} /*等待中斷*/
}
5.5.2 程序清單
下面給出一個調試通過的例程,可作為讀者的參考。調試該程序把模板J7上的短路跳針拔下,以免產生沖突。
#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引腳為輸出*/
}
/*系統各輸入輸出口初始化子程序*/
void initial()
{
TRISA=0x00;
TRISD=0x00; /*D口為輸出方式*/
INTCON=0x00; /*關閉所有中斷*/
}
/*SPI接收子程序*/
int SPIIN()
{
RA4=0; /*74HC165并行置數使能,將8位開關量置入器件*/
/* (LOAD為低電平時8位并行數據置入74HC165)*/
RA4=1; /*74HC165移位置數使能(LOAD為高電平時芯*/
/*片才能串行工作)*/
SSPBUF=0; /*啟動SPI,此操作只用于清除SSPSTAT的
*BF位,因此W中的實際數據無關緊要*/
do{
;
}while(SSPIF==0); /*查詢數據接收完畢否?*/
SSPIF=0;
data=SSPBUF;
return(data); /*返回接收到的數據*/
}
/*把SPI接收的數據通過D口顯示在8個發光二極管上的子程序*/
void SPIOUT(int data)
{
PORTD=~data;
}
/*主程序*/
main( )
{
initial(); /*系統初始化*/
SPIINIT(); /*SPI初始化*/
while(1)
{
SPIIN(); /*SPI接收外部數據*/
SPIOUT(data); /*送出數據顯示*/
}
}
5.6.1 CCP模塊的PWM工作方式簡介
下面給出一個CCP模塊設置為PWM操作時的初始化程序
例5.4 CCP模塊設置為PWM方式時的初始化程序
/*CCP1模塊的PWM工作方式初始化子程序*/
void CCP1INIT()
{
CCPR1L=0X7F;
CCP1CON=0X3C; /*設置CCP1模塊為PWM工作方式,且其工作循環
*的低2位為11,高8位為01111111=7F*/
INTCON=0X00; /*禁止總中斷和外圍中斷*/
PR2=0XFF; /*設置PWM的工作周期*/
TRISC=0XFB; /*設置CCP1引腳為輸出方式*/
}
該初始化子程序設置CCP1模塊輸出分辨率為10位的PWM波形,且占空比為50%。
5.6.3 程序清單
下面給出一個調試通過的例程,可作為讀者編制程序的參考。
#include <pic.h>
/*該程序用于使CCP1模塊產生分辨率為10位的PWM波形,占空比為50%*/
/*CCP1模塊的PWM工作方式初始化子程序*/
void CCP1INIT()
{
CCPR1L=0X7F;
CCP1CON=0X3C; /*設置CCP1模塊為PWM工作方式,且其工作
*循環的低2位為11,高8位為01111111=7F*/
INTCON=0X00; /*禁止總中斷和外圍中斷*/
PR2=0XFF; /*設置PWM的工作周期*/
TRISC=0XFB; /*設置CCP1引腳為輸出方式*/
}
/*主程序*/
main()
{
CCP1INIT(); /*CCP1模塊的PWM工作方式初始化*/
T2CON=0X04; /*打開TMR2,且使其前分頻為0,
*同時開始輸出PWM波形*/
do
{
;
}while(1); /*系統開始輸出PWM波形。如果系統是
*多任務的,則可以在此執行其它任務,而
*不會影響PWM波形的產生*/
}
5.7.3 應用程序
2. 程序清單
#include <pic.h>
/*此程序實現"看門狗"WDT的功能*/
unsigned long I;
/*系統初始化子程序*/
void initial()
{
OPTION = 0X0F; /*把前分頻器分配給WDT,且分頻倍率為1:128*/
TRISD = 0X00; /*D口設為輸出*/
}
/*延時子程序*/
void DELAY()
{
for (i=19999;--i;)
continue;
}
/*主程序*/
main ()
{
initial(); /*初始化,設定看門狗的相關寄存器*/
PORTD = 0X00; /*D口送00H,發光二極管亮*/
DELAY(); /*給予一定時間的延時*/
PORTD = 0XFF; /*D口送FFH,發光二極管滅*/
while(1)
{
;
} /*死循環,等待看門狗溢出復位*/
}
5.8.3 程序清單
該例在PIC16F877休眠前使8個發光二極管的高4個發光,然后進入休眠工作方式;若按鍵引起的中斷將其激活,則低4個發光。用C語言編寫程序時,語句SLEEP()相當于匯編語言中的語句“sleep”,使單片機進入休眠狀態。
#include <pic.h>
/*該程序實現PIC16F877的休眠工作方式,并由實驗板上的按鍵產生"電平變化中斷"將其*從休眠狀態中激活。休眠與激活的狀態由與D口相連的8個LED顯示。休眠時高4個
*LED發光,低4個LED熄滅; 激活以后高4個LED熄滅,低4個LED發光*/
unsigned long i;
/*系統初始化子程序*/
void initial()
{
di(); /*全局中斷禁止,"電平變化中斷"只執行喚醒功能*/
RBIE=1; /*PORTB口電平變化中斷允許*/
RBIF=0; /*清除B口電平變化中斷標志*/
TRISB4=1;
TRISB5=1;
TRISB2=0;
TRISB1=0; /*設置與鍵盤有關的各I/O口的輸入輸出方式*/
TRISD=0X00; /*D口為輸出*/
PORTB=0X00; /*鍵盤的行線送低電平,為“電平變化中斷” 作準備*/
PORTB=PORTB; /*讀PORTB的值,鎖存舊值,也為“電平變化
*中斷”作準備*/
}
/*主程序*/
main ()
{
initial(); /*初始化*/
PORTD=0X0F; /*高4個LED燈亮*/
SLEEP(); /*單片機開始進入休眠狀態*/
PORTD=0XF0; /*激活后,低4個LED燈亮*/
while(1)
{
;
}
}
復制代碼
PIC單片機C語言編程實例一.doc
2018-8-1 15:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
138 KB, 下載次數: 31, 下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久草中文在线观看
|
综合一区二区三区
|
欧洲国产精品视频
|
国产成人高清在线观看
|
欧美精品在线一区二区三区
|
久久久www成人免费精品
|
久久精品成人
|
中文字幕在线免费观看
|
日韩精品视频在线
|
久草中文在线观看
|
一区二区小视频
|
国产99久久精品一区二区300
|
在线播放中文字幕
|
在线观看中文字幕dvd播放
|
综合一区二区三区
|
亚洲深夜福利
|
粉嫩粉嫩芽的虎白女18在线视频
|
久久久999精品
|
黄色av网站免费看
|
日韩网站免费观看
|
综合网伊人
|
亚洲精品国产第一综合99久久
|
亚洲久久
|
亚洲 自拍 另类 欧美 丝袜
|
日本精品久久
|
欧美日韩中文在线
|
嫩草影院黄
|
91九色在线观看
|
欧美成人一区二区
|
成人视屏在线观看
|
99pao成人国产永久免费视频
|
五月综合激情网
|
国产视频久久久
|
久久久久久久综合色一本
|
波多野结衣一区二区
|
亚洲成人三区
|
欧美一区二区在线
|
欧美视频免费在线观看
|
h视频免费看
|
国内精品久久精品
|
久久久久久成人网
|