標(biāo)題:
PIC16F684單片機(jī)定時(shí)中斷跑馬燈 有詳細(xì)代碼注釋
[打印本頁(yè)]
作者:
xiaxikong
時(shí)間:
2018-3-7 13:55
標(biāo)題:
PIC16F684單片機(jī)定時(shí)中斷跑馬燈 有詳細(xì)代碼注釋
初學(xué)PIC,寫(xiě)了一個(gè)定時(shí)跑馬燈程序,以供新手學(xué)習(xí)PIC提供子資料,文中給出了詳細(xì)代碼和注釋,對(duì)照手冊(cè),新手完全可以看懂,便于理解和后期開(kāi)發(fā),給予新手打開(kāi)PIC的大門(mén)鑰匙。
1、開(kāi)發(fā)環(huán)境:我選擇的是 MPLAB x IDE
2、芯片型號(hào):8位單片機(jī),PIC16F684
3、程序功能:
(1)RC3、RC4接兩個(gè)LED燈,低電平點(diǎn)亮
(2)時(shí)鐘選用內(nèi)部時(shí)鐘8MHZ
(3)定時(shí)時(shí)間為1ms進(jìn)一次中斷
(4)計(jì)時(shí)500ms,小燈500ms亮,500ms滅
/*********************************************/
/***
芯片型號(hào):PIC16F684
1、RC3、RC4接兩個(gè)LED燈,低電平點(diǎn)亮
2、時(shí)鐘選用內(nèi)部時(shí)鐘8MHZ
3、定時(shí)時(shí)間為1ms進(jìn)一次中斷
4、小燈500ms亮,500ms滅
*************************/
4、程序代碼
/*
* File: main.c
* Author: 夏夕空
* Created on 2018年02月06日
* Version: V1.0 beta0
* 系統(tǒng)時(shí)鐘選用內(nèi)部8M晶振
*/
#include <htc.h>
// PIC16F684 Configuration Bit Settings
// 'C' source line config statements
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON &MCLRE_OFF &
CP_OFF & CPD_OFF & BOREN_OFF & IESO_ON & FCMEN_ON);
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Time_base 1 //定時(shí)1ms
#define FOSC 8000 //時(shí)鐘頻率8MHZ
#define LED TRISC // LEDI/O口
void delay_ms(uint xms); //非精確延時(shí),有誤差
void Timer0_Init(void); //定時(shí)器0初始化
/***************************************
* 名 稱:delay_ms()
* 功 能:非精確延時(shí)
* 輸入?yún)?shù):無(wú)
* 返回參數(shù):無(wú)
***************************************/
void delay_ms(uint xms)
{
uint x,y;
for(x=xms; x>0;x--)
for(y=2000;y>0;y--);
}
/***************************************
* 名 稱:Timer0_Init()
* 功 能:初始化定時(shí)器0
* 輸入?yún)?shù):無(wú)
* 返回參數(shù):無(wú)
***************************************/
volatile uchar temp =0; //temp為初始值緩存
void Timer0_Init(void)
{
T0CS = 0; //選擇定時(shí)器模式,T0CS =1為計(jì)數(shù)器模式,T0CS =0為定時(shí)器模式
T0SE = 0; //定時(shí)器上升沿遞增,T0SE =0為上升沿遞增,T0SE =1為下降沿遞增
PSA = 0; //預(yù)分頻器分給定時(shí)器
/***三種方式都可以****/
OPTION_REG &= 0xF8; //1B 1111 1000 32分頻
OPTION_REG |= 0x04; //1B 0000 0100
/*
PS2 = 1; //1B 0000 0100 32分頻
PS1 = 0;
PS0 = 0;
*/
// OPTION_REG = 0x04; //1B 0000 0100 32分頻
T0IF = 0; //定時(shí)器0溢出標(biāo)志位
GIE = 1; //總中斷允許位,GIE =1為允許所有未屏蔽中斷,GIE =0禁止中斷
T0IE = 1; //定時(shí)器0溢出中斷允許,T0IE =1,允許溢出時(shí)中斷,T0IE =0不允許中斷
temp = 256-((Time_base*FOSC)/4/32); //定時(shí)1ms
TMR0 = temp; //重載初始值
}
/*全局靜態(tài)變量count*/
static uint count = 0;
/***************************************
* 名 稱:main()
* 功 能:根據(jù)協(xié)議處理數(shù)據(jù)
* 輸入?yún)?shù):無(wú)
* 返回參數(shù):無(wú)
***************************************/
void main(void)
{
delay_ms(5); //等待時(shí)鐘穩(wěn)定
PORTC &=0xE7; //RC3,RC4選擇為輸出模式
Timer0_Init(); //定時(shí)器0初始化
LED &= 0xF7; //1B1111 0111選擇小燈初始狀態(tài) RC3亮
LED |=0x10; //1B0001 0000 RC4滅
while(1)
{
if(count == 500) //500ms時(shí)間到
{
count = 0; //清零計(jì)數(shù)
LED = ~LED; //小燈翻轉(zhuǎn)
}
else //時(shí)間沒(méi)到,空等待
{
}
}
}
/***************************************
* 名 稱:Timer0_Isr()
* 功 能:產(chǎn)生1ms時(shí)基
* 輸入?yún)?shù):無(wú)
* 返回參數(shù):無(wú)
***************************************/
void interrupt Timer0_Isr(void)
{
if(T0IF == 1) //如果溢出中斷
{
T0IF = 0; //標(biāo)志位清0
temp = 256-((Time_base*FOSC)/4/32);
TMR0 = temp; //重載初始值
count++; //計(jì)數(shù)++
}
}
復(fù)制代碼
作者:
caixionglue
時(shí)間:
2019-2-27 20:54
連TRISC和PORT都沒(méi)分清楚,呵呵
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1