Rain_Personal 发表于 2024-4-28 18:49:07

第十八课ADC采集电源电压和ADC按键

目的:检测电源电压
CHIPID7内部1.19V参考电压
CHIPID8内部1.19V参考电压




ADC的第15通道会形成固定的1.19V,采集ADC时,会将1.19V转换为参考值比如2048,此时可以根据这个反推Vref参考电压
2048 = 1.19/Vref*4096===>Vref = 1.19/0.5 = 2.38V

ADC按键的原理是,读取ADC的值,判断ADC值,不同的按键会又不同的ADC值,进而判断那个键按下。

Rain_Personal 发表于 2024-4-28 20:45:37

本帖最后由 Rain_Personal 于 2024-5-15 20:42 编辑

第十九课 NTC温度采集

1. NTC原理

NTC(Negative Temperature Coefficient)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷,可制成具有负温度系数(NTC)的热敏电阻。其电阻率和材料常数随材料成分比例、烧结气氛、烧结温度和结构状态不同而变化。现在还出现了以碳化硅、硒化锡、氮化钽等为代表的非氧化物系NTC热敏电阻材料。
检测电阻就可以获取当前温度


横坐标温度,纵坐标电阻



Vout可以根据ADC值测得
那么NTC的电阻R2 = Vout*R1/(Vin-Vout)
再根据R2~温度 反推出来温度。

跳线帽链接红色圆圈中左边两个阵脚,就可以使用NTC测温了,通过手触摸蓝色NTC电阻,就可以改变温度数值,检测对错


Rain_Personal 发表于 2024-4-29 19:36:27

第二十课 串口通信

1. 串口通信是将两个设备通过一定的协议进行信息交换。



并行通信和串行通信:每次发送一位数据的称为串行通信,多位一起传输的称为并行通信。
串口通信(Serial Communication), 是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

接线方式:



接受时钟和发送时钟不一定相同,只要相近就可以的属于异步通讯。接收时钟与发送进钟严格同步,通常要有同步时钟。
全双工 半双工和单工的区别,根据用的几条线,单工是单向发送,只能发不能回。



波特率 表明每秒钟可以发送的数据 例如9600波特率,表示每秒可以发送9600位数据。

串口通讯的距离比较短,一般解决方法为添加专用芯片



应用:通过串口转以太网,WIFI,蓝牙,zigbee等可以做成路由器,网络插座,智能手环等设备。

2. STC32的串口引脚



手册是需要熟练掌握的信息!


实验箱中电路图:





Rain_Personal 发表于 2024-5-5 14:09:09

本帖最后由 Rain_Personal 于 2024-5-15 17:58 编辑

哈哈哈,好事发生,给自己放个假
准备回归工作生活,再琢磨琢磨串口通信问题。

Rain_Personal 发表于 2024-5-8 20:58:28

Rain_Personal 发表于 2024-4-25 17:39
第四课 新建工程并点亮LED灯

上节课未吃透所遇问题


有点难度,现在都没调试完,怎么自动上电下载程序

电子爱好者2024 发表于 2024-5-9 22:42:51

学习

Rain_Personal 发表于 2024-5-15 21:18:17

本帖最后由 Rain_Personal 于 2024-5-16 22:04 编辑

第二十一课串口应用
串口2的启用方法


void Usart2_Init(void)
{
        P_SW2 = 0X80;
        P_SW2 |= 0X01;                        //将串口2 的引脚切换到P46 P47   0X00P10 P11
       
        S2CFG = 0X01;
       
        S2CON = 0X50;
        T2L = BRT;
        T2H = BRT>>8;
        T2x12 = 1;
        T2R = 1;
       
        wptr = 0x00;
        rptr = 0x00;
        busy = 0;
}


void Usart_Isr() interrupt 8
{
        if( S2TI )
        {
                S2TI = 0;
                busy = 0;
        }
        if( S2RI )
        {
                S2RI = 0;
                buffer = S2BUF;
                wptr &= 0X0F;
        }
}

void Usart2_Send(char dat)
{
        while(busy);
        busy = 1;
        S2BUF = dat;
}

