scpcw 发表于 2025-2-18 20:17:21

第六集 I/O输入输出
学会了注释批量TAB(按住ALT向下拖鼠标选择)
了解AI8051的常设置参数
         EAXFR = 1;      //EAXFR(使能(EA Enable )扩展寄存器XFR访问 )XFR(Xtension Function Register 扩展功能寄存器) SFR(Special Function Register特殊功能寄存器)

      WTST = 0;      //程序读取等待控制寄存器WTST(Wait State)
      CKCON = 0;      //片内MCU扩展RAM数据总线时钟控制寄存器CKCON (Clock Control)
能把这几个寄存器名字记下最好
#include "ai8051u.h"                        //调用头文件


//不停电下载模板
#include "stc32_stc8_usb.h"                //调用头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
//不停电下载模板




//全局变量-----------------------
      //bit lamp1=1;
      unsigned char lamp1=0xff;
      
      
      
//-------------------------------


void Delay20ms(void)      //@40.000MHz
{
      unsigned char data i, j, k;


      i = 5;
      j = 15;
      k = 240;
      do
      {
                do
                {
                        while (--k);
                } while (--j);
      } while (--i);
}






void main(void)
{


      
      
      
      EAXFR = 1;      //使能(EA Enable )扩展寄存器XFR访问 EAXFRXFR(xtension Function Register 扩展功能寄存器) SFR(Special Function Register特殊功能寄存器)
      WTST = 0;      //程序读取等待控制寄存器WTST(Wait State)
      CKCON = 0;      //片内MCU扩展RAM数据总线时钟控制寄存器CKCON (Clock Control)
                        
    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中断
    EA = 1;                                                                                        //IE |= 0X80;
      while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
      //不停电下载模板




      while(1)
      {
                if (P32 == 0)
                {
                        Delay20ms();
                        if (P32 == 0 )                              
                        {
                              if(lamp1 != 0)                //如果灯不为0,不全亮
                              {
                                        lamp1=lamp1<<1;                              
                              }
                              else
                              {
                                        lamp1=0xff;
                                       
                              }
                              
                        }
                        while(~P32);                              //等待松按钮
                }
               
               
                if (P33 == 0)                              //P33关灯
                {
                        Delay20ms();
                        if (P33 == 0)
                        {
                              lamp1=0xff;                              
                        }
                        
                }
                P2=lamp1;                //按值亮灯
                        


               
                //不停电下载模板
                if (bUsbOutReady){                                                
                USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                usb_OUT_done();}
                //不停电下载模板
      }
}
完成课后作业


scpcw 发表于 2025-2-19 08:14:44

07SEGS...aaa
.07SEGS...aaa
.07SEGS...aaa
.07SEGS...aaa
我的printf("aaa\r\n") ;怎么接收到的前后加了一些字符???



//使用串口“printf”打印信息需屏蔽以下两个定义
//#define PRINTF_SEGLED         //printf输出重定向到ISP下载软件中的7段数码管
#define PRINTF_HID            //printf输出直接重定向到USB HID接口

找了原因了:两条指令只用打开一条就行了,第一条是数码管用的,第二条是串口用的

scpcw 发表于 2025-2-19 18:55:14

第七集 定时器中断
看了视频,试一下脱离样本编程.
感悟:
之前有固定映象:初始化只能是开机后只能初始化一次,
其实这些设备的寄存器可以随时地,任意地改变.多次初始化就行了.
但是定时器0中断函数只能1个吗?      (这个有待确认哪位大神能告诉我一下当然更感激了.)
定时器.mp4

scpcw 发表于 2025-2-19 19:30:44

#include "ai8051u.h"                        //调用头文件

//不停电下载模板
#include "stc32_stc8_usb.h"                //调用头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
//不停电下载模板


//下面是全局变量-----------------------
        bit single_double=0;
        unsigned char GongDe=0x0;
       
       
       
//下面是函数定义-------------------------------
void Timer0_1S_Init(void);                //1秒@40.000MHz
void Timer0_2S_Init(void);                //1秒@40.000MHz
       

void Delay20ms(void)        //@40.000MHz
{
        unsigned char data i, j, k;

        i = 5;
        j = 15;
        k = 240;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}



void main(void)
{
       
        EAXFR = 1;        //使能(EA Enable )扩展寄存器XFR访问 EAXFRXFR(xtension Function Register 扩展功能寄存器) SFR(Special Function Register特殊功能寄存器)
        WTST = 0;        //程序读取等待控制寄存器WTST(Wait State)
        CKCON = 0;        //片内MCU扩展RAM数据总线时钟控制寄存器CKCON (Clock Control)
                       
    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中断
    EA = 1;                                                                                        //IE |= 0X80;
        if (DeviceState != DEVSTATE_CONFIGURED)Delay20ms();   //等待USB完成配置
        //不停电下载模板


        while(1)
        {
                if (P32 == 0)
                {
                        Delay20ms();
                        if (P32 == 0 )                               
                        {
                                single_double=~single_double;
                               
                                if(single_double)
                                {
                                        printf("双倍功德时间\r\n");
                                }else{
                                        printf("单倍功德时间\r\n");                                               
                                }                               
                        }
                        while(~P32);                                //等待松按钮
                }
               
               
                if (P33 == 0)                               
                {
                        Delay20ms();
                        if (P33 == 0)
                        {
                                if(single_double)                        //根据单双功德初始Timer0
                                {
                                        Timer0_2S_Init();
                                }else{
                                        Timer0_1S_Init();
                                }
                                P20=0;                                                //开灯

                                GongDe=GongDe+(char)single_double + 1;
                                printf("功德+%d当前功德:%d\r\n" , 1+(char)single_double , GongDe);
                        }
                        while(~P33);                                //等待松按钮
                }
                                       

               
//                不停电下载模板
//                if (bUsbOutReady){                                               
//                        USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
//                        printf("测试printf\r\n");
//                        usb_OUT_done();
//                }
//                不停电下载模板
        }
}

void Timer0_Isr(void) interrupt 1
{
        P20=1;
        TR0=0;
}

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


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

scpcw 发表于 2025-2-19 19:31:43

有没有大神点评一下上面的代码.学习一下

scpcw 发表于 2025-2-19 20:25:14

这个USB库函数真是大有乾坤.
数码管,LED屏......
有趣!真是有趣!!!!!
stc32_stc8_usb.h里有函数定义.
哪里还有详细讲解呢?





scpcw 发表于 2025-2-19 23:56:02

   虚拟数码管详解:
SEG7_ShowString("a%d b%d", (char)single_double+1,GongDe);   //用printf的格式化参数
SEG7_ShowLong(GongDe,16);                              //用16进制显示

SEG7_ShowFloat(3.14159);                     //显示小数



                     byte cod
                        cod = 0x3f|0x80;                        //或0x80加小数点
                        cod = 0x06;
                        cod = 0x5b;
                        cod = 0x0;                              //0x00空格
                        cod = 0x66;
                        cod = 0x6d;
                        cod = 0x71;
                        cod = 0x71;
                        SEG7_ShowCode(cod);                        //用段码显示

tianjing818 发表于 2025-2-20 08:26:55

必须点赞

zhaoye818 发表于 2025-2-20 08:35:11

{:qiang:}加油

scpcw 发表于 2025-2-20 09:10:50

zhaoye818 发表于 2025-2-20 08:35
加油

有了大神的肯定,必须加油{:guzhang:}
页: 1 [2] 3 4 5 6
查看完整版本: 我学AI8051U | 确实是实战派,建议送强大的 AI8051U实验箱