找回密码
 立即注册
查看: 10502|回复: 29

STC32G冲哥视频学习笔记----已完成到第十九集(包含所有完成代码)申请的试验箱到啦

[复制链接]

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-19 15:28:35 | 显示全部楼层 |阅读模式
本帖最后由 养只小猫咪 于 2023-5-9 11:03 编辑

使用的板子是STC-降龙棍系列核心实验板,原理图如下






环境搭建过程不做记录(安装次数太多了,跟着视频或者找个博客装就OK的)


一、先点个灯

(1)新建工程,然后编写如下代码



手册上关于GPIO端口配置寄存器中,对于实验P10引脚有效的就只有P1M0寄存器中的P10M0位和P1M1寄存器中的P10M1位


那根据配置可使用对该位进行清0操作,或者置1操作实现引脚配置




P10配置为准双向IO



P10配置为推挽输出



同理,实验使用P11引脚控制LED灯程序如下,使用推挽模式:





二、  配置HID_不断电下载

获取需要文件文件

(1)hid的库



(2)其他的头文件


2、根据视频进行代码编写


3、按照教程对STC-ISP进行设置(我用的是6.91N版本)


编译可能会出现 57号警告


解决方式:


忽略该警告
4、然后下载,一切正常


三、USB-CDC虚拟串口,不停电下载

1、CDC库的获取



2、STC-ISP软件的配置
STC32G视频学习笔记-1.png

检查一下STC-CDC/USB转串口的驱动是否安装!!!!!!

如果安装正常在电脑的设备管理器 端口下面会有这样的显示

STC32G视频学习笔记-2.png

如果跟上述图片显示不一样

打开STC-ISP进行安装

STC32G视频学习笔记-3.png

3、根据视频添加库,修改代码



4、进行程序下载验证


四、USB-CDC虚拟串口,使用printf函数

1、对照视频进行程序编写,只是与上个例程之间差了几行代码

STC32G视频学习笔记-4.png


程序编译下载之后,打开STC-ISP的串口助手进行验证

STC32G视频学习笔记-5.png

五、printf格式、进制转换基础、C语言常用运算符以及数据的基本类型

1、printf格式输出
STC32G视频学习笔记-1.png STC32G视频学习笔记-2.png


2、进制转换基础
STC32G视频学习笔记-3.png
3、c语言常用运算符
STC32G视频学习笔记-4.png
4、数据类型
STC32G视频学习笔记-1.png
程序附件只放第二个例程个第四个例程,有兴趣的可以下载看看!!



2_USB_HID.zip

103.85 KB, 下载次数: 213

4_C语言printf.zip

105.85 KB, 下载次数: 224

回复

使用道具 举报 送花

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-20 09:19:34 | 显示全部楼层
本帖最后由 养只小猫咪 于 2023-4-20 09:20 编辑

七、按键点灯

使用的是P0口的8个引脚控制LED灯,使用P32和P33作为按键,实现分别实现
按下点亮,松开熄灭、
1.png
按下熄灭,松开点亮、
2.png
按下一次,状态取反,按键松开才执行
3.png
按下一次,状态取反,按键按下就执行

4.png
KEY1按下一,灯左移一个单位,KEY2按下,灯右移一个单位

5.png
数组流水灯

6.png
具体代码见附件程序

7_KEY_LED.zip

72.5 KB, 下载次数: 217

回复 支持 反对

使用道具 举报 送花

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-20 10:24:09 | 显示全部楼层
八、蜂鸣器应用

主要实现功能是:

/*
        按键1按下,蜂鸣器响10ms,LED1-8全部电亮200ms后熄灭,表示开机
        开机后,按键2按下,蜂鸣器响10ms,LED1-8轮流点亮
        按键1再次按下,蜂鸣器响10ms,LED1-8全部熄灭,表示关机
        
        增加按键3,按下按键3之后表示启动,选择的对应功能的LED灯持续闪烁,表示正在工作,且在工作时无法进行功能切换
*/

主要的功能代码:


