// P1.0接开关K1,P1.1接开关K2,P2.0接LED1,P2.1接LED2,实现:
// 1. K1合上时LED1亮0.5秒周期闪烁,LED2按1秒闪烁;K断开时,两个都按0.1秒闪烁
// 2. K2合上时执行1动作,K2断开时LED常亮 // 硬件:K合上读到低电平(0),输出低电平LED亮
#include
sbit K1=P1^0;sbit K2=P1^1; sbit LED1=P2^0;sbit LED2=P2^1; void main() {
TMOD=0X01; TH0=236; TL0=120;// 5ms (65536-5000)/256;(65536-5000)%6 TR0=1;ET0=1;EA=1; while(1); }
void T0_ISR() interrupt 1 // 0.005秒执行一次 {
static char c1=0,c2=0; // 两个LED闪烁周期计数器 char m1,m2; // 电平改变的时间(5ms的倍数) if(K1==0) {m1=50;m2=100;} else {m1=10;m2=10;} if(++c1==m1) { c1=0; if(K2==0) LED1=!LED1; else LED1=0; }
if(++c2==m2) { c2=0; if(K2==0) LED2=!LED2; else LED2=0; }
TH0=236; TL0=120; // 重装初值 }
// 整点报时,响铃10秒停,P1.0接蜂鸣器,低电平响铃,高电平不响铃
#include
sbit beep=P1^0; char hour,min,sec,tenms; void main() {
hour=0;min=0;sec=0;tenms=0;
TMOD=0X10; TH1=216; TL1=240;// 10毫秒,(65536-10000)/256;(65536-10000)%6 TR1=1;ET1=1;EA=1; while(1) { beep = !( hour==0 && min==0 && (0<=sec && sec<=10) ); // 响铃条件 // 下面大括号为打铃器 { bit a; a = ( hour==8 && min==0 && (0<=sec && sec<=20) ); a = a || ( hour==8 && min==0 && (0<=sec && sec<=20) ); a = a || ( hour==8 && min==45 && (0<=sec && sec<=20) ); a = a || ( hour==8 && min==50 && (0<=sec && sec<=20) ); a = a || ( hour==9 && min==35 && (0<=sec && sec<=20) ); a = a || ( hour==9 && min==50 && (0<=sec && sec<=20) ); ... beep = !a; } } }
void T0_ISR() interrupt 1 // 0.01秒执行一次 {
if(++tenms==100) { tenms=0; if(++sec==60) { sec=0; if(++min==60) { min=0; if(++hour==24) hour=0; } } }
TH1=216; TL1=240; // 重装初值 }
// 双机通信,A机片内RAM30H~3FH的数据块通过串行口传送到B机的片内RAM40H~4FH中,12MHz晶振,为确保传输正确,B机应先开机 // A机程序
#include
unsigned char data *p,i;
SCON = 0x40; PCON=0x00; TMOD=0x20; TH1=230; TL1=230; TR1=1;// 1200bps p=0x30;
for(i=0;i<16;i++) { SBUF=*(p+i); while(TI==0); TI=0; }
while(1); }
// B机程序
#include
unsigned char data *p,i;
SCON = 0x50; PCON=0x00; TMOD=0x20; TH1=230; TL1=230;TR1=1;// 1200bps
p=0x40;i=0; while(i<16) { while(RI==0); *(p+i)=SBUF; RI=0; i++; } }