找回密码
 立即注册
查看: 2744|回复: 19

跟着冲哥学单片机

[复制链接]

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-7-30 23:00:37 | 显示全部楼层 |阅读模式
之前看过一些视频,看着看着就丢一边了。现在重新开始,好好学习,希望学完后能做几个自己想实现的产品。
每天坚持看半个小时到一个小时。
一定要静下心,沉住气;
多动手;多交流;吸收别人的好东西;耐心的尝试,从一些简单的需求开始。


跟着冲哥学单片机-1.png


回复

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-1 15:39:32 | 显示全部楼层
1.png
工具箱外设介绍
其中屏STC有个模拟的屏可以用
兴趣是最好的老师,先设置一个目标,然后向目标一步步迈进:
使用上面的外设做一个温度控制器。(开始并不是那种很精确的控制的)
回复 支持 反对

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-1 16:17:28 | 显示全部楼层
第三课,环境搭建和程序下载:
https://stcai.com/gjrj   (工具软件)
ISP工具软件打开后在资料下载中下载用户手册
KEIL C251
安装路径最好在同一个目录下,减少或避免报错
https://www.keil.com/download/product/   (C251)

回复 支持 反对

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-1 16:18:16 | 显示全部楼层
第三课,环境搭建和程序下载:
https://stcai.com/gjrj   (工具软件)
ISP工具软件打开后在资料下载中下载用户手册
KEIL C251
安装路径最好在同一个目录下,减少或避免报错
https://www.keil.com/download/product/   (C251)




回复 支持 反对

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-5 16:24:50 | 显示全部楼层
本帖最后由 williamj 于 2023-8-12 19:39 编辑

第四课:点亮一颗LED。
新建工程(根据手册新建工程和设置)
下载烧录代码。
首先把基本的IO操作调通,方便以后高级的功能的使用
注意要开始培养良好的编程习惯。

sfr P2 = 0xA0;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;

sbit P25=P2^5;  //点亮P2.5连接的led
void main ()
{
        P2M1 = 0x95;//配置P2端口为准双向口
        P2M0 = 0x96;
        
        while (1)
        {
                P25=0;
        }
}


回复 支持 反对

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-12 19:28:38 | 显示全部楼层
本帖最后由 williamj 于 2023-8-12 19:34 编辑

代码烧录:
STC带硬件USB的单片机支持硬件USB下载。用的是USB-HID通信协议,不需要安装驱动。(这个特别好用,普通的USB数据线接到电脑上就行,不要其他烧录工具)
USB-ISP下载程序步骤:在 D-/P3.0, D+/P3.1与PC-USB端口连接好的状况下:
1. 按下板子上的P3.2/INT0按键,就是P3.2接地;
2. 给目标芯片重新上电,不管之前是否已通电,电子开关是按下停电后再松开就是上电; 等待STC-ISP下载软件中自动识别出“STC USB Writer (HID1)” ,识别出来后,松开P3.2按键 ;
3. 再点击下载软件中的“下载/编程”按钮
回复 支持 反对

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-19 13:17:18 | 显示全部楼层
//不断电复位到ISP区,点击下载就可以 不再先按P3.2,然后断电重启
#include "COMM/STC32F.h"          //包含此头文件后,不需要再包含"reg51.h"头文件,需要注意大小写
//#include "COMM/usb.h"                //USB调试及复位所需头文件
/****************************** 用户定义宏 ***********************************/
//#define MAIN_Fosc       52000000UL  //定义主时钟
/*****************************************************************************/
/*
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char code*_STCISPCMD = "@STCISP#";             //自定义下载命令  设置自动复位到ISP区的用户接口命令
*/

sbit LED=P2^2;          //需要控制的LED
sbit P32=P3^2;          //不停电下载 触发复位到ISP

/******************** 主函数 **************************/
void main(void)
{
        EAXFR = 1;  //使能访问XFR  

        P2M1 = 0x95;//配置P2端口为准双向口
        P2M0 = 0x96;
        
        P3M1 = 0x00;//配置P3端口
        P3M0 = 0x00;
        P32 = 1;  

    while (1)
    {
                if ( P32== 0 ) IAP_CONTR = 0x60;//当检测到P3.2的电平为低时,软件复位到系统区
                LED = 0;
    }
}
回复 支持 反对

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-21 19:42:59 | 显示全部楼层
本帖最后由 williamj 于 2023-8-23 09:56 编辑

