一.外部中断0、1(分别點亮一個LED)
/******************************************************************************* * 标题: 计数器中断实验 * #include <reg52.h> #include<intrins.h> sbit led1 = P0^0; sbit led2 = P0^1; void main(void) { // IT0=0; //低电平触发 IT0=1; //下降沿触发 EX0=1; // IT1=0; //低电平触发 IT1=1; //下降沿触发 EX1=1; EA=1; while(1); } /******************************************************** * INT0中断函数 * ********************************************************/ void counter0(void) interrupt 0 using 1 { EX0=0; led1=~led1; EX0=1; } /******************************************************** * INT1中断函数 * ********************************************************/ void counter1(void) interrupt 2 using 2 { EX1=0; led2=~led2; EX1=1; } /********************************************************/
二.定时器计算器中断 0 (1S,LED灯闪烁)
#include <reg52.h> #include <intrins.h> typedef unsigned char uchar; typedef unsigned char uint; uint num1,num2; sbit led1=P2^2; void system_Ini() { TMOD = 0x00; //选择模式0 13位计数 最大计数8192 // TH0=0x1C; //12.000M 预装初值 //TL0=0x18; TH0 = (8192 - 1000)/32; TL0 = (8192 - 1000)%32 ; IE = 0x8A; //中断 TR0 = 1; //开启T0定时器 } void main() { system_Ini(); while(1); } void T0zd(void) interrupt 1 //3定时器1的中断号 1定时器0的中断号 0外部中断1 2外部中断2 4串口中断 { //TH0 = 0xFc; //12.000 //TL0 = 0x18; TH0 = (8192 - 1000)/32 ; TL0 = (8192 - 1000)%32; num1++; if(num1>100) { num1=0; num2++; if(num2>10) {num2=0;P2=~P2;} } }
三.定时器计算器中断 1(1S,LED灯闪烁)
#include <reg52.h> #include <intrins.h> typedef unsigned char uchar; typedef unsigned char uint; uint USE_C; void main() { TMOD=0x10; //定时/计数器1工作于方式1 TH0=0x4C; //定时器初始值 TL0=0x00; //50ms定时常数 //THO=(65536-45872)/256; 11.0592MHZ //TLO=(65536-45872)%256; EA=1; //开总中断 ET1=1; //允许定时/计数器1 中断 TR1=1; //启动定时/计数器1 中断 while(1); } /********************************************************* 中断服务函数 **********************************************************/ void Time1(void) interrupt 3 // using 0 { TH1=0x4c; //50ms定时 TL1=0x00; if (++USE_C == 20) //每隔1秒发声 { P2=~P2; USE_C = 0; } }
四.定时器计算器中断 2(1S,LED灯闪烁)
#include <reg52.h> #include <intrins.h> typedef unsigned char uchar; typedef unsigned int uint; uint num; void main() // 该中断计数循环3686(晶振11.0592MHZ)次是一秒4000次(12MHZ) { TMOD=0x02; TH0=6; TL0=6; //当低八位记满溢出 TF0标指位为 1 反应给 CPU 申请中断 同时TH0 中数组 //自动装入(复制)TL0中 EA=1; ET0=1; TR0=1; while(1) { if(num==4000) // 若为11.0592 num=3686 { P2=~P2; num=0; } } } void T0_time() interrupt 1 using 2 { num++; }
五.定时器计算器中断 3(1S,0.5s,LED灯闪烁)
#include <reg52.h> #include <intrins.h> typedef unsigned char uchar; typedef unsigned int uint; sbit led1=P2^1; sbit led2=P2^2; uint num1,num2; void main() { TMOD=0X03; TH0=6; TL0=6; EA=1; ET0=1; ET1=1; TR0=1; TR1=1; while(1) { if(num1>=4000)//3686 11.0592 { num1=0; led1=~led1; } if(num2>=2000)//1843 11.0592 { num2=0; led2=~led2; } } } void TLO_time() interrupt 1 //低八位用定时器计数器中断0的中断源 { TL0=6; num1++; } void TH0_time() interrupt 3 //高八位用定时器计数器中断1的中断源 { TH0=6; num2++; }
六.定时器计数器中断 0 (计数器中断)
/******************************************************************************* * 标题: 计数器中断实验 * * * * * * 实验说明:用单片机产生的脉冲波,作为T0外部事件的脉冲输入,对于HC6800EM3的型 * * 号,可以自带的脉冲发生器作为T0外部事件的脉冲输入 * * 连接方法:参开图片或视频 * ******************************************************************************** * * * 请学员认真消化本例程,掌握定时器/计数器中断使用 * ********************************************************************************/ #include <reg52.h> #include<intrins.h> sbit LED = P0^0; sbit Pulse = P1^0; void Timer0() interrupt 1 { TH0 = 0Xa0; //给计数器装初值 TL0 = 0X00; LED = ~LED; //LED灯取反 } void main() { P0 = 0XFF; TMOD = 0X05; //选用计数模式和 选用模式1 TH0 = 0Xa0; //给计数器装初值 TL0 = 0x00; EA = 1; //开发所有中断 ET0 = 1; //开启定时器T0中断 TR0 = 1; //启动T0定时器 while(1) { Pulse = 0 ; _nop_(); //空指令函数 用于产生方波 _nop_(); _nop_(); _nop_(); Pulse = 1 ; _nop_(); _nop_(); _nop_(); _nop_(); } }
写于2012年年末
时间: 2024-10-07 13:11:34