历史上的今天
今天是:2024年10月28日(星期一)
2019年10月28日 | PIC16F684单片机定时中断跑马灯
2019-10-28 来源:51hei
初学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++; //计数++ } }
史海拾趣
|
最近我常用的一个函数出了点异样,大虾米现身了!!!HOHO 函数如下: unsigned int SysTim; unsigned int PreTim1; unsigned int PreTim2; unsigned int LenTim(unsigned int preTim, unsigned int sysTim) { if (preTim > sysTim) { return (0 ...… 查看全部问答> |
|
众所周知,模拟电路难学,以最普遍的晶体管来说,我们分析它的时候必须首先分析直流偏置,其次在分析交流输出电压。可以说,确定工作点就是一项相当麻烦的工作(实际中来说),晶体管的参数多、参数的离散性也较大。但值得我们注意的是,模拟电路构 ...… 查看全部问答> |
|
有谁了解深圳\"研祥智能科技\"公司吗?那边的待遇怎么样,我是08年的应届毕业生,我很想知道,本科生在那边的待遇和发展怎么样呢? 望各位知情的大虾帮帮忙啊 ~谢过~… 查看全部问答> |
|
fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory fatal error C1083: Cannot open include file: \'zlib.h\': No such file or directory 为什么会出这种错误,… 查看全部问答> |
|
今天闲来无事,在家看一本介绍二战期间密码破译的书,在看到有关图灵贡献一段时,突然意识到昨天是这位现代计算机之父的忌日,特发此帖纪念这位伟大的天才。下面是拜读百度上有关图灵的介绍:【概述】阿兰·麦席森·图灵(Alan Mathison& ...… 查看全部问答> |
|
以下见解纯属一家之言,本来是写给自己的,但是看到本 BBS 中不少兄弟热心助人,受到感染,故将其贴出。希望能起到抛砖引玉的作用。 谬误及其它不妥之处,还望兄弟们提出指正。 用单片机开发产品的几点体会 1、用户需求 必须明确认识到作产品开 ...… 查看全部问答> |
|
请问下各位: 本人用DCO倍频至8M, LPM0: MCLK OFF, SMCLK ON, ACLKON, DCO ON LPM1: MCLK OFF, SMCLK ON, ACLK ON, DCO ON(DCO用于MCLK和SMCLK) (1)不知两者到底有何区别,LPM1下是否会影响TIMER1(时钟选择为SM ...… 查看全部问答> |




