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

我学AI8051

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-05-01 07:09:37
已绑定手机

1

主题

43

回帖

233

积分

中级会员

积分
233
发表于 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访问 EAXFR  XFR(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();}
                //不停电下载模板
        }
}
完成课后作业


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-05-01 07:09:37
已绑定手机

1

主题

43

回帖

233

积分

中级会员

积分
233
发表于 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接口

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-05-01 07:09:37
已绑定手机

1

主题

43

回帖

233

积分

中级会员

积分
233
发表于 2025-2-19 18:55:14 | 显示全部楼层
第七集 定时器中断
看了视频,试一下脱离样本编程.
感悟:
之前有固定映象:初始化只能是开机后只能初始化一次,
其实这些设备的寄存器可以随时地,任意地改变.多次初始化就行了.
但是定时器0中断函数只能1个吗?        (这个有待确认哪位大神能告诉我一下当然更感激了.)
[url=]定时器.mp4[/url]

定时器.mp4

11.56 MB, 下载次数: 23

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-05-01 07:09:37
已绑定手机

1

主题

43

回帖

233

积分

中级会员

积分
233
发表于 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访问 EAXFR  XFR(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中断
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-05-01 07:09:37
已绑定手机

1

主题

43

回帖

233

积分

中级会员

积分
233
发表于 2025-2-19 19:31:43 | 显示全部楼层
有没有大神点评一下上面的代码.学习一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-05-01 07:09:37
已绑定手机

1

主题

43

回帖

233

积分

中级会员

积分
233
发表于 2025-2-19 20:25:14 | 显示全部楼层
这个USB库函数真是大有乾坤.
数码管,LED屏......
有趣!真是有趣!!!!!
stc32_stc8_usb.h里有函数定义.
哪里还有详细讲解呢?
截图202502192027514539.jpg

截图202502192026033139.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-05-01 07:09:37
已绑定手机

1

主题

43

回帖

233

积分

中级会员

积分
233
发表于 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[8]
                        cod[0] = 0x3f|0x80;                        //或0x80加小数点
                        cod[1] = 0x06;
                        cod[2] = 0x5b;
                        cod[3] = 0x0;                                //0x00空格
                        cod[4] = 0x66;
                        cod[5] = 0x6d;
                        cod[6] = 0x71;
                        cod[7] = 0x71;
                        SEG7_ShowCode(cod);                        //用段码显示

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:108
  • 最近打卡:2025-05-01 08:20:47
已绑定手机

1

主题

63

回帖

521

积分

高级会员

积分
521
发表于 2025-2-20 08:26:55 | 显示全部楼层
必须点赞
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:381
  • 最近打卡:2025-05-01 08:27:28
已绑定手机

10

主题

146

回帖

458

积分

中级会员

积分
458
发表于 2025-2-20 08:35:11 | 显示全部楼层
加油
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-05-01 07:09:37
已绑定手机

1

主题

43

回帖

233

积分

中级会员

积分
233
发表于 2025-2-20 09:10:50 | 显示全部楼层

有了大神的肯定,必须加油
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:30 , Processed in 0.186024 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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