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

阅读: 评论:0

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

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

本文发布于:2024-02-04 08:42:49,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170703368654063.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23