通过单片机中断系统利用定时器0完成,定时1~9秒时流水灯循环左移动,定时10~19到流水灯循环右移,定时大于等于20秒时灯全亮 P0---------J4 实验代码: #include<reg52.h> // 头文件 #include<intrins.h> // 头文件 #define uchar unsigned char// 替换变量 uint count=0;//定义全局变量 uchar a; uint i; void mDelay(uint Delay)//将函数延时 { ?? ?for(;Delay>0;Delay--)//开始循环从>0时开始自减 ?? ?for(i=0;i<110;i++);//延长循环时间 } void main() { ?? ?TMOD=0x00;//配置定时器,定时器为0,工作方式为0 ?? ?TH0=(8192-5000)/32;//定5ms 高8位 ?? ?TL0=(8192-5000)%32;//定5ms 低5位 ?? ?EA=1;//允许中断总控制 ?? ?ET0=1;//允许中断定时器 ?? ?TR0=1;//开始循环 ?? ?while(1) ?? ?{ ?? ?;//等待5ms后中断子程序 ?? ?} } void to() interrupt 1 { ?? ?TH0=(8192-5000)/32;//定时器清零 ?? ?TL0=(8192-5000)%32; ?? ?count++;//记录子程序的次数 ?? ?if(count>=200&&count<=1800)//如果次数在200次到1800次之间说明到了1~9秒 ?? ?{ ?? ??? ?a=0xfe; ?? ??? ?for(i=0;i<8;i++)//实现8只流水灯的循环 ?? ??? ?{ ?? ??? ??? ?P1=_crol_(a,1);//实现流水灯向左一次流水点亮 ?? ??? ??? ?a=P1; ?? ??? ??? ?mDelay(10);//流水灯延时10ms ?? ??? ?} ?? ?} ?? ?if(count>2000&&count<3800)// 如果次数在2000次到3800次之间说明到了10~19秒?? ?{ ?? ??? ?for(i=0;i<8;i++)//实现8只流水灯的循环?? ??? ? { ?? ??? ??? ?P1=_cror_(a,1);// 实现流水灯向左一次流水点亮 ?? ??? ??? ?a=P1;
?? ??? ??? ?mDelay(10);// 流水灯延时10ms ?? ??? ?} ?? ?} ?? ?if(count>=4000)// 如果次数大于3800次说明时间大于等于20秒?? ?{ ?? ??? ?P1=0x00;//流水灯全亮 ?? ?} } 0现象描述:核心板闪烁周期为1s,P1.1引脚输出90-112Hz的窄脉冲 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit LED = P1 ^ 0; sbit OUTPIN = P1 ^ 1; uchar T_Count = 0; void main() { ? ? TMOD = 0x00; //定时器0 工作方式0 ? ? TH0 = (8192 - 5000) / 32; //5ms 定时 ? ? TL0 = (8192 - 5000) % 32; ? ? IE = 0x82; //允许T0 中断 ? ? TR0 = 1; ? ? while(1);?? ?//等待中断 }
void LED_Flash() interrupt 1 { ? ? TH0 = (8192 - 5000) / 32; //恢复定时初值 ? ? TL0 = (8192 - 5000) % 32; ?? ? ?OUTPIN = ~OUTPIN; ? ? T_Count++; ? ? if(T_Count >= 200) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//如果到了200次,说明1s到了 ? ? { ? ? ? ? T_Count = 0; ? ? ? ? ? ? ? ? ? ? ? ??? ??? ??? ??? ?// 然后把T_Count清0重新再计200次 ? ? ? ? LED = ~LED; ? ? ? ? ? ? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//让核心板LED取反 ? ? } } 1核心板LED闪烁周期为50ms,建议使用示波器观察P1^0输出的方波信号 #include <reg51.h> ? ? ? #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit LED = P1^0; uchar T_Count = 0; void main() { ?? ?uchar T_Count = 0; ?? ?TMOD = 0x01; //定时器0 工作方式1 ?? ?TH0 = (65536 - 50000) / 256; //50ms 定时 ?? ?TL0 = (65536 - 50000) % 256; ?? ?IE = 0x82; //允许T0 中断 ?? ?TR0 = 1; ?? ?while(1); } //T0 中断函数 void LED_Flash() interrupt 1 { ?? ?TH0 = (65536 - 50000) / 256; //恢复初值 ?? ?TL0 = (65536 - 50000) % 256; ?? ?LED = ~LED;
}
P0---------J4 2现象描述:LED1闪烁周期为250ms,建议使用数字存储示波器观察P1.0输出的脉冲 #include <reg52.h> ? ? #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit LED = P1^0; sbit OUTPIN = P1^1; uint T_Count = 0; void main() { ?? ?uchar T_Count = 0; ?? ?//定时器0 工作方式2 ?? ?TMOD = 0x02;? ?? ??? ?//250us 定时 ?? ?TH0 = 256 - 250;? ?? ?TL0 = 256 - 250; ?? ?IE = 0x82; //允许T0 中断 ?? ?TR0 = 1; ?? ?while(1); } //T0 中断函数 void LED_Flash() interrupt 1 { ?T_Count++; ?? ?OUTPIN =~OUTPIN ; ? ? if(T_Count >= 1000) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//如果到了1000次,说明250ms到了 ? ? { ? ? ? ? T_Count = 0; ? ? ? ? ? ? ? ? ? ? ? ??? ??? ??? ??? ?// 然后把T_Count清0重新再计200次 ? ? ? ? LED = ~LED; ? ? ? ? ? ? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//让核心板LED取反 ? ? } }
|