通过加载“stc_usb_hid_32.lib”库函数,实现使用STC-ISP软件发送指令触发MCU复位,进入USB下载模式并自动下载
/*************  功能说明    **************
本例程基于STC32F核心转接板(追风剑)进行编写测试。
两种复位进入USB下载模式的方法:
1. 通过每1毫秒执行一次“KeyResetScan”函数,实现长按P3.2口按键触发MCU复位,进入USB下载模式。
   (如果不希望复位进入USB下载模式的话,可在复位代码里将 IAP_CONTR 的bit6清0,选择复位进用户程序区)
2. 通过加载“stc_usb_hid_32.lib”库函数,实现使用STC-ISP软件发送指令触发MCU复位,进入USB下载模式并自动下载。

下载时, 选择时钟 52MHz (用户可自行修改频率)。

******************************************/

#include "comm/STC32F.h"  //包含此头文件后,不需要再包含"reg51.h"头文件
#include "comm/usb.h"     //USB调试及复位所需头文件
#include "intrins.h"

****************************************************************************/

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP123#";                      //设置自动复位到ISP区的用户接口命令


/******************** 主函数 **************************/
void main(void)
{
    EAXFR = 1; //扩展寄存器(XFR)访问使能
//   RSTFLAG |= 0x04;   //设置硬件复位后需要检测P3.2的状态选择运行区域,否则硬件复位后进入USB下载模式

    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;   //设置为准双向口

  //  Timer0_Init();
    usb_init(); //USB接口配置
//    ICacheOn(); //开启ICache

    EUSB = 1;   //IE2相关的中断使能后,需要重新设置EUSB
    EA = 1;     //打开总中断

   
    while (1)
    {
        if (DeviceState != DEVSTATE_CONFIGURED)  //判断USB设备是否配置完成,配置完成后才可以进行数据收发
        {
            continue;
        }

        if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,64);    //返回收到的数据, 用于测试(发送数据缓冲区,长度)
            
            usb_OUT_done(); //接收应答(固定格式)
        }

  /*      if(B_1ms)
        {
            B_1ms = 0;
         //   KeyResetScan();   //长按P3.2口按键触发软件复位,进入USB下载模式,不需要此功能可删除本行代码
        }
        */
                P21=0;P23=0;P25=0;
    }
}
/*
void ICacheOn(void)     //打开ICACHE功能
{
    bit fEA;   
    if(WTST > 0)
    {
        fEA = EA;
        EA = 0;         //关闭中断,防止写触发命令序列中途产生中断
        _nop_();
        _nop_();
        TA = 0xaa;      //写入触发命令序列1
                        //此处不能有其他任何指令
        TA = 0x55;      //写入触发命令序列2
                        //此处不能有其他任何指令
        ICHECR = 0x01;  //写保护暂时关闭,可以修改ICHECR中的EN位
                        //EN为再次进入写保护状态
        _nop_();
        _nop_();
        EA = fEA;
    }
}


void ICacheOff(void)//关闭ICACHE功能
{
    bit fEA;

    fEA = EA;
    EA = 0;         //关闭中断,防止写触发命令序列中途产生中断
    _nop_();
    _nop_();
    TA = 0xaa;      //写入触发命令序列1
                    //此处不能有其他任何指令
    TA = 0x55;      //写入触发命令序列2
                    //此处不能有其他任何指令
    ICHECR = 0x00;  //写保护暂时关闭,可以修改ICHECR中的EN位
                    //EN位再次进入写保护状态
    _nop_();
    _nop_();
    EA = fEA;
}

//========================================================================
// 函数: void Timer0_Init(void)
// 描述: 定时器0初始化函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-2
// 备注:
//========================================================================
void Timer0_Init(void)
{
    // Timer0初始化
    AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
    TH0 = (u8)(Timer0_Reload / 256);
    TL0 = (u8)(Timer0_Reload % 256);
    ET0 = 1;    //Timer0 interrupt enable
    TR0 = 1;    //Tiner0 run
}

//========================================================================
// 函数: void delay(void)
// 描述: 延时函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2023-6-29
// 备注:
//========================================================================
void delay(void)
{
    u8 ms = 200;
    while(ms--);
}

//========================================================================
// 函数: void KeyResetScan(void)
// 描述: P3.2口按键长按1秒触发软件复位,进入USB下载模式。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-11
// 备注:
//========================================================================
void KeyResetScan(void)
{
    if(!P32)
    {
        if(!Key_Flag)
        {
            Key_cnt++;
            if(Key_cnt >= 1000)                //连续1000ms有效按键检测
            {
                Key_Flag = 1;                //设置按键状态,防止重复触发

                USBCON = 0x00;      //清除USB设置
                USBCLK = 0x00;
                IRC48MCR = 0x00;
               
                delay();
                IAP_CONTR = 0x60;   //触发软件复位,从ISP开始执行
                while (1);
            }
        }
    }
    else
    {
        Key_cnt = 0;
        Key_Flag = 0;
    }
}

//========================================================================
// 函数: void timer0_int(void)
// 描述: Timer0 1ms中断函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-11
// 备注:
//========================================================================
void timer0_int(void) interrupt 1  //1ms 中断函数
{
    B_1ms = 1;
}
*/
回复 支持 反对

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-22 16:15:48 | 显示全部楼层
本帖最后由 williamj 于 2023-8-22 16:18 编辑

