找回密码
 立即注册
楼主: htmwldex

学习Ai 8051 U 第一天

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2026-01-02 14:48:10
已绑定手机

16

主题

42

回帖

221

积分

中级会员

积分
221
发表于 2025-12-23 14:08:35 | 显示全部楼层
学习Ai 8051 U 第⑩天,打卡<第7集定时器>

##关于printfusb()的使用及USB库配置问题
各位大佬,我现在又遇到这个.lib的问题,之前用着还好,没报错,是不是我那个强制转义符不能用(int)
或者(u18),后面这部分代码跟着师傅教程做的,前面是自己码的都没问题,注释掉了

这一部分不知道哪里又出错了
截图202512231406538124.jpg

“解决途径”:
加了两个lib,冲突了,去掉一个,前面USBcdc板块应该把HID那部分注释掉(在.h文件里面)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2026-01-02 14:48:10
已绑定手机

16

主题

42

回帖

221

积分

中级会员

积分
221
发表于 2025-12-23 14:11:50 | 显示全部楼层
学习Ai 8051 U 第⑩天,打卡<第⑧集定时器>

#今天学到了挺多,不懂得的,自己去搜语法错误的地方
希望我的学习过程能够帮助道后面刚接触的同学,毕竟后来者居上嘛,共勉之。
过程: 截图202512231409385556.jpg


1.关于课后作业,第一条完成了
源码:

演示成果
2.第二个课后作业借助了switch语句,但是尝试复位发现,没法返回清零,只能停留在8个灯全亮



演示:



截图202512231409548044.jpg
截图202512231410223533.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2026-01-02 14:48:10
已绑定手机

16

主题

42

回帖

221

积分

中级会员

积分
221
发表于 2025-12-23 14:14:15 | 显示全部楼层
打卡擎天柱 第⑧集:周期性任务章节

代码:#include "config.h"

/*
        流水灯采用8位
        led0——————————led7
        011111111

                        采用按位取反的模式
*/



#define u8 unsigned char         //8未无符号字符(255)
#define u16 unsigned int         //16位无符号字符(65586)

u8 state1 = 0;                        //初始状态
u8 state2 = 0;                        //初始状态
u8 state3 = 0;                        //LED3初始状态
u16 Count_300 = 0;        //300毫秒的变量
u16 Count_600 = 0;        //600毫秒的变量
u16 Count_900 = 0;        //900毫秒的变量

                                        //引入数组的概念
                                        //变量名 [数量]={,,,,}第一个为索引值。
//eg
u8 State[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                                        //即state中存入3个变量数据,分别为1,2,3
u16 Count_ms[3]= {0,0,0};//三个计时变量,不影响主函数的功能
u8 i;
u8 num = 0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD = "@STCISP#";                                        //命令参数

                                                        //按键检测

//关于按键检测这一块,一般电源VDD如果是5v的输入,那么各个引脚的IO口的高电平最多为5.8v
//也就是相当于在原基础上多0.3.v
//常见的VDD为5或者3,各个引脚为5.3v--3.3v


//另外施密特触发,ai8051手册有介绍,有无打开会影响各个引脚的具体电压
//一般用  ==    来检测按键的电平状态


void Delay20ms(void)        //@11.0592MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 55294UL;
        while (i) i--;
}



void Delay10us(void)        //@24.000MHz
{
        unsigned char data i;

        _nop_();
        _nop_();
        i = 57;
        while (--i);
}


void main(void)
{

                                        //只执行一次的
        P40 = 0;                //灯的开关
        Sys_init();                //函数的调用,系统初始化
    usb_init();          //USB CDC 接口配置,初始化的过程
        Timer0_Init();        //调用定时中断
        IE2 |= 0x80 ;
        EA = 1 ;
       
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
        while(1)                                           //Wwhile走一圈为一个循环,可以先试用查询函数Library-USB
        {
                if (bUsbOutReady)
        {
                       
                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)  
//                for(i=0;i<3;i++)
//                {
//                        printf("当前state的值为:%d\r\n",(int)state);
//                }                                                                        //完成测试代码
//                        printf("state的第一个值为%d\r\n",(int)state[0]);
//                        printf("Count的一个值为%d\r\n",(int)Count[2]);//测试数据 的读
//                        printf("state的最后一个值为%d\r\n",(int)state[2]);//测试数据 的读取
//               
            usb_OUT_done();
                }
                //流水灯的实验效果
                if(Count_ms[0] >= 200)
                {
                        Count_ms[0] = 0;
                       
                        P2= ~State[ num ];                        //控制P0端口的所有灯,同时num的取值只有0-7
                        num ++;
                        if(num > 7)
                        num = 0;
                        //
                }
       
                }

               
               