u8 State_Flag = 0;   /* 表示开关机状态  0 表示关机,1表示开机 */
u8 Run_Flag = 0;     /* 表示运行状态  0 表示没开始运行,1表示开始运行 */
u8 Run_Mode = 0 ;    /* 0-8 模式选择  0:无模式 */
/*
        按键1按下,蜂鸣器响10ms,LED1-8全部电亮200ms后熄灭,表示开机
        开机后,按键2按下,蜂鸣器响10ms,LED1-8轮流点亮
        按键1再次按下,蜂鸣器响10ms,LED1-8全部熄灭,表示关机
        
        增加按键3,按下按键3之后表示启动,选择的对应功能的LED灯持续闪烁,表示正在工作,且在工作时无法进行功能切换
*/
void test(void)
{
        if(KEY1 == 0)
        {
                delay_ms(10);
                if(KEY1 == 0)  /* 按键1被按下 */
                {
                        switch(State_Flag)
                        {
                                case 0:
                                        BEEP = 1;
                                    delay_ms(10);
                                    BEEP = 0;
                                
                                        LED = 0x00 ;
                                        delay_ms(200);
                                        LED = 0xFF ;
                                        State_Flag = 1;
                                break;
                                
                                case 1:
                                        BEEP = 1;
                                    delay_ms(10);
                                    BEEP = 0;
                                
                                        LED = 0xFF ;
                                        State_Flag = 0;
                                
                                    Run_Mode = 0; /* 关机后模式清0 */
                                    Run_Flag = 0;
                                break;
                        }
                        while(KEY1 == 0);  /*先执行,按键在松开 */
                }
        }        
        
        if(State_Flag && (!Run_Flag))
        {
                if(KEY2 == 0)
                {
                        delay_ms(10);
                        if(KEY2 == 0)
                        {
                                BEEP = 1;
                                delay_ms(10);
                                BEEP = 0;
                                
                                Run_Mode++;
                                if(Run_Mode > 8)
                                        Run_Mode = 1;
                                
                                LED =  ~(1<<(Run_Mode-1));
                                
                                while(KEY2 == 0);  /* 先执行,按键在松开 */
                        }
                }
        }
        
        if(KEY3 == 0)
        {
                delay_ms(10);
                if(KEY3 == 0)
                {
                        if(Run_Mode > 0)
                        {
                                Run_Flag = !Run_Flag;
                            LED =  ~(1<<(Run_Mode-1));
                        }
                        while(KEY3 == 0);  /* 先执行,按键在松开 */
                }
        }
        
        if(Run_Flag)
        {
                LED =  ~(1<<(Run_Mode-1));
                delay_ms(100);
                LED = 0xFF;
                delay_ms(100);
        }
        
}



完整工程代码见附件


8_Beep.zip

125.45 KB, 下载次数: 203

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 10:40:24

11

主题

425

回帖

1971

积分

版主

积分
1971
发表于 2023-4-20 11:35:37 | 显示全部楼层
楼主优秀
QQ:2269694595     微信:18106296594
回复

使用道具 举报 送花

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-20 14:44:22 | 显示全部楼层
九、数码管静态显示

由于降龙棍系列实验板没有数码管外设,所以后面的学习就更换成手边有的天问51的STC32G开发板,实物图,原理图如下:
1.png 2.png 3.png 4.png

5.png 6.png


后续程序都是基于此板进行,由于该板板载蜂鸣器是无源蜂鸣器,所以前面蜂鸣器部分的操作都由P41控制的一个LED灯进行完成。
由于开发板上的数码管与STC32G之间加了一个74HC595,所以可能与冲哥视频上的一些代码不一样,不过实现功能的代码思路上是一致的
主要代码如下:
使用KEY1和KEY2来对0-9数码管进行加减


u8 SMG_Tab[10] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };  /* 0-9 */
char num = 0;
void SMG_test(void)
{
       
        if(KEY1 == 0)
        {
                delay_ms(10);
                if(KEY1 == 0)
                {
                        num++;
                        if(num>9)
                        {
                                num = 9;
                        }       
                        while(KEY1 == 0);
                }
        }
       
        if(KEY2 == 0)
        {
                delay_ms(10);
                if(KEY2 == 0)
                {
                        num--;
                        if(num<0)
                        {
                                num = 0;
                        }       
                        while(KEY2 == 0);
                }
        }
        LED = SMG_Tab[num];
}


