YangHY 发表于 2025-12-18 08:48:43

先学会用ISP里的定时器计算器:

YangHY 发表于 2025-12-18 08:50:29

注意:Ai8051U 有如下选择:

YangHY 发表于 2025-12-18 10:44:45

如何用定时器计算器生成3秒的定时器程序?

要用12T才行哦

顺带把定时器中断函数也勾选上!

YangHY 发表于 2025-12-18 10:52:42

看看生成的代码:

YangHY 发表于 2025-12-18 10:56:57

void Timer0_Init(void)                //3秒@24.000MHz      函数定义
{
      TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0x7F;                        //定时器时钟12T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0x3F;                              //设置定时初始值
      TH0 = 0x01;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
      ET0 = 1;                              //使能定时器0中断
      
      //TM0PS = 91
      //12T               /12
      // THO-TL0 = 319
      
}

void Timer0_Isr(void) interrupt 1                //3秒执行一次
{
      state = !state;               
      
      P00 = state;
      P01 = !state;
}

这样就很好理解,和89C52RC没差别

YangHY 发表于 2025-12-18 11:04:25


完成任务一的代码:

YangHY 发表于 2025-12-18 11:09:19

        int count=1;                                                                        //按键计数变量
       
    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;
       
        usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
        Timer0_Init();                                                                        //定时器初始化
       
    EA = 1;                                                                                        //IE |= 0X80;
       
        P40 = 0;
       
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
       
        while(1)
        {
               
      if (bUsbOutReady)                                                        //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();                                                        //
      }


                //任务1:
                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P32 == 0 )
                        {
                                printf("按键按下次数\xfd:%d 次\r\n",(int)count);
                                count++;
                               
                                while( P32 == 0 );                                        //等待P32松开
                               
                        }
                }

YangHY 发表于 2025-12-18 11:45:00

冲哥详细介绍了printf("按键按下次数\xfd:%d 次\r\n",(int)count);中\xfd的作用



GB2312 中,包含 Oxfd 编码的汉字如下:
褒饼昌除待谍洱俘庚过糊积箭烬君魁例笼慢谬
凝琵讫驱三升数她听妄锡淆旋妖引育札正铸佚
冽邶埤荦蔟摭啐帻猃恺泯潺妪纨琮椠辇挲臊忑
睚铨稞瘕颀螨籪酏觚鳊鼾

另外,Keil项目路径名的字符中也不能含有带0xFD编码的汉字,否则Keil软件会无法正确编译此项目。


YangHY 发表于 2025-12-18 12:05:26

这样就顺利很多:

YangHY 发表于 2025-12-18 13:40:35

定时器需要配置的时钟:
页: 11 12 13 14 15 16 17 18 19 20 [21] 22 23 24 25 26 27 28 29 30
查看完整版本: 第一课 序言《AI8051U的特点》