找回密码
 立即注册
查看: 89|回复: 7

工控中年人 重学单片机打卡

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:341
  • 最近打卡:2026-05-29 21:10:38
已绑定手机

5

主题

13

回帖

1025

积分

金牌会员

积分
1025
发表于 2026-5-14 17:50:50 | 显示全部楼层 |阅读模式
点灯启航

1LED驱动  压降黄色和红色1.8-2.2V压降 绿色、蓝色和白色3-3.2V压降 正常发光电流5-20mA。
2配置了vs code 开发环境 代码补全功能超级给力。
3编写代码 小灯成功点亮。

#include <STC89C5xRC.H>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main(void)
{
    ENLED = 0;//使能点灯
    ADDR0 = 0;//选择LED
    ADDR1 = 1;
    ADDR2 = 1;
    ADDR3 = 1;
   
    while(1)
    {
      P0 = 0xf0;
    }
}



回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:418
  • 最近打卡:2026-05-29 11:30:12

851

主题

1万

回帖

2万

积分

管理员

积分
23300
发表于 2026-5-14 20:20:55 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:341
  • 最近打卡:2026-05-29 21:10:38
已绑定手机

5

主题

13

回帖

1025

积分

金牌会员

积分
1025
发表于 2026-5-15 20:06:28 | 显示全部楼层
今天实现了VS Code 豆包插件辅助写代码。中断方式实现了小灯闪烁。
真的是感受到了科技改变工作方式。
板子Kingst 51
代码如下
#include <STC89C5xRC.H>

//#define unsigned char unsigned int8
//#define unsigned int unsigned int16
//#define unsigned long unsigned int32

void Timer0_Init(void);//初始化定时器0
void En138(char addr);//使能138地址
unsigned int count = 0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
        Timer0_Init();
        P0 = 0x00;

  while(1)
  {
    En138(14);
  
  }
}


void Timer0_Init(void)                //100微秒@11.0592MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xAE;                                //设置定时初始值
        TH0 = 0xFB;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
        EA = 1;                                        //使能总中断
}
void En138(char addr)
{
        ADDR0 = addr & 0x01;
        ADDR1 = addr & 0x02;
        ADDR2 = addr & 0x04;
        ADDR3 = addr & 0x08;
        ENLED = 0;
}
void Timer0_Isr(void) interrupt 1
{
       
   
    TL0 = 0xAE;                    // 重装定时初始值
    TH0 = 0xFB;                    // 重装定时初始值
   
    count++;                       // 每次中断计数器加1
    if(count >= 10000)             // 判断是否达到10000次
    {
        P0 = ~P0;                  // P0取反
        count = 0;                 // 重置计数器
    }
       
}
AI辅助.png
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2026-05-29 21:31:33

2

主题

168

回帖

1064

积分

金牌会员

积分
1064
发表于 2026-5-15 21:01:19 | 显示全部楼层
坚持
学无止境
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:341
  • 最近打卡:2026-05-29 21:10:38
已绑定手机

5

主题

13

回帖

1025

积分

金牌会员

积分
1025
发表于 2026-5-16 18:01:40 | 显示全部楼层
今天完成了动态数码管显示
#include <STC89C5xRC.H>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;  
sbit ENLED = P1^4;
char bled = 0;
// 定时器中断相关变量
unsigned char timer0_count = 0;  // 中断计数器
bit timer0_flag = 0;             // 100次中断标志位
// 函数原型声明
void led(unsigned char state);
void Timer0_Init(void);
long num = 0;
unsigned char i=0;

// 数码管段码表(共阴极,带小数点)
// 0-F的段码,bit0=DP, bit1=a, bit2=b, bit3=c, bit4=d, bit5=e, bit6=f, bit7=g
unsigned char code SEG_TABLE[] = {
    0xC0,  // 0
    0xF9,  // 1
    0xA4,  // 2
    0xB0,  // 3
    0x99,  // 4
    0x92,  // 5
    0x82,  // 6
    0xF8,  // 7
    0x80,  // 8
    0x90,  // 9
    0x88,  // A
    0x83,  // B
    0xC6,  // C
    0xA1,  // D
    0x86,  // E
    0x8E   // F
};

