新学多照 发表于 2024-4-25 12:13:14

本帖最后由 新学多照 于 2024-4-28 15:19 编辑

打卡第二集

好学天上 发表于 2024-4-25 15:22:22

第十一-十二集 定时计数器打卡滴滴滴 好好好开始上难度了 脑子不太好使
STC32G128K芯片学习打卡贴
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7834
(出处: 国芯技术交流网站)

Rain_Personal 发表于 2024-4-25 18:09:02

跟冲哥学习STC32G128K芯片打卡持续更新 期待 实验箱的实物验证
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7996
(出处: 国芯技术交流网站)

yzk_hi 发表于 2024-4-26 08:05:48

打卡第九集

科学妞妞 发表于 2024-4-26 09:12:34

zhaoye818 发表于 2024-4-24 21:16
第十五集学习笔记:1.中断和中断系统 2.什么是外部中断 3.外部中断的用法 INT0的程序。STC的资料真的很实用 ...

确实资料好

深度陶醉 发表于 2024-4-26 10:55:36

zhaoye818 发表于 2024-4-25 19:11
客服让我发打卡链接,请问您是怎么发的?

如下图,到你的回复消息页面,将所有培训的回复载图给客服就可以了

bnnpyuvtkd 发表于 2024-4-26 11:16:46

本帖最后由 bnnpyuvtkd 于 2024-4-26 11:42 编辑

今天跳到第16讲:IO口中断
IO口中断是STC32G单片机特有的中断,是宏晶公司独创的
      第16讲:IO中断
      IO中断是STC32G特有的内部中断,下面编写IO中断程序。
      打开示例程序第11(外部中断)的程序,主程序是Demo.c ,如下:

#include "COMM/stc.h"                //调用头文件
#include "COMM/usb.h"
#include "seg_led.h"
#include "key.h"
#include "beep.h"
#include "tim0.h"
#include "exit.h"


#define MAIN_Fosc 24000000UL      //定义主时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

bitTIM_10MS_Flag;                        //10ms的标志位

void sys_init();      //函数声明
void delay_ms(u16 ms);      //unsigned int


void main()                                        //程序开始运行的入口
{
      u8 i;
      u8 KEY_NUM = 0;                        //保存矩阵按键的键码
      u8 KEY_Str = 0;                        //表示当前输入了几个密码位
      
      sys_init();                              //USB功能+IO口初始化
      usb_init();                              //usb库初始化

      Timer0_Init();                        //定时器0初始化
      INT0_Init();                        //外部中断0初始化
      
      EA = 1;                                        //CPU开放中断,打开总中断。
      
      SEG0 = 0;
      SEG1 = 0;
//      SEG2 = 2;
//      SEG3 = 3;
//      SEG4 = 4;
//      SEG5 = 5;
//      SEG6 = 6;
//      SEG7 = 7;
      
      LED = 0xff;                              //初始状态熄灭所有LED
      
      while(1)                //死循环
      {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();
                }
               

                for(i=0;i<8;i++)                //循环八次
                {
                        LED = ~(1<<i);                //当前i是几,就点亮第几个LED
                        delay_ms(500);                //验收500ms
                }
                if( P33 ==0 )                        //如果P33按下了
                        SEG1 += 1;                        //数码管1的数值+1
               
      }
}

void INT0_Isr(void) interrupt 0
{
      SEG0 += 1;                                        //数码管0的数值+1
}


void Timer0_Isr(void) interrupt 1
{
      static timcount = 0;
      
      SEG_LED_Show();                        //数码管刷新的
      
      timcount++;                              //1ms+1
      if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
      {
                timcount = 0;
                TIM_10MS_Flag = 1;      //10ms时间到了
      }
}


void sys_init()                //函数定义
{
    WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

      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;   //设置为准双向口
      
    P3M0 = 0x00;
    P3M1 = 0x00;
   
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));//等待时钟稳定

    USBCLK = 0x00;      //使用CDC功能需要使用这两行,HID功能禁用这两行。
    USBCON = 0x90;
}


void delay_ms(u16 ms)      //unsigned int
{
      u16 i;
      do
      {
                i = MAIN_Fosc/6000;
                while(--i);
      }while(--ms);
}

      中断优先级的设置
      编写P35口的IO中断,中断改变SEG0的数值(显示0--9),延时500ms ,观察定时器刷新数码管,数码管一个一个刷新过去,SEG0显示也会自加。
      在Demo.c里编写中断函数
void P3Exit_Isr(void) interrupt 40
{
      u8 intf;
      intf = P3INTF;                              //读取状态标志,必须软件清空
      if(intf)
      {
                P3INTF = 0;                              //清空中断标志位
                if(intf & 0x20)                        //P35按下
                {
                        SEG0++;                              //这边是数码管循环显示0-9
                        if(SEG0 > 9)
                              SEG0 = 0;
                        delay_ms(500);                //这边是为了演示一个功能,大家正式写代码千万不能在中断里加延时
                }
      }
}

第40号大于31,而keil只能有32(0~31)个中断号,为了多运行中断号,要运行一个增加中断号的“拓展Keil的C代码中断号”软件,之后keil的中断号就扩展到了256个。

还要在tim0.c里的“void Timer0_Init(void)”函数中添加
IP = 0X02;
IPH = 0X02;
以设置最高优先级。

yzk_hi 发表于 2024-4-26 15:47:41

打卡第十集

组织小白 发表于 2024-4-26 16:52:01

已经买了屠龙刀开始学习

组织小白 发表于 2024-4-26 17:26:53

第二课看完了,实验箱图片我没有看到can接口,学完后想用板子做一个无线遥控器诊断仪
页: 170 171 172 173 174 175 176 177 178 179 [180] 181 182 183 184 185 186 187 188 189
查看完整版本: 视频教学:《32位8051单片机原理及应用》,一等奖2万, 送实验箱; 冲哥版