本帖最后由 解博 于 2014-12-13 11:10 编辑
我的单片机型号是PIC12F629,我写的LED1 LED2闪烁程序,怎么好像定时器没有工作呀。
#include "pic.h"
__CONFIG(0x3194);//INTOSC震荡4MHZ, GP4,GP5 IO输入/出
//符号变量替换
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long int
#define LED1 GP1//指示灯1 红灯
#define LED2 GP2//指示灯2 黄灯
#define RST GP0//复位按键
#define KEY1 GP4//按键1
#define KEY2 GP5//按键2
#define WEEPROMT 200//30000 //记录时间间隔 默认5 = 30000/6000 分钟,减小一下这个值就可以加快速度
#define Month6 6//51840 // 6个月=51840*5分钟;
#define Month8 8//69120 // 8个月=619200*5分钟;
#define Month10 10//86400 // 10个月=86400*5分钟;
#define Month12 12//103680 // 12个月=103680*5分钟;
u16 Timer1IntCount = 0; //定时器1中断计数
u8 SetTime = 0; //设定指示时间
u32 RunTime = 0; //运行时间
u8 RunTimeL8 = 0; //运行时间低8位
u8 RunTimeM8 = 0; //运行时间中8位
u8 RunTimeH8 = 0; //运行时间高8位
void InitIO(void)
{
CMCON = 0X07;//比较器关闭
TRISIO = 0x39;//GP0,GP3,GP4,GP5口设为输入;GP1,GP2设为输出
GPIO = 0x3f;//初始化所有IO为1
}
void InitTimer1(void)//10ms定时,定时时间S=(65536-(TMR1H:TMR1L))*4/FOSC(4MHZ);
{
TMR1H = 0xd8;//
TMR1L = 0xf0;
TMR1IF = 0; //清中断标志位
TMR1IE = 1; //中断允许位
PEIE = 1; //开启外设中断
GIE = 1; //开全局中断
T1CON = 0x01;//16位计数器,不分频FOSC(4MHZ)/4,启动定时器1
}
void Delay(void)
{
u8 i;
for(i = 0;i < 200;i ++);
}
void interrupt ISR(void) //中断服务程序
{
if(TMR1IF)//10ms
{
TMR1IF = 0;
TMR1H = 0xd8;//重装初始值
TMR1L = 0xf0;
Timer1IntCount ++;
}
}
void ReadSet(void)//读设置
{ //NO1 NO2
if(KEY1 == 1 && KEY2 == 1) SetTime = 6; //OFF OFF
else if(KEY1 == 0 && KEY2 == 1) SetTime = 8; //ON OFF
else if(KEY1 == 1 && KEY2 == 0) SetTime = 10; //OFF ON
else if(KEY1 == 0 && KEY2 == 0) SetTime = 12; //ON ON
if(RST == 0)//按下复位键清零计数
{
}
}
void main(void)
{
InitIO();//初始化IO
InitTimer1();//初始化定时器1
while(1)
{
if(Timer1IntCount<300)//300*10ms=3S
{
LED1=1;
LED2=1;
}
if((Timer1IntCount>300)&&(Timer1IntCount<600))
{
LED1=0;
LED2=0;
}
if(Timer1IntCount>600)
{
Timer1IntCount=0;
}
}
}
|