原创
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
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论