如何用pic单片机写用中断法,让16位定时器TMR1 ,让LED一秒闪

 我来答
廖星123
推荐于2017-11-25 · 超过16用户采纳过TA的回答
知道答主
回答量:83
采纳率:0%
帮助的人:51万
展开全部
#include<pic.h>//16位定时器TMR1的应用,用中断法,让LED一秒闪
//在使用定时计数器时一定要设置使能寄存器(PIE1)和中断控制寄存器(INTCON)
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
uint initnum;//定义一个溢出中断的变量
void init()//初始化接LED的RD端口为输出,及设置OPTION寄存器关闭TMR0定时计时器
{
TRISD=0;//输出状态
INTCON=0xc0;//设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第一外设允许中断
PIE1=0x01;//使能定时器1为00000001开中断,始终只用一最后一个其他的不用理会
TMR1L=(65536-50000)%256;//装初傎,因为定时器1是16位的,要装满65536个数后才满加1(也就是65536us),如果设50ms(50000us)就加1,则要先装一个初值65536-50000
TMR1H=(65536-50000)/256;//又因为要将初值分开装在低八位和高位里,而八位只有256个数,所以对256求模得整数看有多少个256装在高八位,余下的属于低八位的就求余
T1CON=0x01;//00000001在初始化中只用到最后一位就是开始启到动定时器1(设置预分频器和后分频器)
}
void main()//在主函数里中断函数不需要调用和判断是否产生中断溢出标志T0IF,因为从一上电就自动运行,一到50ms中断会自动溢出加1
{
init();
while(1)
{
if(initnum==20)//它每50ms产生溢出中断,20次则是一秒
{
initnum=0;//到了1s后清零
RD0=!RD0;//取反,再到第二次溢出又取反电平
}
}
}
void interrupt time0()//定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{ //例如:如果是TMR1IF置位才能知用是TMR0定时器,如果是T1IF置位才能知道是TMR1定时器
TMR1IF=0;//先清零,同时知道是用TMR1定时器
TMR1L=(65536-50000)%256;//也要重新装一次初值,从这个初值的基础上加
TMR1H=(65536-50000)/256;
initnum++;//加一
}
来自:求助得到的回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式