原创 AI8051U跑马灯

2024-12-20 10:18 51 0 分类: 物联网 文集: 博客
//```c
#include "..\..\comm\AI8051U.h"  // 包含头文件,定义了硬件寄存器和常量
#include "stdio.h"              // 标准输入输出库
#include "intrins.h"            // 内联汇编函数库

typedef     unsigned char    u8;   // 定义无符号8位整型别名
typedef     unsigned int    u16;   // 定义无符号16位整型别名
typedef     unsigned long    u32;   // 定义无符号32位长整型别名

#define MAIN_Fosc        24000000UL  // 主频定义为24MHz

u8 code ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  // LED灯的编码数组

u8 ledIndex;  // LED索引变量
u16 msecond;  // 毫秒计数变量

void delay_ms(u8 ms);  // 延时函数声明
void SetWakeUpTime(u16 SetTime);  // 设置唤醒时间函数声明

void main(void)
{
    WTST = 0;  // 关闭看门狗定时器
    EAXFR = 1; // 使能外部访问
    CKCON = 0; // 设置时钟控制寄存器为默认值

    P0M1 = 0x00; P0M0 = 0x00;   // 设置P0口为准双向口
    P1M1 = 0x00; P1M0 = 0x00;   // 设置P1口为准双向口
    P2M1 = 0x00; P2M0 = 0x00;   // 设置P2口为准双向口
    P3M1 = 0x00; P3M0 = 0x00;   // 设置P3口为准双向口
    P4M1 = 0x00; P4M0 = 0x00;   // 设置P4口为准双向口
    P5M1 = 0x00; P5M0 = 0x00;   // 设置P5口为准双向口
    P6M1 = 0x00; P6M0 = 0x00;   // 设置P6口为准双向口
    P7M1 = 0x00; P7M0 = 0x00;   // 设置P7口为准双向口

    SetWakeUpTime(2000);    // 设置唤醒时间为2秒
    P40 = 0;                // 打开LED电源

    while(1)
    {
        delay_ms(100);    // 延时100毫秒

        P0 = ~ledNum[ledIndex];    // 输出当前LED状态
        ledIndex++;                // LED索引递增
        if(ledIndex > 7)           // 如果索引超过7,重置为0
        {
            ledIndex = 0;
        }

        if(++msecond >= 20)        // 如果毫秒计数达到20次(即2秒)
        {
            msecond = 0;           // 重置毫秒计数
            P0 = 0xff;             // 关闭所有LED

            PD = 1;                // 进入睡眠模式
            _nop_();               // 空操作,用于延时
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
    }
}

void SetWakeUpTime(u16 SetTime)
{
    SetTime = (u16)((32768UL * (u32)SetTime) / 16000);  // 计算唤醒时间,单位是32.768kHz的周期数
    if(SetTime > 0) SetTime--;                         // 如果计算结果大于0,减1以补偿误差
    WKTCL = (u8)SetTime;                               // 设置唤醒时间的低字节
    WKTCH = (u8)(SetTime >> 8) | 0x80;                 // 设置唤醒时间的高字节,并设置最高位以启用唤醒功能
}

void delay_ms(u8 ms)
{
    u16 i;
    do{
        i = MAIN_Fosc / 6000;  // 根据主频计算循环次数,实现大约1毫秒的延时
        while(--i);            // 循环等待
    }while(--ms);              // 递减毫秒计数,直到为0
}
//```

作者: 丙丁先生, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3996156.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
0
关闭 站长推荐上一条 /3 下一条