//                if(Count_300 >= 300)
//        {
//                state1 =! state1;
//                P20 = state1;
//                Count_300 = 0;
//                //LED取反一次
//        }
//                if(Count_600 >= 600)
//        {
//                state2 =! state2;
//                P21 = state2;
//                Count_600 = 0;
//                //LED2取反一次
//        }        if(Count_900 >= 900)
//        {
//                state3 =! state3;
//                P22 = state3;
//                Count_900 = 0;
//                //LED3取反一次
//        }
                        }                                                        //以中括号为准


void Timer0_Isr(void) interrupt 1                //1MS执行一次
{
        for(i=0;i<3;i++)
        Count_ms++;
//        {
//                if(Count_ms[0] >= 300)
//                {
//                        state1 =! state1;
//                        Count_ms[0] = 0;
//                        P20 = state1;
//                }
//                if(Count_ms[0] >= 600)
//                {
//                        state2 =! state2;
//                        Count_ms[1] = 0;
//                        P21 = state2;
//                }if(Count_ms[0] >= 900)
//                {
//                        state3 =! state3;
//                        Count_ms[2] = 0;
//                        P22 = state3;
//                }
// }
//        Count_300++;                        //周期型任务300ms变量启动,变量达到一定数值,执行某种命令
//        Count_600++;
//        Count_900++;
}


#include "config.h"
/*
                函数定义一般放在.c文件当中,赋值什么的
               

*/
void Sys_init(void)
{
        P_SW2 |= 0x80;                //B7位写1,使能访问XFR,之所以写或,是确保P_SW2后面几位不会全部赋值为0
                                                //相当于把XFR使能端口打开,相较于SFR
                            //简单来讲
                            //SFR:基础特殊功能寄存器(无需使能可直接访问)。(80H-ffH)
                            //XFR:扩展特殊功能寄存器(需要使能位打开才能访问)。(>FFH)
        WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度           
       
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;               
}

