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

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

#include<pich>//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++;//加一

}

主要材料:电动机,发光二极管,锁存器(74HC573),单片机(89s51),红外发射管,红外接收管,电池。

时钟显示原理:

电动机带动焊有一排LED的电路板旋转,单片机通过红外管测得电路板转一圈的时间,然后将时间分割,在每个分割点让不同的发光二极管显示,利用人眼视觉暂留,看上去就像一个时钟。

在使用PIC16F877A单片机时,如果使用定时器0,那么最好不要写TMR0,因为每次的写 *** 作都会导致定时器0的预分频器清零。一般都是定义一个变量,来做定时器0计时值的累计,这样才会将误差降到最小。另外就是仿真的时间不一定准确

以上就是关于如何用pic单片机写用中断法,让16位定时器TMR1 ,让LED一秒闪全部的内容,包括:如何用pic单片机写用中断法,让16位定时器TMR1 ,让LED一秒闪、做旋转LED都需要什么东西、一个很短的PIC16F877A单片机程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10624867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存