电路连接如实验1 中断的应用1: 要求:使用定时器T0,实现P0.0引脚LED灯亮30ms,灭30ms,持续闪烁,采取中断方式。RC时钟为22.1184MHz。 主时钟fosc未设置分频,所以系统时钟SYSclk=fosc 并且每12个系统时钟周期计数一次 根据定时公式,预装入初值应为: 预装入初值=65536-T*SYSclk/12 其中T为定时时间T=30ms=30000us=30000*10-6 SYSclk=fosc=22.1184MHz=22.1184*106
将T和SYSclk带入上式 预装入初值=65536-30000*10-6*22.1184*106/12=10240 就是十六进制数 0x2800 #include "STC15W4K.H" sbit LED0=P0^0; void delay500ms() { unsigned char i,j,k; // i,j,k由软件计算出并验证正确。 for(i=41;i>0;i--) for(j=133;j>0;j--) for(k=252;k>0;k--); } void port_mode() // 端口模式 { P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00; P2M1=0x00;P2M0=0x00;P3M1=0x00; P3M0=0x00; P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00; P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00; } void Timer0() interrupt 1 { LED0=!LED0; } void main() { uchar data i; port_mode(); //端口初始化,配置为准双向弱上拉,与传统51同 for(i=1; i<=3; i++) //LED灯亮三次,表明系统上电正常工作 { LED0=0; delay500ms(); LED0=1; delay500ms(); } P0=0xff; //关闭P0口所以的LED灯 TMOD=0x00; //定时器0为 16位自动重装入方式 TH0=0x28; //装入初值 TL0=0x00; TR0=1; //开启定时器 ET0=1; //定时器中断开 EA=1; //总中断开 while(1); }
中断的应用2 要求:用定时器T0实现P0.0引脚的LED灯以1秒亮,1秒灭的方式闪烁,RC时钟22.1184MHz,使用中断方式。 主时钟fosc无分频,故系统时钟SYSclk=fosc 定时器T0每12个系统时钟周期计数一次
如果每20ms,产生一次中断,那么50次中断以后,就会得到1秒的定时 计算预装入初值,方法同中断的应用1 T=20ms=20000us=20000*10-6s SYSclk=22.1184MHz=22.1184*106 预装入初值=65536-20000*10-6*22.1184*106/12=28672 就是十六进制数 0x7000 这次将T0定时器的工作方式设置为 手动16位重装入 TMOD=0x01; #include "STC15W4K.H" #define uchar unsigned char #define uint unsigned int sbit LED0=P0^0; void delay500ms() { unsigned char i,j,k; for(i=41;i>0;i--) for(j=133;j>0;j--) for(k=252;k>0;k--); } void port_mode() // 端口模式
{ P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00; P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00; P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00; P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00; } void Timer0() interrupt 1 { static uchar idata Count=0; //静态变量,只初始化一次 Count++; if(Count>=50) { LED0=!LED0; Count=0; } TH0=0x70; TL0=0x00; } void main() { uchar data i; port_mode(); //端口初始化,配置为准双向弱上拉,与传统51同 for(i=1; i<=3; i++) //LED灯亮三次,表明系统上电正常工作 { LED0=0; delay500ms(); LED0=1; delay500ms(); } P0=0xff; //关闭P0口所以的LED灯 TMOD=0x01; //定时器0为 16位手动重装入方式 TH0=0x70; //装入初值 TL0=0x00; TR0=1; //开启定时器 ET0=1; //定时器中断开 EA=1; //总中断开 while(1);
} |
|