void Usart2_SendStr(char *p)
{
        while(*p)
        {
                Usart2_Send(*p++);
        }
}
其中S2BUF 为寄存器地址,可以用于读取和写入

Rain_Personal 发表于 2024-5-17 21:45:02

第二十二课 CDC串口通信



无需USB转TTL工具!P30和P31连接电脑D-和D+



STC32G128K支持自动烧录

具体方法之前探索过,流程如下

1)下载.lib库和头文件
2)新建工程,加载lib库文件
3)调用头文件并初始化USB功能
4)设置工程参数,编译选项等
5)首次下载手动进入HID下载模式下载
6)下载完成等待生成CDC串口号,设置ISP软件参数

执行完如上步骤,再也不需要手动进下载模式了,只要ISP软件点一下下载程序就可以自动烧录。


Rain_Personal 发表于 2024-5-17 21:57:06

第二十三课 看门狗

复位的主要作用是把单片机内部的特殊功能寄存器置于初始状态,使单片机硬件、软件从一个确定的、唯一的起点开始工作。




看门狗是一个计数器,它的基本功能是在软件问题和程序跑偏后重启系统。看门狗正常工作时会自动计数,程序进程会定时将其归零。如果系统在某个地方卡住了或者跑了,定时器就会溢出,是系统强制复位。
检测bug和意外
软件的可靠性一直是一个关键问题。任何使用软件的人都可能遇到电脑死机或程序失控的问题,这种问题在嵌入式系统中也存在。由于单片机抗干扰能力有限,在工业现场仪器仪表中,经常因电压不稳和电弧干扰而死机。在水表、电表无人值守的情况下,系统因干扰无法重启。为了保证系统在受到干扰后能自动恢复正常,看门狗定时器的使用是非常有价值的。

提高单片机运行可靠性


WDT_CONTR寄存器操作看门狗





CLR_WDT = 1表示喂狗

Rain_Personal 发表于 2024-5-18 11:52:11

第二十四课 比较器







void CMP_Init(void)
{

    CMPEXCFG = 0x00;
    CMPEXCFG |= 0xc0;                           //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV

//CMPEXCFG &= ~0x04;                        //P3.6为CMP-输入脚
    CMPEXCFG |= 0x04;                           //内部1.19V参考电压为CMP-输入脚

    CMPEXCFG &= ~0x03;                        //P3.7为CMP+输入脚
//CMPEXCFG |= 0x01;                           //P5.0为CMP+输入脚
//CMPEXCFG |= 0x02;                           //P5.1为CMP+输入脚
    CMPEXCFG |= 0x03;                           //ADC输入脚为CMP+输入脚


    CMPCR2 = 0x00;
    INVCMPO = 0;                              //比较器正向输出
//INVCMPO = 1;                              //比较器反向输出
    DISFLT = 0;                                 //使能0.1us滤波
//DISFLT = 1;                                 //禁止0.1us滤波
//CMPCR2 &= ~0x3f;                            //比较器结果直接输出
    CMPCR2 |= 0x10;                           //比较器结果经过16个去抖时钟后输出

    CMPCR1 = 0x00;
//PIE = 0;                                    //禁止比较器上升沿中断
    PIE = 1;                                    //使能比较器上升沿中断
//NIE = 0;                                    //禁止比较器下降沿中断
    NIE = 1;                                    //使能比较器下降沿中断

//CMPOE = 0;                                  //禁止比较器输出
    CMPOE = 1;                                  //使能比较器输出

    CMPO_S = 0;                                 //选择P3.4作为比较器输出脚
//CMPO_S = 1;                                 //选择P4.1作为比较器输出脚
    CMPEN = 1;                                  //使能比较器模块
}

sbit LED0 = LED_DATA^0;      # LED0引脚的定义


void CMP_Isr() interrupt 21
{
    CMPIF = 0;                        //清中断标志
      if( CMPRES )                                          //等于1 正端电压大于负端
      {
               
      }
      else
      {
      
      }
    LED0 = CMPRES;                     //中断方式读取比较器比较结果
}

页: 1 2 [3] 4 5
查看完整版本: 跟冲哥学习STC32G128K芯片打卡