printf("当前温度=% u\r\n",29);  //使用 printf 函数打印接收数据长度
printf的使用 方便调试程序,如同有LED闪烁提示
到此学习了下载程序和调试程序的准备工作

/*************  功能说明    **************
基于STC32F核心转接板(追风剑)进行编写测试。
MCU通过USB CDC(Communication Device Class)协议识别为串口设备;
******************************************/
#define PRINTF_HID         //printf输出直接重定向到USB接口(包含usb.h前定义)
#include "comm/STC32F.h"  //包含此头文件后,不需要再包含"reg51.h"头文件
#include "comm/usb.h"     //USB调试及复位所需头文件
#include "intrins.h"

/****************************** 用户定义宏 ***********************************/

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

/*****************************************************************************/

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令

void delay_ms(u8 ms);

/******************** 主函数 **************************/
void main(void)
{
    EAXFR = 1; //扩展寄存器(XFR)访问使能

    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;   //设置为准双向口

    usb_init(); //USB接口配置
    EUSB = 1;   //IE2相关的中断使能后,需要重新设置EUSB
    EA = 1;     //打开总中断
   
    while (1)
    {
        if (DeviceState != DEVSTATE_CONFIGURED)  //判断USB设备是否配置完成,配置完成后才可以进行数据收发
        {  continue; }
        if (bUsbOutReady)
        {

            usb_OUT_done(); //接收应答(固定格式)
                        printf("当前温度=% u\r\n",29);  //使用 printf 函数打印接收数据长度
        }

                P2 = 0;
                delay_ms(500);
                P20=P22=P24=P26=P27=1;
                delay_ms(500);
    }
}

//========================================================================
// 函数: void delay(void)
// 描述: 延时函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2023-6-29
// 备注:
//========================================================================
void delay_ms(u8 ms)
{
    u16 i ;
        do
        {
                i = MAIN_Fosc/10000;
                while(--i);
        }while(--ms);
    while(ms--);
}


回复 支持 反对

使用道具 举报 送花

1

主题

23

回帖

137

积分

注册会员

积分
137
发表于 2023-8-22 16:43:24 | 显示全部楼层
1.转换说明符
      %a(%A)     浮点数、十六进制数字和p-(P-)记数法(C99)
      %c             字符
      %d             有符号十进制整数
      %f              浮点数(包括float和double)
      %e(%E)     浮点数指数输出[e-(E-)记数法]
      %g(%G)     浮点数不显无意义的零"0"
      %i              有符号十进制整数(与%d相同)
      %u             无符号十进制整数
      %o             八进制整数    e.g.     0123
      %x(%X)      十六进制整数<?xml:namespace prefix = st1 />()   e.g.   0x1234
      %p             指针
      %s             字符串
      %%            "%"

2.标志
      左对齐:"-"   e.g.   "%-20s"
      右对齐:"+" e.g.   "%+20s"
      空格:若符号为正,则显示空格,负则显示"-"   e.g.   "% "      
      #:对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;
           对e,g,f 类当结果有小数时才给出小数点。

3.格式字符串(格式)
      [标志][输出最少宽度][.精度][长度]类型
     "%-md" :左对齐,若m比实际少时,按实际输出。
     "%m.ns":输出m位,取字符串(左起)n位,左补空格,当n>m or m省略时m=n
                      e.g.    "%7.2s"   输入CHINA
                                             输出"     CH"
     "%m.nf":输出浮点数,m为宽度,n为小数点右边数位
                      e.g.    "%"    输入3852.99
                                               输出3853.0
      长度:为h短整形量,l为长整形量

printf的格式控制的完整格式:
% - .n l或h 格式字符
下面对组成格式说明的各项加以说明:
①%:表示格式说明的起始符号,不可缺少。
②-:有-表示左对齐输出,如省略表示右对齐输出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-18 07:41 , Processed in 0.202156 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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