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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-05-01 14:00:37

6

主题

16

回帖

237

积分

中级会员

积分
237
发表于 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
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-05-01 14:00:37

6

主题

16

回帖

237

积分

中级会员

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

留楼待用。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 12:53 , Processed in 0.110205 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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