void Timer0_Init(void)                //1毫秒@24.000MHz
{
        TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
成果i演示


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2026-01-02 14:48:10
已绑定手机

16

主题

42

回帖

221

积分

中级会员

积分
221
发表于 2025-12-26 21:25:39 | 显示全部楼层
打卡,第十一天:
成果演示:

数码管的显示:

编写过程编译遇到的错误
:①依然是,大小写没有区分导致,分号的使用错误
②有一个问题就是对于16进制的编码是用0x10还是0X10?还是说这样不影响呢?
截图202512262121239047.jpg
③所有程序写完.c中的调用一定要在.h文件中声明,io口的就在io.c中去调用
④做好分类管理,有些函数含参,就不要全部用void去覆盖掉。
截图202512262122508110.jpg
⑤一定要清楚段码和位码的显示规则,分别指,显示数字,和第几位显示。




问题:
①定时器0里面调用的程序有没有上限?为什么视频中讲解的实现的是1s中的数码管显示,但实际中,这个数码管常亮呢?
截图202512262124403750.jpg


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2026-01-02 14:48:10
已绑定手机

16

主题

42

回帖

221

积分

中级会员

积分
221
发表于 2025-12-31 21:36:28 | 显示全部楼层
打卡《矩阵按键》

##今天编写过程中发现并解决了一个代码顺序的问题,
截图202512312132209065.jpg

导致出现这种问题:


原因在于没有第一时间把单独按键的功能加在前面。所以出现这种情况

求助:
我编写的代码前面都能正常显示和编译,但是按键按下后,没有反应不知道是哪里的问题,希望论坛大佬给一些解决方案,
代码如下,编译没报错

源代码:


void Task_1(void)                                //后面需要调度这个任务,所以存储io里面
{
        //矩阵按键任务调度的一个板块
                                COL1 = 0;
                            COL2 = 0;
                            COL3 = 0;
                            COL4 = 0;
                            ROW1 = 1;
                            ROW2 = 1;
                        //按键检测
        if((ROW1==0) || (ROW2==0))                        //检测到有按键按下。
        {
                if((ROW1 == 0) && (ROW2==0))        //
                {
                }
                else if (((ROW1 ==1)&&(ROW2 ==0) )|| ((ROW2 ==1)&&(ROW1==0)))
                {
                        if(ROW1 == 0)
                                Key_num = 0;
                        else if(ROW2 == 0)
                                Key_num = 4;
                                COL1 =1;
                            COL2 =1;
                            COL3 =1;
                            COL4 =1;
                            ROW1 =0;
                            ROW2 =0;
               
                if(COL1==0)
                {
//                        key_num = key_num+0;
                }
                else if((COL2==0))
                {
                        Key_num = Key_num+1;
                }
                else if((COL3==0))
                {
                        Key_num = Key_num+2;
                }
                else if((COL4==0))
                {
                        Key_num = Key_num+3;
                }
                }
        }
}




u8 password[8] = {16,16,16,16,16,16,16,16};                //密码锁
u8 SEG_no = 0;
void SEG_Task(void)                                                        //数码管对外显示函数
{

        if(SEG_no == 0)                                                                        //数码管的多端口显示
        {
                Display_Seg(SEG_num[password[0]],~T_num[0]);        //SEG_no指索引的密码的第1位
        }
        else if(SEG_no == 1)
        {
               
                Display_Seg(SEG_num[password[1]],~T_num[1]);        //SEG_no指索引的第零位
        }
        else if(SEG_no == 2)
        {
                Display_Seg(SEG_num[password[2]],~T_num[2]);        //SEG_no指索引的第零位
        }
        else if(SEG_no == 3)
        {
                Display_Seg(SEG_num[password[3]],~T_num[3]);        //SEG_no指索引的第零位
        }
        else if(SEG_no == 4)
        {
               
                Display_Seg(SEG_num[password[4]],~T_num[4]);        //SEG_no指索引的第零位
        }
        else if(SEG_no == 5)
        {
                Display_Seg(SEG_num[password[5]],~T_num[5]);        //SEG_no指索引的第零位
        }
        else if(SEG_no == 6)
        {
                                                                       
                Display_Seg(SEG_num[password[6]],~T_num[6]);        //SEG_no指索引的第零位
        }
        else if(SEG_no == 7)
        {
                Display_Seg(SEG_num[password[7]],~T_num[7]);        //SEG_no指索引的第零位
        }
        else
        {
       
        }
        SEG_no ++;
        if(SEG_no >7 )
          SEG_no = 0;
}

//加一个按键的判断,代表输入进去以后会发生变化
u8 Key_Vol3 = 0;
u8 Key_no = 0;
void PW_write_Task(void)/*利用独立按键的键值去处理,避免一直出现第一个数一直输入*/
{               
        if( Key_num <0xff)                        //如果小于这个数值代表有按钮按下
        {
                Key_Vol3++;
                if( Key_Vol3 == 5)
                {
                        password[Key_no] = Key_num;                //表示按键按下后是第几位引入,key_no
                        Key_no++;
                if(Key_no == 0)
                {
                        password[0]=16;
                        password[1]=16;       
                        password[2]=16;
                        password[3]=16;
                        password[4]=16;
                        password[5]=16;
                        password[6]=16;
                        password[7]=16;
                }
                        if(Key_no==8)
                        {
                                if((password[0]==1) && (password[1]==2) && (password[2]==3)&&(password[3]==4)&&(password[4]==5)&&(password[5]==6)&&(password[6]==7)&&(password[7]==8))
                                {
                                        password[0]=17;
                                        password[1]=17;       
                                        password[2]=17;
                                        password[3]=17;
                                        password[4]=17;
                                        password[5]=17;
                                        password[6]=17;
                                        password[7]=1;
                                }
                                else
                                {
                                        password[0]=16;
                                        password[1]=16;       
                                        password[2]=16;
                                        password[3]=16;
                                        password[4]=16;
                                        password[5]=16;
                                        password[6]=16;
                                        password[7]=16;
                                }
                                Key_no = 0;
                        }
                }
                else
                {
                        Key_Vol3 = 0;
                }
        }
}

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-23 23:08 , Processed in 0.115723 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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