2401_85796067 2024-06-19 13:37 采纳率: 20%
浏览 2

Porteus和Keil,AT89C51

在单片机开发盒上,使用P1.0-P1.7接发光二极管D1D8,单片机 P0.0口接开关
K1,P0.1接K2,编程实现长按K1时,
所有灯光D1
D8闪烁,闪烁周期为1S,松开K1
时,所有灯管熄灭;
当长按K2时,只有D1灯闪烁,闪烁周期400毫秒,其它灯都灭,同
时蜂鸣器报警。延时函数用定时器TO、工作方式1实现。
注:画电路原理图仿真时要有基本的晶振电路、复位电路以及上述功能所包含的电路,并
将相应的原理图、程序及演示视频放到指定的文件夹。

img

img

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-19 13:37
    关注

    引自免费微信小程序:皆我百晓生

    为了实现您描述的功能,我们可以按照以下步骤进行设计与编程:

    第一步:电路设计

    根据您的描述,我们已经有了一个初步的电路设计图。这里,我会简化地描述电路连接方式,因为实际的电路图您已经提供了,不过看起来图1和图2是重复的,所以我们将基于图1进行讨论。

    电路连接概述:

    • 发光二极管 D1-D8 分别连接到 P1.0-P1.7。
    • 开关 K1 连接到 P0.0。
    • 开关 K2 连接到 P0.1。
    • 蜂鸣器 BUZ1 连接到某个 IO 口,这里我们选择 P2.0。

    第二步:编写代码

    使用 Keil C51 编译器,我们编写如下代码:

    #include <reg52.h>
    #include <intrins.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    
    uchar P1State = 0;
    uchar D1State = 0;
    
    void Delay(uint xms);
    void Delay400ms();
    void Timer0_Init();
    void Timer0_ISR(void) interrupt 1 using 1;
    
    void main()
    {
        TMOD = 0x01; // 定时器0 工作模式1
        TH0 = TL0 = (65536 - 10000) / 256;
        TR0 = 1; // 启动定时器0
        EA = 1; // 开总中断
        IT0 = 1; // 设置外部中断0为下降沿触发
        EX0 = 1; // 开启外部中断0
        while(1)
        {
            if(P1State)
            {
                P1 = ~P1State; // 如果P1State为1,则P1全部端口输出取反,即闪烁
            }
            else
            {
                P1 = 0xFF; // 全部端口输出高电平,灯灭
            }
            
            if(D1State)
            {
                P1 = 0xFE; // D1闪烁,其余灯灭
                BUZ1 = !BUZ1; // 蜂鸣器报警
            }
            else
            {
                P1 = 0xFF; // 全部灯灭
                BUZ1 = 0; // 蜂鸣器关闭
            }
        }
    }
    
    void Timer0_ISR()
    {
        static uchar cnt = 0;
        
        if(cnt == 0)
        {
            P1State = !P1State; // 每隔1秒改变状态
        }
        else if(cnt == 2)
        {
            D1State = !D1State; // 每隔400ms改变状态
        }
        
        if(cnt < 4)
        {
            cnt++;
        }
        else
        {
            cnt = 0;
        }
    }
    
    void Delay(uint xms)
    {
        uchar i,j;
        for(i=0;i<xms;i++)
            for(j=0;j<110;j++);
    }
    
    void Delay400ms()
    {
        Delay(400);
    }
    

    第三步:配置定时器

    main 函数中,初始化定时器0为工作模式1,并设置定时时间为1ms。通过中断服务函数 Timer0_ISR 来控制灯的闪烁频率。

    第四步:测试与调试

    将编译好的代码下载到单片机中,使用示波器或逻辑分析仪检查各个IO口的状态变化,确保功能正常。

    注意事项

    • 确保电源电压正确,一般为5V。
    • 检查所有连接是否正确,特别是开关和二极管的极性。
    • 调试时,可以先不使用定时器,直接使用延时函数来测试功能是否正常。

    这样,您应该能够实现描述中的功能。如果有任何问题,欢迎继续提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月19日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 Hadoop集群部署启动Hadoop时碰到问题
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 QTableWidget重绘程序崩溃
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站