一、利用定时器/计数器0的工作方式1,实现一个发光二极管亮1秒、熄1秒,这样周期性的闪烁。
#include<reg51.h>
unsigned char num;
sbit D0 = P2^0;
void main()
{
TMOD = 0X01; //二进制为0000 0001,表示定时器/计数器为定时模式,工作方式为方式1;TMOD为定时器/计数器工作方式寄存器
TH0 = (65536-45872)/256; /*TH0为计数器/定时器的高8位;1s=1000ms(毫秒)=1000000us(微秒);1000000远远大于65536,故把1000000拆成20份,一份50000us;
因为我的晶振是11.0592MHz,机器周期为1.09us;50000/1.09=45872;也就是我只要计45872下即可;即我应该给计数器中赋一个初始值(65536-45872=19664)
19664/256取模可得高8位,就是满256就在TH0中计1,不满的部分为TL0中的值*/
TL0 = (65536-45872)%256;
EA = 1; //EA为中断允许寄存器IE中的总开关中断控制位,EA=1,CPU开放中断
ET0 = 1; //ET0为定时器/计数器0的中断允许位,等于0时关闭,等于1时,开启
TR0=1; //启动定时器T0
while(1) //一直执行的
{
if(num==20) //等待num到20,即满1S,然后灯进行变化
{
num = 0;D0=~D0; //重置num归0,对灯进行取反变化
}
}
}
void T0_time() interrupt 1 //T0_time是函数名,interrupt是一个关键字,表示51单片机中断,“1”是中断号
{
TH0 = (65536-45872)/256; //重装初值
TL0 = (65536-45872)%256; //重装初值
num++; //每次中断发生后,中断服务程序要做的事就是num自加1,num等于几,就相当于用了多少个50ms
}
二、利用定时器/计数器0的工作方式1,实现八个发光二极管亮0.5秒然后熄灭,下一个再亮0.5秒熄灭,这样周期性的闪烁(流水灯)。
#include<reg51.h>
unsigned char num;
void main()
{
TMOD = 0x01; //二进制为0000 0001,表示定时器/计数器为定时模式,工作方式为方式1;TMOD为定时器/计数器工作方式寄存器
TH0 = (65536-45872)/256; /*TH0为计数器/定时器的高8位;1s=1000ms(毫秒)=1000000us(微秒);1000000远远大于65536,故把1000000拆成20份,一份50000us;
因为我的晶振是11.0592MHz,机器周期为1.09us;50000/1.09=45872;也就是我只要计45872下即可;即我应该给计数器中赋一个初始值(65536-45872=19664)
19664/256取模可得高8位,就是满256就在TH0中计1,不满的部分为TL0中的值*/
TL0 = (65536-45872)%256;
EA = 1; //EA为中断允许寄存器IE中的总开关中断控制位,EA=1,CPU开放中断
ET0 = 1; //ET0为定时器/计数器0的中断允许位,等于0时关闭,等于1时,开启
TR0=1; //启动定时器T0
while(1) //一直执行的
{
if(num==10) P2 = 0xfe;
else if(num==20) P2 = 0Xfd;
else if(num==30) P2 = 0xfb;
else if(num==40) P2 = 0xf7;
else if(num==50) P2 = 0xef;
else if(num==60) P2 = 0xdf;
else if(num==70) P2 = 0xbf;
else if(num==80){P2 = 0x7f;num = 0;}
}
}
void T0_time() interrupt 1 //T0_time是函数名,interrupt是一个关键字,表示51单片机中断,“1”是中断号
{
TH0 = (65536-45872)/256; //重装初值
TL0 = (65536-45872)%256; //重装初值
num++; //每次中断发生后,中断服务程序要做的事就是num自加1,num等于几,就相当于用了多少个50ms
}
三、使用外部中断0控制一个LED灯的亮灭
#include<reg51.h>
sbit D0 = P2^0;
sbit K3 = P3^2;
void main()
{
EA = 1; //CPU中断允许位
EX0 = 1; //外部中断0允许位
IT0 = 1; //下降沿触发方式(由高电平变低电平)
while(1){
K3 = 1; //设置INT0脚为高电位,若按下键则会触发外部中断
}
}
void it0() interrupt 0
{
D0 = ~D0;
}
四、编程使LED灯点亮0.5秒然后熄灭,依次循环流动。用一按键当作暂停键,在次按下时流水灯从暂停位置继续流动。
#include<reg51.h>
#define uchar unsigned char
sbit K3 = P3^2;
uchar i=0,num;
void key() //按键检测,若第一次按键i=1,进入循环,当再一次按键,i=0;跳出循环
{
if(i==1)
{
while(1){
if(i==0) break;
}
}
}
void lsd() //流水灯函数
{
if(num==10) P2 = 0xfe;
else if(num==20){P2 = 0Xfd;key();}
else if(num==30){P2 = 0xfb;key();}
else if(num==40){P2 = 0xf7;key();}
else if(num==50){P2 = 0xef;key();}
else if(num==60){P2 = 0xdf;key();}
else if(num==70){P2 = 0xbf;key();}
else if(num==80){P2 = 0x7f;key();num = 0;}
}
void main()
{
EA=1; //CUP中断开启
EX0=1; //外部中断
IT0 = 1; //外部中断下降沿方式
ET0=1; //定时器中断
TMOD=0X01; //定时器工作方式1
TR0 = 1; //启动定时器0;
TH0 = (65536-45872)/256;
TL0 = (65536-45872)%256;
while(1){
K3 = 1;
lsd();
}
}
void T0_time() interrupt 1
{
TH0 = (65536-45872)/256; //重装初值
TL0 = (65536-45872)%256; //重装初值
if(i==0) num++; //若i=1时,暂停循环,则计数也暂停
}
void in0() interrupt 0
{
i++;
if(i == 2) i = 0; //当i累加到2时,重置0
}