C51入門2,定時器和中斷應(yīng)用
實驗一:定時器中斷閃燈
程序:
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include
//端口設(shè)置
sbit P10=P1^0;
sbit K1=P3^2;
char code dx516[3] _at_ 0x003b;
//主函數(shù)
void main(void)
{
TMOD=0x01; //設(shè)置定時器0工作再方式1
TR0=1;//啟動定時器0,TR0必須置1
ET0=1;//開定時器中斷
EA=1; //開總中斷
while(1)//死循環(huán)
{
;
}
}
timer0() interrupt 1//定時器0工作再方式1
{TH0=0x00;//寫入定時器初始值0x0005
TL0=0x01;
P10=~P10;//取反
}
實驗二:精確定時1秒閃爍LED
程序:
//精確定時1秒閃爍LED
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include
//端口設(shè)置
sbit P10=P1^0;
sbit K1=P3^2;
char code dx516[3] _at_ 0x003b;//這是為了仿真設(shè)置
//主函數(shù)
void main(void)
{
RCAP2H=0x10;//賦T2的預(yù)初值為0x1000,溢出30次就是1秒
RCAP2L=0x00;
TR2=1;//啟動定時器
ET2=1;//打開定時器中斷2
EA=1; //開總中斷
while(1)
{
;
}
}
//定時器2中斷
timer2() interrupt 5
{
static uchar t;
TF2=0;
t++;
if (t==10)
{
t=0;
P10=~P10;
}
}
實驗三:用外中斷控制方式讀按鍵,控制燈的亮和滅
程序:
//用外中斷控制方式讀按鍵,控制燈的亮和滅
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit K1=P3^2;
bit light;
int i;
char code dx516[3] _at_ 0x003b;
//主函數(shù)
void main(void)
{
IT0=1;//外部中斷跳變產(chǎn)生中斷
EX0=1;//外部中斷0允許位
EA=1; //開總中斷
while(1)
{
if (!K1)
{
for (i=0;i<10000;i++);
light=~light;
while (!K1);
for (i=0;i<10000;i++);
}
}
}
//外部中斷0
timer0() interrupt 0
{
P10=light;
}
實驗四:模擬PWM輸出控制燈的10個亮度級別
程序:
//模擬PWM輸出控制燈的10個亮度級別
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include
//端口設(shè)置
sbit P10=P1^0;//要控制的LED燈
sbit K1=P3^2;//按鍵K1
uchar scale;//用于保存占空比的輸出0的時間分額,總共10份
char code dx516[3] _at_ 0x003b;
//主函數(shù)
void main(void)
{
uint i;
RCAP2H=0xF3;//賦T2的預(yù)置值,溢出1次是1/1200秒鐘
RCAP2L=0x98;
TR2=1;//啟動定時器
ET2=1;//開定時器中斷
EA=1; //打開總中斷
while(1)
{
for (i=0;i<50000;i++);//延時
scale++;//亮度自動加
if (scale==10)//加到10清零
scale=0;
}
}
timer2() interrupt 5
{
static uchar tt;//用來保存當(dāng)前時間在1秒鐘的比例位置
TF2=0;
tt++;
if (tt==10)//每1/120秒輸出低電平
{ tt=0;
if (scale!=0)//消除滅燈產(chǎn)生的幻影
P10=0;
}
if (scale==tt)//按照當(dāng)前比例切換輸出電平
P10=1;
}