初学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++; //计数++
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』