}
TR0=1; while(1) { }
P1=TH0; P2=TL0;
//启动定时器
31 TIMER0与TIMER1控制条形LED
/* 名称:TIMER0与TIMER1控制条形LED 说明:定时器T0定时控制上一组条形LED,滚动速度较快
定时器T1定时控制下一组条形LED,滚动速度较慢
*/
#include
#define uchar unsigned char #define uint unsigned int uchar tc0=0,tc1=0; //主程序 void main() {
P0=0xfe; P2=0xfe; TMOD=0x11; //定时器0、定时器1均工作于方式1 TH0=(65536-15000)/256; //定时器0:15ms
TL0=(65536-15000)%6; TH1=(65536-50000)/256;
//定时器1:50ms
TL1=(65536-50000)%6; IE=0x8a; TR0=1; //启动定时器 TR1=1;
while(1); }
//T0中断函数
void Time0() interrupt 1 {
TH0=(65536-15000)/256; //恢复定时器0初值
TL0=(65536-15000)%6; if(++tc0==10) //150ms转换状态 { }
31
tc0=0;
P0=_crol_(P0,1);
}
//T1中断函数
void Time1() interrupt 3 { TH0=(65536-50000)/256; }
//恢复定时器1初值
TL0=(65536-50000)%6; if(++tc1==10) //500ms转换状态 { }
tc1=0;
P2=_crol_(P2,1);
32 10s的秒表
/* 名称:10s的秒表 说明:首次按键计时开始,再次按键暂停,第三次按键清零。 */
#include
uchar
i,Second_Counts,Key_Flag_Idx; bit Key_State; uchar
DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时
void DelayMS(uint ms) {
uchar t;
while(ms--) for(t=0;t<120;t++);
}
//处理按键事件
void Key_Event_Handle() {
if(Key_State==0) {
Key_Flag_Idx=(Key_Flag_Idx+1)%3; switch(Key_Flag_Idx) {
case 1: case 2:
EA=1;ET0=1;TR0=1;break; EA=0;ET0=0;TR0=0;break;
32
case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0;
}
} }
//主程序 void main() { P0=0x3f; //显示00
P2=0x3f; i=0;
Second_Counts=0; Key_Flag_Idx=0;
//按键次数(取值0,1,2,3) Key_State=1;
//按键状态
TMOD=0x01;
//定时器0方式1 TH0=(65536-50000)/256; //定时器0:15ms
TL0=(65536-50000)%6; while(1) { if(Key_State!=K1) { DelayMS(10); Key_State=K1;
Key_Event_Handle();
}
} }
//T0中断函数
void DSY_Refresh() interrupt 1 { TH0=(65536-50000)/256;
//恢复定时器0初值
TL0=(65536-50000)%6; if(++i==2) //50ms*2=0.1s转换状态 { i=0;
Second_Counts++;
P0=DSY_CODE[Second_Counts/10]; P2=DSY_CODE[Second_Counts];
if(Second_Counts==100) Second_Counts=0;
//满100(10s)后显示00
}
}
33 用计数器中断实现100以内的按键计数
/* 名称:用计数器中断实现100以内的按键计数
说明:本例用T0计数器中断实现按键技术,由于计数寄存器初值为1,因此
33
P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。 计数器的清零用外部中断0控制。
*/
#include
code
DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar Count=0; //主程序 void main() {
P0=0x00;
//计数器T0方式2 //计数值为1 //允许T0中断 //允许INT0中断 //允许CPU中断
P2=0x00;
TMOD=0x06; TH0=TL0=256-1; ET0=1; EX0=1; EA=1; IP=0x02; IT0=1; TR0=1; while(1) {
P0=DSY_CODE[Count/10]; P2=DSY_CODE[Count];
//设置优先级,T0高于INT0 //INT0中断触发方式为下降沿触发 //启动T0
}
}
//T0计数器中断函数
void Key_Counter() interrupt 1 { Count=(Count+1)0; //因为只有两位数码管,计数控制在100以内(00~99) }
//INT0中断函数
void Clear_Counter() interrupt 0 {
34
}
Count=0;
34 100 000s以内的计时程序
/* 名称:100 000s以内的计时程序 说明:在6只数码管上完成0~99 999.9s。 */
#include
code
DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //6只数码管上显示的数字
uchar Digits_of_6DSY[]={0,0,0,0,0,0}; uchar Count; sbit Dot=P0^7; //延时
void DelayMS(uint ms)
{ uchar t; while(ms--) for(t=0;t<120;t++); }
//主程序 void main() {
uchar i,j; P0=0x00;
P3=0xff; Count=0;
TMOD=0x01; TH0=(65536-50000)/256;
//计数器T0方式1 //50ms定时
TL0=(65536-50000)%6; IE=0x82; TR0=1; //启动T0 while(1) {
j=0x7f;
//显示Digits_of_6DSY[5]~Digits_of_6DSY[0]的内容 //前面高位,后面低位,循环中i!=-1亦可写成i!=0xff for(i=5;i!=-1;i--)
35