×
单片机 > 单片机程序设计 > 详情

PIC16F684单片机定时中断跑马灯

发布时间:2020-06-03 发布时间:
|

初学PIC,写了一个定时跑马灯程序,以供新手学习PIC提供子资料,文中给出了详细代码和注释,对照手册,新手完全可以看懂,便于理解和后期开发,给予新手打开PIC的大门钥匙。


1、开发环境:我选择的是 MPLAB x IDE 

2、芯片型号:8位单片机,PIC16F684

3、程序功能:


(1)RC3、RC4接两个LED灯,低电平点亮

(2)时钟选用内部时钟8MHZ

(3)定时时间为1ms进一次中断

(4)计时500ms,小灯500ms亮,500ms灭

/*********************************************/

/***

        芯片型号:PIC16F684

1、RC3、RC4接两个LED灯,低电平点亮

2、时钟选用内部时钟8MHZ

3、定时时间为1ms进一次中断

4、小灯500ms亮,500ms灭

*************************/


4、程序代码


/*

* File: main.c

* Author: 夏夕空

* Created on 2018年02月06日

* Version: V1.0 beta0

* 系统时钟选用内部8M晶振

*/

#include

// 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 //定时1ms

#define FOSC 8000        //时钟频率8MHZ

#define LED TRISC                // LEDI/O口


void delay_ms(uint xms);        //非精确延时,有误差

void Timer0_Init(void);         //定时器0初始化


/***************************************

* 名    称:delay_ms()

* 功    能:非精确延时

* 输入参数:无

* 返回参数:无

***************************************/

void delay_ms(uint xms)

{

uint x,y;

for(x=xms; x>0;x--)

     for(y=2000;y>0;y--);

}

/***************************************

* 名    称:Timer0_Init()

* 功    能:初始化定时器0

* 输入参数:无

* 返回参数:无

***************************************/

volatile uchar temp =0;             //temp为初始值缓存

void Timer0_Init(void)

{

    T0CS = 0;       //选择定时器模式,T0CS =1为计数器模式,T0CS =0为定时器模式

    T0SE = 0;       //定时器上升沿递增,T0SE =0为上升沿递增,T0SE =1为下降沿递增

    PSA = 0;        //预分频器分给定时器

/***三种方式都可以****/

    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;       //定时器0溢出标志位

    GIE = 1;        //总中断允许位,GIE =1为允许所有未屏蔽中断,GIE =0禁止中断

    T0IE = 1;       //定时器0溢出中断允许,T0IE =1,允许溢出时中断,T0IE =0不允许中断

    temp = 256-((Time_base*FOSC)/4/32);  //定时1ms

    TMR0 = temp;      //重载初始值

}

/*全局静态变量count*/

static uint count = 0;

/***************************************

* 名    称:main()

* 功    能:根据协议处理数据

* 输入参数:无

* 返回参数:无

***************************************/

void main(void)

{

    delay_ms(5);        //等待时钟稳定

    PORTC &=0xE7;       //RC3,RC4选择为输出模式

    Timer0_Init();      //定时器0初始化

    LED &= 0xF7; //1B1111 0111选择小灯初始状态 RC3亮

    LED |=0x10;  //1B0001 0000                 RC4灭

    while(1)

    {

        if(count == 500)       //500ms时间到

        {

            count = 0;         //清零计数

            LED = ~LED;         //小灯翻转

        }

        else            //时间没到,空等待

        {

        }

    }

}

/***************************************

* 名    称:Timer0_Isr()

* 功    能:产生1ms时基

* 输入参数:无

* 返回参数:无

***************************************/

void interrupt Timer0_Isr(void)

{

    if(T0IF == 1)          //如果溢出中断

    {     

        T0IF = 0;         //标志位清0

        temp = 256-((Time_base*FOSC)/4/32);

        TMR0 = temp;      //重载初始值

        count++;          //计数++

    }

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
可升级和可配置的PSoC62系列MCU平台架构