找回密码
 立即注册
查看: 767|回复: 1

跟冲哥学习32位8051单片机STC32G系列更新学习至第16集

[复制链接]
  • TA的每日心情
    开心
    2024-4-2 06:00
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    6

    主题

    17

    回帖

    218

    积分

    中级会员

    积分
    218
    发表于 2023-4-19 15:21:50 来自手机 | 显示全部楼层 |阅读模式
    本帖最后由 yhf3721 于 2023-6-20 11:29 编辑

    第一集知道什么是单片机,以及单片机的用途。stc32g单片机是目前最强大单片机,是32位8051单片机。
    074824yvjie8cltty5p5h5.jpg

    第二集认识stc32g实验箱的各大模块和作用。


    第三搭建编译开发环境
    学习一款单片机,最重要的是首先要看单片机手册,了解跟其它单片机的区别及注意事项。下载安装stc isp工具。
    stc32g单片机要安装keil c251编译器,hex输出格
    式选择hex386。
    IMG_20230430_194609R.jpg

    第四集建立工程点亮led

    /*****************************
    点亮led
    *******************************/
    #include <STC32G.H> //调用头文件
    sbit P00=P0^0;   //选择p0.0引脚
    void main()  //主函数
    {
    P0M0=0x00;  //设置P0口端口为准双向口模式
    P0M1=0x00;
    while(1)    //死循环
    {
    P00=0;   //输出低电平
    }
    }



    usb不停电下载程序
    usb hid和usb cdc两种模式
    跟冲哥学习32位8051单片机STC32G系列-1.png
    跟冲哥学习32位8051单片机STC32G系列-1.png
    usb cdc不停电下载程序
    跟冲哥学习32位8051单片机STC32G系列-1.png
    usb hid模式不停电下载程序
    跟冲哥学习32位8051单片机STC32G系列-1.png



    第五集c语言运算符和进制转换入门
    printf函数的格式字符和转义符使用
    主函数添加程序:

    if(DeviceState!=DEVSTATE_CONFIGURED)
            continuFe;
                    if(bUsbOutReady)
                    {
                            usb_OUT_done();
                    }
    常规用法:
    printf("hoello world!");
    printf("室内湿度:%.2f\r\n",26.5);

    c语言运算符(算术运算符,位运算符,赋值运算符)
    进制转换(二进制,十进制,十六进制)




    第六集led点亮和花式闪烁
    函数的使用三步:定义,声明,调用
    学会delay延时函数
    void delay_ms(u16 ms);//前部声明

    void delay_ms(u16 ms)//延时函数定义

    if(DeviceState!=DEVSTATE_CONFIGURED)
            continuFe;
                    if(bUsbOutReady)
                    {
                            usb_OUT_done();
                    }
    void main()
    {
    ............
    delay_ms(100);
    }
    while,do while循环函数

    while()
    {
    .........
    }

    do{
    ........
    }
    while();

    #define 名称 需要定义的内容

    模块化编程
    xxx.h格式
    #ifndef__XXX_H
    #define__XXX_H
    调用头文件
    函数声明
    #endif

    xxx.c格式
    #inclde "xxx.h"
    函数定义


    第七集按键点灯
    按键防抖使用延时10-20ms再次检测

    if(KEY==0)
    {
    delay_ms(10);
    if(KEY==0)
    {
    执行功能
    }
    }


    位左移<< ,位右移>>


    数组的定义:类型 名称[长度]={数值}
    赋值: 名称[索引]=数值



    第八集蜂鸣器的应用
    有源蜂鸣器和无源蜂鸣器区别内部有无震荡源.
    有源蜂鸣器两脚接直流电就会发声.
    屏幕截图 2023-05-06 131218.png

    Screenshot_20230507-220714~2.png
    上图划线部分语句,视频教程教程中讲解不够详细。我的理解:p6=~(1<<(run_mode-1))
    run_mode初值是0,
    key2按第一次,p6=~(1<<(1-1)   0000 0001<<0位,
    0000 0001  取反 1111 1110

    key2按第二次,p6=~(1<<(2-1)   0000 0001<<1位,
    0000 0010 取反 1111 1101

    key3按第三次,p6=~(1<<(3-1)  0000 0001<<2位,
    0000 0100 取反  1111 1011



    第九集数码管静态显示

    数码管有共阴和共阳之分。
    7段,8段,米字型。1位,2位,3位,4位等。
    数码管的内码(段码)用一般用16位数表示,放在数组中方便调用。

    屠龙刀核心板没有蜂鸣器可以led代替,没有数码管外设,数码管动静态只能理论,不能实践。
    不知什么时候才能获得实验箱,好期待呀。

    u8 num=0;
       u8 SEG_Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴数码管 0~9段码
    一位数码管显示0-9
       void main()
    {
    while(1)
    {
       p70=0;
        p6= SEG_Tab[num];
       num++;
       if(num>9)
       num=0;
       delay(100);
       }
    }




    第十集数码管动态显示
    数码管动态显示原理是人眼不容易分辨50hz以上刷新率,延时时间不大于20ms。

    8位数码管
    段码数组,位码数组。
    新建数组保存每位要显示的内容。

    10秒免单
    u8 SEG_Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴数码管 0~9段码
    u8 COM_Tab[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//0~7位码
    u8 Show_Tab[8]={1,2,3,4,5,6,7,8} ;  //每位要显示的内容
    bit run_state=0;
    void main()
    {
    while(1)
    {
            SEG_Fre();
        if(run_state==1)
        {
            temp++;
            if(temp>9999)
            temp=0;     
        }
        if(key1==0)
        {
            delay(10);
            if(key1==0)
            {
            beep=0;
            delay(10);
            beep=1;
            if(run_state==0)
              temp=0;
            run_state=!run_state;
            }
            while(key1==0)   
          {
           SEG_Fre();
           }
        }
      }      

    void SEG_Fre( void )

    {
          Show_Tab[0]  = 1;                //选择 1
            Show_Tab[1]  = 10;                //选择 0.
            Show_Tab[2]  = 0;                //选择 0
            Show_Tab[3]  = 0;                //选择 0       
            Show_Tab[4]=temp/1000;
            Show_Tab[5]=temp/100%10+10;
            Show_Tab[6]=temp/10%10;
            Show_Tab[7]=temp%10;
            //位码选择第一位,段码选择0  
            P7 = COM_Tab[num];                        //位码的选择
            P6 = SEG_Tab[Show_Tab[num]];
            //需要显示的数字的内码 赋给 P6   NUM =0 -> Show_Tab[num]] = 1 -> p6 = oxF9
            delay(1);
        P6=0xff;
            num++;
            if( num >7 )
                    num = 0;       
        }
    }
    }

    void delay(u16 ms)        //unsigned int

    {

            u16 i;
            do
            {
                    i = MAIN_Fosc/6000;
                    while(--i);
            }while(--ms);
    }
    第十一集定时器使用
    定时/计时器T/C,有定时和计数功能,stc32g有5个24位定时/计数器。
    定时器较常用





    简易时钟
    #ininclude<stc32g.h >



    typedef unsigned char uint8;
    typedef unsigned int uint16;
    typedef unsigned long uint32;

    typedef signed char int8;
    typedef signed int int16;
    typedef signed long int;

    u8 COM_Tab[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//0
    uint8 SEG_Tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
    uint8 Show_Tab[8]={0,0,10,0,0,10,0,0};



    uint16 temp,num;
    uint16 hour,min,sec;  //时间时分秒计数



    sbit beep=P1^5;



    void Show_time();//时间显示函数

    void main()
    {
        // set T0 1ms  12t
       
            TMOD = 0x00;           //设置定时器模式
            TH0 = (65536-2000)/256;//设置定时初始值
            TL0 = (65536-2000)%256;//设置定时初始值
            TF0 = 0;                                //清除TF0标志
            TR0 = 1;                                //定时器0开始计时
            ET0 = 1;                                //使能定时器0中断
            EA=1;
            
        while (1)
        {
       
        Show_time();
            
        if((hour==0)&&(min==0)&&(sec==30))
        //判断当前时间与闹钟是否一致
        {
        beep=0;
        while(10);
        beep=1;
        }
        }
    }


        void Show_time()
    {
          Show_Tab[0]=hour/10;
           Show_Tab[1]=hour%10;
            Show_Tab[2]=10;
           Show_Tab[3]=min/10;
           Show_Tab[4]=min%10;
            Show_Tab[5]=10;
           Show_Tab[6]=sec/10;
           Show_Tab[7]=sec%10;


            p7=COM_Tab[num];
            P6=SEG_Tab[Show_Tab[num]];
            num++;
            if(num>7)
             num=0;
    }




        void Timer0_Isr(void) interrupt 1
    {
        temp++;         
          if(temp>=1000)
          {
            temp=0;
            sec++;
          }
            if(sec>=60)
            {
                sec=0;
                min++;
            }
            if(min>=60)
                {
                min=0;
                hour++;
                }
        if (hour>=24)
           hour=0;  
        }

    第十二集计数器使用
    计数器用来对外部脉冲的数量进行计数,广泛用来计量转速,流速等动量。

    用按键t1模拟外部脉冲信号
    #define key4 p35(T1脚)
    void main()
    {
           TMOD = 0x40;                //设置T1计数器模式
            TL1 = 0xFF;                        //设置T1计数初始值
            TH1 = 0xFF;                        //设置T1计数初始值
            TF1 = 0;                                //清除TF1标志
            TR1 = 1;                                //定时器1开始计数
            ET1 = 1;                                //使能定时器1中断
            P3PU = 0x20;                 //打开内部上拉4.1K
            P40 = 0;                //led的电源控制三极管打开

            EA = 1;        //打开总中断。      
    while(1)
    {
    }
    }
    void Timer1_Isr(void) interrupt 3
    {
            P60 = !P60;                                //led取反
    }


    第十三集多任务

    模块化编程 .c  +   .h
    变量函数声明在.h文件



    修饰符extern用在函数和变量的声明前,用来说明此函数和变量在别处已经定义,要在此处引用。函数前修饰符extern可以省略。
    如,a.c要应用b.c中的变量int num,在a.h中声明extern int num在a.c可以直接使用
    extern修饰的变量不能赋初值,在别处已经赋值。

    bdata位寻址变量使用
    a.c

    u8 bdata LED =0x00;
    sbit LED0=LED^0;
    sbit LED0=LED^1;
    sbit LED0=LED^2;
    sbit LED0=LED^3;
    sbit LED0=LED^4;
    sbit LED0=LED^5;
    sbit LED0=LED^6;
    sbit LED0=LED^7;


    a.h

    extern u8 bdata LED;
    extern bit LED0;
    extern bit LED1;
    extern bit LED2;
    extern bit LED3;
    extern bit LED4;
    extern bit LED5;
    extern bit LED6;
    extern bit LED7;

    第十四集矩阵按键


    第十五集外部中断




    第十六集io中断





    第十七集ADC




    第十八集ADC采集电源电压





    第十九集NTC温度采集




    第二十集串口通信





    第二十一集串口应用






    第二十二集CDC串口通信





    第二十三看门狗






    第二十四比较器






    第二十五集FLASH模拟EEprom





    第二十六集ds18b20




    第二十七集软件模拟SPI




    第二十八集硬件SPI




    第二十九集SPI口FLASH




    第三十集软件模拟IIc
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-2 06:00
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    6

    主题

    17

    回帖

    218

    积分

    中级会员

    积分
    218
     楼主| 发表于 2023-4-19 15:49:29 来自手机 | 显示全部楼层
    本帖最后由 yhf3721 于 2023-4-30 19:53 编辑

    留楼待用。
    回复 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-10 20:22 , Processed in 0.069793 second(s), 35 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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