yhf3721 发表于 2023-4-19 15:21:50

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

本帖最后由 yhf3721 于 2023-6-20 11:29 编辑

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


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


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


第四集建立工程点亮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两种模式


usb cdc不停电下载程序

usb hid模式不停电下载程序




第五集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)
{
执行功能
}
}


位左移<< ,位右移>>


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



第八集蜂鸣器的应用
有源蜂鸣器和无源蜂鸣器区别内部有无震荡源.
有源蜂鸣器两脚接直流电就会发声.



上图划线部分语句,视频教程教程中讲解不够详细。我的理解: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={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴数码管 0~9段码
一位数码管显示0-9
   void main()
{
while(1)
{
   p70=0;
    p6= SEG_Tab;
   num++;
   if(num>9)
   num=0;
   delay(100);
   }
}




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

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

10秒免单
u8 SEG_Tab={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴数码管 0~9段码
u8 COM_Tab={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//0~7位码
u8 Show_Tab={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= 1;                //选择 1
        Show_Tab= 10;                //选择 0.
        Show_Tab= 0;                //选择 0
        Show_Tab= 0;                //选择 0       
      Show_Tab=temp/1000;
      Show_Tab=temp/100%10+10;
      Show_Tab=temp/10%10;
      Show_Tab=temp%10;
        //位码选择第一位,段码选择0
        P7 = COM_Tab;                        //位码的选择
        P6 = SEG_Tab];
        //需要显示的数字的内码 赋给 P6   NUM =0 -> Show_Tab] = 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={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//0
uint8 SEG_Tab={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uint8 Show_Tab={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 1ms12t
   
      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=hour/10;
       Show_Tab=hour%10;
      Show_Tab=10;
       Show_Tab=min/10;
       Show_Tab=min%10;
      Show_Tab=10;
       Show_Tab=sec/10;
       Show_Tab=sec%10;


      p7=COM_Tab;
      P6=SEG_Tab];
      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

yhf3721 发表于 2023-4-19 15:49:29

本帖最后由 yhf3721 于 2023-4-30 19:53 编辑

留楼待用。
页: [1]
查看完整版本: 跟冲哥学习32位8051单片机STC32G系列更新学习至第16集