使用KEY1、KEY2和KEY3来对0-9数码管进行循环显示,按KEY3会让蜂鸣器响改数字次数的声


u8 SMG_Tab[10] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };  /* 0-9 */
char num = 0;


void Beep_Di_Num(u8 num)
{
        int i;
        for(i = num; i>0;i-- )
        {
                BEEP = 1;
                delay_ms(200);
                BEEP = 0;
                delay_ms(200);
        }
}

void SMG_test(void)
{
        if(KEY1 == 0)
        {
                delay_ms(10);
                if(KEY1 == 0)
                {
                        num++;
                        if(num>9)
                        {
                                num = 0;
                        }       
                        while(KEY1 == 0);
                }
        }
        if(KEY2 == 0)
        {
                delay_ms(10);
                if(KEY2 == 0)
                {
                        num--;
                        if(num<0)
                        {
                                num = 9;
                        }       
                        while(KEY2 == 0);
                }
        }
        if(KEY3 == 0)
        {
                delay_ms(10);
                if(KEY3 == 0)
                {
                        Beep_Di_Num(num);
                        while(KEY2 == 0);
                }
        }
        LED = SMG_Tab[num];
}


完整工程代码可通过附件下载


9_静态数码管显示.zip

160.07 KB, 下载次数: 191

回复 支持 反对

使用道具 举报 送花

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-20 14:45:10 | 显示全部楼层

相互学习
回复 支持 反对

使用道具 举报 送花

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-20 16:36:29 | 显示全部楼层
10、动态数码管显示


