Sbit P17=P1^7; unsigned char i=3; void main( )
{ EA=1; IT0=1; EX0=1; P17=0; do{ }while(1); }
void interrupt0( ) interrupt 0 { i=i-1; if(i==0)
{ P17=!P17; i=3; } }
【例4-10】如图4-18所示,8只LED阴极接至单片机P0口,两开关S0、S1分别接至单片机引脚P3.2()和P3.3()。编写程序控制LED状态。按下S0后,点亮8只LED;按下S1后,变为闪烁状态。
16
#include
void delay(unsigned int d) //定义延时子函数 { while(--d>0); }
void main( )
{ P0=0xFF; //熄灭LED
IT0=1; IT1=1; //外中断0、1脉冲触发方式 EA=1; EX0=1; EX1=1; //开中断 for( ; ; ) //延时等待中断发生 {;} }
void INT0_ISR( ) interrupt 0//外中断0中断服务函数
17
{ P0=0x00; }
void INT1_ISR( ) interrupt 2//外中断1中断服务函数 { while(P32!=0) //如果有外部中断0,则退出 { delay(5000); P0=0x00; delay(5000); P0=0xFF; } } 定时类
【例4-16】设单片机的fosc=12MHz,要求在P1.0上产生周期为2ms的方波。
要在P1.0上产生周期为2ms的方波,定时器应产生1ms的周期性定时,定时到对P1.0取反。
要产生1ms的定时,应选择方式1,定时器方式。
TMOD的确定:选择定时器/计数器T0,定时器方式。方式1,GATE不起作用,高4位为0000,TMOD=01H。
TH、TL的确定:单片机的fosc=12MHz,则单片机的机器周期为1ms,1ms=1000ms,计数器的计数初值为65 536-1000,TH0=(65 536-1000)/256,TL0=(65 536-1000)%6。 ① 采用查询方式
18
程序如下: #include
{ TH0=(65536-1000)/256; TL0=(65536-1000)%6; do{ }while(!TF0); P1_0=!P1_0; TF0=0; } }
② 采用中断方式 程序如下: #include
void timer0(void) interrupt 1 using 1 { P1_0=!P1_0;
TH0=(65536-1000)/256; TL0=(65536-1000)%6;
19
}
void main(void) { TMOD=0x01; P1_0=0;
TH0=(65536-1000)/256; TL0=(65536-1000)%6; EA=1; ET0=1; TR0=1;
do{ } while(1); }
【例4-17】设系统时钟频率为12MHz,编程实现从P1.1输出周期为1s的方波。
要输出周期为1s的方波,应产生500ms的周期性定时,定时到则对P1.1取反即可实现。
20