// 显示缓冲区,存放要显示的数字(0-15对应0-F)
unsigned char disp_buf[6] = {0, 1, 2, 3, 4, 5};

// 延时函数
void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}




//LED位函数
void led(unsigned char state)
{
    ADDR0 = state & 0x01;
    ADDR1 = state & 0x02;
    ADDR2 = state & 0x04;
}


void main(void)
{
    ENLED = 0;
    ADDR3 = 1;
    Timer0_Init();  // 初始化定时器0
    EA = 1;         // 开启全局中断
    while(1)
    {
        

        // 检测标志位并处理

        
   
        
        disp_buf[0] = num % 10;
        disp_buf[1] = num / 10 % 10;
        disp_buf[2] = num / 100 % 10;
        disp_buf[3] = num / 1000 % 10;
        disp_buf[4] = num / 10000 % 10;
        disp_buf[5] = num / 100000 % 10;
        
      
    }
   
}
void Timer0_Isr(void) interrupt 1
{
    static int  t1scnt = 0;
    // 重新加载定时器初值
    TL0 = 0xAE;
    TH0 = 0xFB;
   
    // 中断计数
    timer0_count++;
   
    // 每100次中断设置标志位
    if(timer0_count >= 10)
    {
        timer0_count = 0;  // 清零计数器
        timer0_flag = 1;   // 设置标志位
    }
    if(timer0_flag)
   {
        t1scnt++;
        if(t1scnt >= 100)
        {
            t1scnt = 0;
            num++;
        }
        
            timer0_flag = 0;  // 清除标志位
            P2 = 0xFF;//关闭所有数码管
            led(i);
            P0 = SEG_TABLE[disp_buf[i]];
            
            i++;
            if(i>=6)
            {
                i=0;
            }
            
   }
}

void Timer0_Init(void)                //100微秒@11.0592MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xAE;                                //设置定时初始值
        TH0 = 0xFB;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:341
  • 最近打卡:2026-05-29 21:10:38
已绑定手机

5

主题

13

回帖

1025

积分

金牌会员

积分
1025
发表于 2026-5-17 16:47:09 | 显示全部楼层
打卡 今天实现了数码管带小数点和不带小数点区分 通过小数点隔离时分秒

        // 计算秒、分、时
        second=num % 60;
        minute=num / 60 % 60;
        hour=num / 3600 % 24;
        // 显示缓冲区赋值
        disp_buf[0] = second % 10;
        disp_buf[1] = second / 10 % 10;
        disp_buf[2] = minute % 10;
        disp_buf[3] = minute / 10 % 10;
        disp_buf[4] = hour % 10;
        disp_buf[5] = hour / 10 % 10;



            timer0_flag = 0;  // 清除标志位
            P2 = 0xFF;//关闭所有数码管
            led(i);
            // 显示数码管 0-5 分别显示秒、分、时
            if(i%2==0)
            {
                P0 = SEG_TABLE_DP[disp_buf];
            }
            else
            {
                P0 = SEG_TABLE[disp_buf];
            }   
            
            i++;
            if(i>=6)
            {
                i=0;
        }




回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:341
  • 最近打卡:2026-05-29 21:10:38
已绑定手机

5

主题

13

回帖

1025

积分

金牌会员

积分
1025
发表于 2026-5-19 22:12:59 | 显示全部楼层
今天尝试了冲哥STC32G144K246核心板 ,成功点亮小灯。
但是在VScode的C文件中.H文件一直报错。
EIDE中打不开C251的工程。
安装了一个名为STC32G12K128的插件 插件描述支持C251环境 。尝试了一下也没有成功。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:341
  • 最近打卡:2026-05-29 21:10:38
已绑定手机

5

主题

13

回帖

1025

积分

金牌会员

积分
1025
发表于 昨天 21:50 | 显示全部楼层
今天测试AI8052U碰到了一个新的知识盲区。P8以后的IO口的定义方式好像不一样了。明天实际测试一下硬件
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-30 04:44 , Processed in 0.110899 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表