共用变量定义:
/********************0    1    2    3    4    5    6    7    8    9   0.   1.   2.    3.   4.   5.   6.   7.  8.   9.   - ***************************/
u8 SMG_Tab[21] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xBF};  /* 0-9 + 0-9带. */
u8 COM_Tab[8] =  { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  /* 位码 */
u8 Show_Tab[8] = { 0,0,20,0,0,20,0,0 };
u8 num = 0;
u32 Time_Count = 0;
u8 Run_Flag = 0;
u8 hour = 0;  /* 时 */
u8 min = 0;   /* 分 */
u8 Sec = 0;   /* 秒 */




(1)完成了在八个数码管上显0-7的显示,主要功能代码如下
void SMG_test(void)
{
        Send_595(COM_Tab[num]) ;  /* 位码选择第8位 */
        LED = SMG_Tab[num];  /* 段码显示1 */
        delay_ms(1);
    num++;
        if(num>7)
        {
                num = 0;
        }
}

(2)动态显示一个八位数,主要功能代码如下

void SMG_test(void)
{
        Send_595(COM_Tab[num]) ;  /* 位码选择 */
        LED = SMG_Tab[Show_Tab[num]];  /* 段码显示1 */
        delay_ms(1);
    num++;
        if(num>7)
        {
                num = 0;
        }
}

(3)10秒免单计数器,主要功能代码如下

       在前四位数码管显示目标时间,即10.00,表示定时10秒钟
        后四位显示当前的计时00.00,最小单位为10ms
        按下开始按钮KEY1后,每10ms最末尾的数字加一,再次按下KEY1按钮后停止计时

void SMG_test(void)
{
        Show_Tab[0] = 1;
        Show_Tab[1] = 10;
        Show_Tab[2] = 0;
        Show_Tab[3] = 0;
        if(Run_Flag)
        {
                Time_Count++;
                Show_Tab[4] = Time_Count/10000%10;    /* 取万位 */
                Show_Tab[5] = Time_Count/1000%10+10;  /* 取千位+小数点 */
                Show_Tab[6] = Time_Count/100%10;      /* 取百位 */
                Show_Tab[7] = Time_Count/10%10;       /* 取十位 */
        }
        Send_595(COM_Tab[num]) ;  /* 位码选择 */
        LED = SMG_Tab[Show_Tab[num]];  /* 段码显示1 */
        delay_ms(1);
        num++;
        if(num>7)
        {
                num = 0;
        }
        if(KEY1 == 0)
        {
                delay_ms(10);
                if(KEY1 == 0)
                {
                        while(KEY1 == 0)
                        {
                                Send_595(COM_Tab[num]) ;  /* 位码选择 */
                                LED = SMG_Tab[Show_Tab[num]];  /* 段码显示1 */
                                delay_ms(1);
                                num++;
                                if(num>7)
                                {
                                        num = 0;
                                }
                        }
                        Run_Flag = !Run_Flag;
                        if(Run_Flag == 0)
                        {
                                Time_Count = 0;
                        }
                }
        }
}



(4)简易时钟 ,主要功能代码如下

        初始状态显示00-00-00,分别表示时、分、秒
        每隔1秒钟,秒+1,一分钟,分+1,以此类推
        时间到达00-00-30的时候,蜂鸣器响3秒表示闹钟

void SMG_test(void)
{
        delay_ms(1);
        Time_Count++;
        if(Time_Count>=500)  /* 不精确秒延时 */
        {
                Time_Count = 0;
                Sec++;
                if(Sec>=60)
                {
                        Sec = 0;
                        min++;
                }
        }
        if(min>=60)
        {
                min = 0;
                hour++;
        }
        if(hour>=24)
        {
                hour = 0;
        }
        Show_Tab[7]        = Sec%10;  /* 获取秒的个位 */
        Show_Tab[6] = Sec/10;  /* 获取秒的十位 */
        Show_Tab[4]        = min%10;  /* 获取分的个位 */
        Show_Tab[3] = min/10;  /* 获取分的十位 */
        Show_Tab[1]        = hour%10;  /* 获取时的个位 */
        Show_Tab[0] = hour/10;  /* 获取时的十位 */
        if((hour == 0) && (min == 0) && (Sec == 30))
        {
                BEEP = 1;
        }
        if((hour == 0) && (min == 0) && (Sec == 33))
        {
                BEEP = 0;
        }
        Send_595(COM_Tab[num]) ;  /* 位码选择 */
        LED = SMG_Tab[Show_Tab[num]];  /* 段码显示1 */
        delay_ms(1);
        num++;
        if(num>7)
        {
                num = 0;
        }
}


完整的工程代码,如附件所示



10_SMG动态显示.zip

79.78 KB, 下载次数: 200

回复 支持 反对

使用道具 举报 送花

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-20 17:34:50 | 显示全部楼层
本帖最后由 养只小猫咪 于 2023-4-20 22:25 编辑

11、定时器

STC32G内部有T0-T4五个定时器且它们都可以工作在定时器模式挥着是计数器模式,这章只讨论其作为定时器使用的功能

1.png

如上图所示,T0-T4五个定时器中支持的模式是不同的,四种工作模式如下图所示
2.png

由于T1-T4的工作方式都是T0定时器的子集,所以只验证T0定时器的功能,其余的同理

T0定时器
1、设置T0定时器的工作方式,工作在定时器模式下(TMOD
3.png 4.png
TMOD &= (0<<2)

2、设置T0定时器的计数脉冲是系统时钟1分频的还是系统时钟的12分频(AUXR

5.png 1.png
定时器输入时钟是系统时钟的1分频和12分频有什么区别呢?
当前使用的系统时钟是24MHZ
12分频模式下:
        定时器输入时钟是2MHZ,也就是说计数器计一个数是0.5us,如果需要定时器计时1ms,也就是说计数器要加到2000
由于STC32G使用的是16位计数器,最大计数值是65535,所以在12分频的模式下的最大定时时间为0.5us * 65535  即32.7675ms
1T模式:
     定时器输入时钟是24MHZ,也就是说计数器计一个数是1/24000000秒,如果需要定时器计时1ms,也就是说计数器要加到24000
由于STC32G使用的是16位计数器,最大计数值是65535,所以在1分频的模式下的最大定时时间为1/24000000秒 * 65535  即大约是2.73ms

我们一般配置成12分频模式即可
AUXR &= (0<<7)

3、设置定时器工作模式(TMOD
2.png 3.png

常用的就是16位自动重装载模式
也就是TMOD &= (0xFC)

4、定时器0控制寄存器配置(TCON
4.png 5.png

TMOD &= (0<<3)     将T0_GATE位清0
TR0 = 1     定时器开始运行

5、打开定时器0的中断
6.png 7.png

ET0 = 1


6、编写定时器0中断函数
8.png

定时器的中断号等于0

void Timer0_Isr(void) interrupt 1
{
}


对了,还有定时时间设定后的TH0和TL0的计算
9.png 10.png 11.png

我们设定定时时间1ms,定时器选择12分频,16位自动重载模式则根据计算
(65536-[ TH0,TL0 ]) *12  = 24000000 * 0.001    根据计算可得[ TH0,TL0 ] = 2000
TH0 = 0xF8
TL0 = 0x30

总结一下:


void Timer0_Init(void)
{
        TMOD &= (0<<2);     /* 配置定时器0工作在定时器方式下 */
        AUXR &= (0<<7);     /* 设置定时器0输入时钟为12分频 */
        TMOD &= (0xFC);     /* 配置定时器0工作在模式0,16位自动重装载模式下 */
        
        TH0 = 0xF8;
        TL0 = 0x30;
        
        TF0 = 0;                        //清除TF0标志
        TMOD &= (0<<3);     /* 将T0_GATE位清0 */
        TR0 = 1 ;           /* 定时器0开始运行 */
        ET0 = 1;            /* 定时器0中断打开 */
}


/**************************将定时器定时1ms然后修改上个章节的10秒免单计数器的程序*******************************************/
主要程序如下:

void SMG_test(void)
{
        Show_Tab[0] = 1;
        Show_Tab[1] = 10;
        Show_Tab[2] = 0;
        Show_Tab[3] = 0;
        
        if(Run_Flag)
        {
                Show_Tab[4] = Time_Count/10000%10;    /* 取万位 */
                Show_Tab[5] = Time_Count/1000%10+10;  /* 取千位+小数点 */
                Show_Tab[6] = Time_Count/100%10;      /* 取百位 */
                Show_Tab[7] = Time_Count/10%10;       /* 取十位 */
        }
        
        if(KEY1 == 0)
        {
                delay_ms(10);
                if(KEY1 == 0)
                {
                        while(KEY1 == 0);
                        Run_Flag = !Run_Flag;
                        Time_Count = 0;
                }
        }
}

#if 0    /* 自己推导编写代码 */
void Timer0_Init(void)
{
        TMOD &= (0<<2);     /* 配置定时器0工作在定时器方式下 */
        AUXR &= (0<<7);     /* 设置定时器0输入时钟为12分频 */
        TMOD &= (0xFC);     /* 配置定时器0工作在模式0,16位自动重装载模式下 */
        
        TH0 = 0xF8;
        TL0 = 0x30;

        TF0 = 0;                        //清除TF0标志
        TMOD &= (0<<3);     /* 将T0_GATE位清0 */
        TR0 = 1 ;           /* 定时器0开始运行 */
        ET0 = 1;            /* 定时器0中断打开 */
}
#endif


#if 1   /* 定时器计算器生成代码 */
void Timer0_Init(void)
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
#endif

/* 定时器0的中断服务函数 */
void Timer0_ISR(void)  interrupt  1
{
        Time_Count++;
        
        Send_595(COM_Tab[num]) ;       /* 位码选择 */
        LED = SMG_Tab[Show_Tab[num]];  /* 段码显示1 */
    num++;
        if(num>7)
        {
                num = 0;
        }
}


/******************************************************将定时器定时1ms然后修改上个章节的简易时钟程序,并使用KEY1控制其运行和暂停*********************************************************************/
主要代码如下:

void SMG_test(void)
{
        if(Time_Count>=1000)  /* 精确秒延时 */
        {
                Time_Count = 0;
                Sec++;
                if(Sec>=60)
                {
                        Sec = 0;
                        min++;
                }
        }
        if(min>=60)
        {
                min = 0;
                hour++;
        }
        if(hour>=24)
        {
                hour = 0;
        }

        Show_Tab[7]        = Sec%10;  /* 获取秒的个位 */
        Show_Tab[6] = Sec/10;  /* 获取秒的十位 */
        
        Show_Tab[4]        = min%10;  /* 获取分的个位 */
        Show_Tab[3] = min/10;  /* 获取分的十位 */
        
        Show_Tab[1]        = hour%10;  /* 获取时的个位 */
        Show_Tab[0] = hour/10;  /* 获取时的十位 */
        
        if((hour == 0) && (min == 0) && (Sec == 30))
        {
                BEEP = 1;
        }
        if((hour == 0) && (min == 0) && (Sec == 33))
        {
                BEEP = 0;
        }
        if(KEY1 == 0)
        {
                delay_ms(10);
                if(KEY1 == 0)
                {
                        Stop_Flag = !Stop_Flag;
                        while(KEY1 == 0);
                }
        }
}

/* 定时器计算器生成代码 */
void Timer0_Init(void)
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

/* 定时器0的中断服务函数 */
void Timer0_ISR(void)  interrupt  1
{
        if(Stop_Flag == 0)
        {
                Time_Count++;
        }
        Send_595(COM_Tab[num]) ;  /* 位码选择 */
        LED = SMG_Tab[Show_Tab[num]];  /* 段码显示1 */
    num++;
        if(num>7)
        {
                num = 0;
        }
}




以上两个例程的完整工程代码,请下载附件内容观看

最后最后大赞一下STC-ISP的定时器计算器功能
1.png

/****************************************************************  Warning  *******************************************************************/
使用定时器的时候出现了这样一个警告:
2.png

最后通过
3.png

去掉这个这个 4 Byte interupt Frame Size选项消除了这个警告


1.png

11_Timer定时器.zip

164.59 KB, 下载次数: 200

回复 支持 反对

使用道具 举报 送花

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-21 11:37:30 | 显示全部楼层
十二、计数器的使用
将定时器x配置成计数器还是定时器使用,主要是通过对TMOD寄存器进行配置完成的。.
以定时器0为例:
1.png
2.png

对于用作定时器或者计数器后他的工作模式,
自动重装载模式和不自动重载模式的区别请移步看我另一个帖子
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1936


使用T0作为定时器定时1ms,然后每隔1S对T1计数器产生的脉冲数通过数码管进行显示,主要代码如下所示:


void Timer1_Init(void)               
{
        TMOD = 0x50;                        //设置定时器模式
        TL1 = 0x00;                                //设置定时初始值
        TH1 = 0x00;                                //设置定时初始值
        TF1 = 0;                                //清除TF1标志
        TR1 = 1;                                //定时器1开始计时
        ET1 = 1;                                //使能定时器1中断
}

void Timer0_Count_Init(void)  //1毫秒@24.000MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

void Timer0_Isr(void) interrupt 1
{
        Time_Count++;
        if(Time_Count>=1000)  /* 转每秒 */
        {
                Time_Count = 0;
                Count_T1 = (TH1*256)+TL1;
                TH1 = 0x00;
                TL1 = 0x00;
                Show_Tab[0] = Count_T1/1000%10;
                Show_Tab[1] = Count_T1/100%10;
                Show_Tab[2] = Count_T1/10%10;
                Show_Tab[3] = Count_T1%10;
        }
        Send_595(COM_Tab[num]) ;       /* 位码选择第8位 */
        LED = SMG_Tab[Show_Tab[num]] ;       /* 段码显示1 */
        num++;
        if(num>3)
        {
                num = 0;
        }
}


完整的工程代码请下载附件进行观看



12_Timer_Count.zip

148.79 KB, 下载次数: 192

回复 支持 反对

使用道具 举报 送花

8

主题

26

回帖

144

积分

注册会员

积分
144
发表于 2023-4-23 15:08:36 | 显示全部楼层
STC32G冲哥视频学习笔记--------包含所有代码
《STC32位8051单片机原理及C语言程序设计视频教程》
十三、多文件模块化编程 学习

永远不能停下学习的脚步,之前也有些编程基础,但只是富裕表面,不求甚解。
之前关于多文件模块化多少也是知道的,可是关于局部变量,局部静态变量这些都没什么多大的概念,
基本都是一个全局变量去解决,看完视频之后真的获益良多,
除此之外状态机编程的思想,之前也是接触过的,可一直也没有去深究,搞得现在编程总是不上不下的,
现在沉下心来好好地思考这些,有种豁然开量的感觉,感谢冲哥的视频!!
关于我自己写的代码,还是放在附件中,有兴趣的可以看看。
【新提醒】看32位8051教学视频,送实验箱,200万大奖等你拿 - 开源广场及教学视频交流 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)


13_多任务.zip

192.99 KB, 下载次数: 238

回复 支持 1 反对 0

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 20:19 , Processed in 0.126371 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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