第三题通过单片机中断系统利用定时器0完成,定时1~9秒时流水灯循环左移动,定时10~19到流水灯循环右移,定时大于等于20秒时灯全亮

通过单片机中断系统利用定时器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取反
    }
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值