1、 LED=LED; T_Count=0; 二、 TIMER0控制流水灯 TIMER0控制流水灯 说明:定时器控制P0、P2口的LED滚动显示,本例未使用中断函数。intrins.h uchar T_Count=0; P0=0xfe; P2=0xfe; TMOD=0x01; /定时器0工作方式165536-40000/256; /40ms定时%256; /启动定时器 if TF0=0; TH0= TL0= if P0=_crol_ P2=_crol_ T_Count=0; 三、 定时器控制4个LED滚动闪烁定时器控制4个LED滚动闪烁 4只LED在定时器控制下滚动闪烁。sbit B1=P00;s
2、bit G1=P01;sbit R1=P02;sbit Y1=P03;uint i,j,k; i=j=k=0; P0=0xff; TMOD=0x02; /定时器0工作方式2 TH0=256-200; /200us定时 TL0=256-200; /启动定时器void LED_Flash_and_Scroll+k return; /定时中断若干次后执行闪烁 k=0; switch case 0: B1=B1;break; case 1: G1=G1; case 2: R1=R1; case 3: Y1=Y1; default:i=0;+j /每次闪烁持续一段时间 j=0; /关闭显示 i+; /切
3、换到下一个LED四、 T0控制LED实现二进制计数T0控制LED实现二进制计数本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在T0引脚的按键每次按下时,会使计数寄存器的值递增,其值通过LED以二进制形式显示 TMOD=0x05; /定时器0为计数器,工作方式1,最大计数值65535 TH0=0; /初值为0 TL0=0; P1=TH0; P2=TL0;五、 TIMER0与TIMER1控制条形LEDTIMER0与TIMER1控制条形LED 定时器T0定时控制上一组条形LED,滚动速度较快 定时器T1定时控制下一组条形LED,滚动速度较慢u
4、char tc0=0,tc1=0; TMOD=0x11; /定时器0、定时器1均工作于方式165536-15000 /定时器0:15ms TH1= /定时器1:50ms TL1= IE=0x8a; TR1=1;void Time0 /150ms转换状态 tc0=0; P0=_crol_/T1中断函数void Time1 /500ms转换状态 tc1=0; P2=_crol_六、 10s的秒表10s的秒表首次按键计时开始,再次按键暂停,第三次按键清零。sbit K1=P37;uchar i,Second_Counts,Key_Flag_Idx;bit Key_State;uchar DSY_CO
5、DE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/延时void DelayMS uchar t;ms- fort=0;t/处理按键事件void Key_Event_Handle Key_Flag_Idx=%3; switch case 1: EA=1;ET0=1;TR0=1; case 2: EA=0;ET0=0;TR0=0; case 0: P0=0x3f;P2=0x3f;Second_Counts=0; /显示00 P2=0x3f; i=0; Second_Counts=0; Key_Flag_Idx=0; /按键次数取值0,1,2
6、,3 Key_State=1; /按键状态 /定时器0方式1Key_State!=K1 DelayMS Key_State=K1; Key_Event_Handlevoid DSY_Refresh /50ms*2=0.1s转换状态 i=0;Second_Counts+; P0=DSY_CODESecond_Counts/10; P2=DSY_CODESecond_Counts%10;Second_Counts=100 /满10010s后显示00七、 用计数器中断实现100以内的按键计数用计数器中断实现100以内的按键计数本例用T0计数器中断实现按键技术,由于计数寄存器初值为1,因此 P3.4引
7、脚的每次负跳变都会触发T0中断,实现计数值累加。 计数器的清零用外部中断0控制。/段码uchar code DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;uchar Count=0; P0=0x00; P2=0x00; TMOD=0x06; /计数器T0方式2 TH0=TL0=256-1; /计数值为1 ET0=1; /允许T0中断 EX0=1; /允许INT0中断 /允许CPU中断 IP=0x02; /设置优先级,T0高于INT0 IT0=1; /INT0中断触发方式为下降沿触发 /启动T0 P0=DSY_CO
8、DECount/10; P2=DSY_CODECount%10;/T0计数器中断函数void Key_Counter Count=%100; /因为只有两位数码管,计数控制在100以内0099/INT0中断函数void Clear_Counter interrupt 0 Count=0;八、 100 000s以内的计时程序100 000s以内的计时程序在6只数码管上完成099 999.9s。uchar code DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/6只数码管上显示的数字uchar Digits_of_6DSY=
9、0,0,0,0,0,0;uchar Count;sbit Dot=P07; uchar i,j; P3=0xff; /计数器T0方式1 /50ms定时 j=0x7f; /显示Digits_of_6DSY5Digits_of_6DSY0的内容 /前面高位,后面低位,循环中i!=-1亦可写成i!=0xff for j=_crol_ P3=j; P0=DSY_CODEDigits_of_6DSYi;i=1 Dot=1; /加小数点2void Timer0 Digits_of_6DSY0+; /0.1s位累加i /进位处理Digits_of_6DSYi=10 Digits_of_6DSYi=0;=5
10、Digits_of_6DSYi+1+; /如果04位则分别向高一位进位 else break; /若某低位没有进位,怎循环提前结束九、 定时器控制数码管动态显示定时器控制数码管动态显示8个数码管上分两组动态显示年月日与时分秒,本例的 位显示延时用定时器实现。/段码,最后一位是-的段码uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf;/待显示的数据:09-12-25与23-59-58分两组显示uchar code Table_of_Digits8=0,9,10,1,2,10,2,5,2,3,10,
11、5,9,10,5,8;uchar i,j=0;uint t=0; P3=0x80; /位码初值 /计数器T0方式08192-4000 /4ms定时/T0中断函数控制数码管刷新显示void DSY_Show /恢复初值 /输出位码和段码 P0=DSY_CODETable_of_Digitsij; P3=_crol_ j=%8; /数组第i行的下一字节索引+t!=350 /保持刷新一段时间 t=0; i=%2; /数组行i=0时显示年月日,i=1时显示时分秒十、 用定时器设计的门铃用定时器设计的门铃按下按键时蜂鸣器发出叮咚的门铃声。sbit Key=P17;sbit DoorBell=P30;ui
12、nt p=0; DoorBell=0; /T0方式08192-700 /700us定时 Key=0 /按下按键启动定时器 TR0=1; while/T0中断控制点阵屏显示 DoorBell=DoorBell; p+;p /若需要拖长声音,可以调整400和800 TH0= TL0= else if8192-1000 /1ms定时 else TR0=0; p=0;十一、 演奏音阶演奏音阶本例使用定时器演奏一段音阶,播放由K1控制。sbit K1=P10;sbit SPK=P34;uint i=0; /音符索引/14个音符放在方式2下的定时寄存器TH0,TL0uchar code HI_LIST=0
13、,226,229,232,233,236,238,240,241,242,244,245,246,247,248;uchar code LO_LIST=0,4,13,10,20,3,8,6,2,23,5,26,1,4,3;/定时器0中断函数void T0_INT TL0=LO_LISTi; TH0=HI_LISTi; SPK=SPK; /T0方式0 SPK=0; while /未按键等待K1=0 /等待释放i=1;15; /播放一个音符500 /播放延时 TR0=0;50十二、 按键控制定时器选播多段音乐按键控制定时器选播多段音乐本例内置3段音乐,K1可启动停止音乐播放,K2用于选择音乐段。
14、/播放和停止键sbit SPK=P37; /蜂鸣器uchar Song_Index=0,Tone_Index=0; /当前音乐段索引,音符索引/数码管段码表uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/标准音符频率对应的延时表/三段音乐的音符uchar code Song50= 1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1, 3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1, 3,2
15、,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1;/三段音乐的节拍uchar code Len50= 1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1, 1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1, 1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1/外部中断0void EX0_INT TR0=0; /播放结束或者播放中途切换歌曲时停止播放 Song_Index= /跳到下一首的开头 Tone_Index=0; P2=DSY_CODESong_Index; /数码管显示当前音乐段号 TL0=LO_LISTSongSong_IndexTone_Index; TH0=HI_LISTSongSong_IndexTone_Index;