找回密码
 立即注册
查看: 17268|回复: 80

冲哥视频学习笔记

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2023-2-21 17:19:34 | 显示全部楼层 |阅读模式
本帖最后由 lclbf 于 2023-5-24 11:16 编辑

首先感谢STC官网免费提供学习视频。发个帖子的目的:主要是借官方网站保存自己学习记录,再是自己学习遇到的问题,
写出来,避免下次出同样的错误,也给同样的初学者出现同样的问题,提供解决的办法。后面有对应程序的压缩文件。

很多图片来自官方数据手册和冲哥讲义文档,再次感谢!!!

第1个程序:用寄存器点亮一个灯。

实验程序如下:

/**屠龙刀2022-6-20版***/

sfr P2   = 0XA0;//用到的P2口相关寄存器设置
sfr P2M0 = 0X96;
sfr P2M1 = 0X95;

sbit P21 = P2^1;

void main()
{
        P2M0 = 0X00;//P2口初始化为准双向口
        P2M1 = 0X00;
        
        while(1)
        {
                P21 = 0;//P21口输出低电平,点亮LED,
        }
}


第2个程序:流水灯

实验程序如下:

/**屠龙刀2022-6-20版***/

#include "STC32G.h"

unsigned char cnt = 0;

bit flag = 0; //流水标志

void Delay100ms();

void main()
{
        static unsigned char temp = 0x01;
        unsigned char i;
        
        P2M0 = 0X00;//P2口初始化为准双向口
        P2M1 = 0X00;
        
        while(1)
        {
//                /************方法1 左右流水灯***********/
//                P2 = ~temp;
//                temp = temp<<1;
//                                
//                if(temp == 0X70)
//                {
//                        temp = 0X01;
//                }
//                Delay100ms();
//               
//                if(flag==0)
//                {
//                        P2 = ~(0x01<<cnt);
//                Delay100ms();
//                cnt++;
//                if(cnt>=8)
//                {
//                        flag = 1;
//                        cnt = 0;
//                }
//                }
//               
//                else
//                {
//                        P2 = ~(0x80>>cnt);
//                Delay100ms();
//                cnt++;
//                if(cnt>=8)
//                {
//                        flag = 0;
//                        cnt = 0;
//                }
//                }
               
///************方法2 右移动流水灯***********/                        
//                for(i = 0;i < 9;i++)
//                {
//                        P2 = ~(0x01 << i);                        //P2口正向流水灯,移位法
//                        Delay100ms();                                                //延时500毫秒
//                }


/************方法3 ***********/
                P2 = 0XFE;
                Delay100ms();
                P2 = 0XFD;
                Delay100ms();
                P2 = 0XFB;
                Delay100ms();
                P2 = 0XF7;
                Delay100ms();
                P2 = 0XEF;
                Delay100ms();
                P2 = 0XDF;
                Delay100ms();
                P2 = 0XBF;
                Delay100ms();
                P2 = 0X7F;
                Delay100ms();
               
        }
}

void Delay100ms()                //@24.000MHz
{
        unsigned long i;

        _nop_();
        _nop_();
        i = 599998UL;
        while (i) i--;
}

第2个程序: HIDI不断电下载点亮LED
   此程序在编译的时候出现警告,不影响效果,也可以自动下载。通过反复对比冲哥程序,
没有问题,把冲哥程序复制过去也会出现警告。后面反复对比设置,发现设置有问题,

冲哥视频学习笔记-1.png

在Options for Target 'Target1'里面L251 Misc下面有个disable Waming Numbers;冲哥里面有个57,
我的里面是空白,输入57,警告就没有了。我把这个数字改成30,56, 58都会出现警告,后面在
学习的QQ群问了,有群友回复:说的的警告有L57的提示,一看警告前面全都有L57。

实验程序如下:
/**屠龙刀2022-6-20版***/

#include "stc.h"
#include "usb.h"

void sys_init(); //系统初始化

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


void main()
{
        
        sys_init();  //系统初始化
        usb_init();  //USB初始化
        EA = 1;      //打开总中断
        
        while (1)
        {
//                P2 = 0X0F;//点亮P2口高4位灯
                P2 = 0Xf0;//点亮P2口低4位灯
        }
}


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

    P2M0 = 0X00;        //P2口初始化为准双向口
    P2M1 = 0X00;
   
    P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
    P3M1 |= 0x03;
        
    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定
}



第4个程序:CDC不断电下载点亮LED
   这个程序在实验的时候也出现警告,当时测试时,第3个程序的警告还没有解决。原因和解决办法一样。只是警告数量不一样,
警告前面都有L57。重新设置一下,警告就没有了。





实验程序如下:
/**屠龙刀2022-6-20版***/

#include "stc.h"
#include "usb.h"

void sys_init();

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

sbit P21 = P2^1;
sbit P22 = P2^2;

void main()
{
        
        sys_init();
    usb_init();  //USB初始化
    EA = 1;
   
    while (1)
    {
      P2 = 0X0F; //点亮P2口高4位
//                        P22 = 0;    //点亮P2.2口灯
    }
}


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

    P0M0 = 0X00;         //P0口初始化准双向口
    P0M1 = 0X00;
    P2M0 = 0X00;  //P2口初始化准双向口
    P2M1 = 0X00;
        
    P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
    P3M1 |= 0x03;
   
    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));  //等待时钟稳定
        
    USBCLK = 0x00;//用CDC不断电下载,必须要这两行,HID下载不用
    USBCON = 0x90;
}


第5个程序:打印C语言运算符和进制数
    此实验时也出现打印不是自己想要的内容,如下图所示:后面在QQ群问群友解决了.

冲哥视频学习笔记-3.png
出现上面问题的问题原因是:config.h文件里面宏定义问题,把打印设置到数码管输出了,如下图所示:
冲哥视频学习笔记-4.png

更改为下图就可以了:
冲哥视频学习笔记-5.png
输出结果正确如下图:
冲哥视频学习笔记-6.png
第二个问题:
“printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(100)=1.没有想明白为啥”
看见的朋友若是知道,麻烦回复一下。自己理解是不是“%u”里面有个%的原因。

冲哥视频学习笔记-7.png

冲哥给了回复:%在c语言里属于强制转义符,如果想单纯的输出%,而不是作为其他用途的话,在需要输出%的地方写入“%%”,这样两个%就可以了
如下图所示:
冲哥视频学习笔记-1.png

实验程序如下:

/**屠龙刀2022-6-20版***/

#include "stc.h"
#include "usb.h"

void sys_init();

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


void main()
{
        
        sys_init();
        usb_init();  //USB初始化
        EA = 1;
        
        while (1)
        {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();
                        printf("1.12=%.3f\r\n",1.12);
                        printf("1<<3=%u \r\n",1<<3);
                        printf("1&3=%u \r\n",1&3);
                        printf("1|3=%u \r\n",1|3);
                        printf("~3=%u \r\n",~3);
                        printf("!3=%u \r\n",!3);
                        printf("当前温度为:%0.1f°\r\n",25.5);
                        printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(100)=1.没有想明白为啥
                        printf("100/3=%u \r\n",100/3);  
                        printf("(3+(5取余3)-2)=%u \r\n",3+(5%3)-2);
                }
        }
}


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

        P3M0 = 0X00;   //P3口设置为准双向口
        P3M1 = 0X00;
        
        P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
        P3M1 |= 0x03;
        
        //设置USB使用的时钟源
        IRC48MCR = 0x80;    //使能内部48M高速IRC
        while (!(IRC48MCR & 0x01));  //等待时钟稳定

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


第6个程序: LED闪烁和花样式点灯

实验程序如下:


/**屠龙刀2022-6-20版***/

#include "stc.h"
#include "usb.h"

//#define MAIN_Fosc  24000000UL

void sys_init();
void delay_ms(u16);

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


void main()
{
        u8 a;
        sys_init();
        usb_init();  //USB初始化
        EA = 1;
        
        while (1)
        {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();
                        a = 10;
                        
//                        do{
//                                printf("%u\r\n",a++);//10 11 12 13 14
//                        }while(a<15);
                        
                        do{
                                printf("%u\r\n",++a);//11 12 13 14 15
                        }while(a<15);
                                
//                        while(a<15)
//                        {
//                                printf("%u\r\n",++a);//11 12 13 14 15
//                        }
                        
//                while(a<15)
//                        {
//                                printf("%u\r\n",a++);//10 11 12 13 14
//                        }
//               
                }
///***********P2口灯全部闪烁****************/
//                P2 = 0X00;        //点亮P2口
//                delay_ms(200);
//                P2 = 0Xff;         //熄灭P2口
//                delay_ms(200);
               
/***********P2口灯花样灯****************/               
        P2 = 0XFE;       //点亮P2.0口
        delay_ms(200);
        P2 = 0Xff;                        //熄灭P2.0口
        delay_ms(200);        
        
        P2 = 0XFD;                        //点亮P2.1口
        delay_ms(200);
        P2 = 0Xff;                        //熄灭P2.1口
        delay_ms(200);

        P2 = 0XFB;                        //点亮P2.2口
        delay_ms(200);
        P2 = 0Xff;                        //熄灭P2.2口
        delay_ms(200);

        P2 = 0XF7;     //点亮P2.3口
        delay_ms(200);
        P2 = 0Xff;                        //熄灭P2.3口
        delay_ms(200);
        
        P2 = 0XEF;     //点亮P2.4口
        delay_ms(200);
        P2 = 0Xff;                        //熄灭P2.4口
        delay_ms(200);
        
        P2 = 0XDF;     //点亮P2.5口
        delay_ms(200);
        P2 = 0Xff;                        //熄灭P2.5口
        delay_ms(200);
        
        P2 = 0XBF;     //点亮P2.6口
        delay_ms(200);
        P2 = 0Xff;                        //熄灭P2.6口
        delay_ms(200);
        
        P2 = 0X7F;    //点亮P2.7口
        delay_ms(200);
        P2 = 0Xff;                //熄灭P2.7口
        delay_ms(200);
        
        P2 = 0X0F;    //点亮高4位
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
        
        P2 = 0XF0;    //点亮低4位
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
               
        P2 = 0X7E;    //点亮P2.7 P2.0
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
        
        P2 = 0XBD;    //点亮P2.6 P2.1
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
        
        P2 = 0XDB;    //点亮P2.5 P2.2
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
        
        P2 = 0XE7;    //点亮P2.4 P2.3
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
        
        P2 = 0X00;    //P2口灯全亮
        delay_ms(200);
        P2 = 0Xff;    //P2口灯全灭
        delay_ms(200);
        
        P2 = 0XE7;    //点亮P2.4 P2.3
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
        
        P2 = 0XDB;    //点亮P2.5 P2.2
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
        
        P2 = 0XBD;    //点亮P2.6 P2.1
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
        
        P2 = 0X7E;    //点亮P2.7 P2.0
        delay_ms(200);
        P2 = 0Xff;                //熄灭
        delay_ms(200);
               
        }
}


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

        P1M0 = 0X00;    //P1口设置为准双向口
        P1M1 = 0X00;
        P2M0 = 0X00;   //P2口设置为准双向口
        P2M1 = 0X00;   
        P3M0 = 0X00;   //P3口设置为准双向口
        P3M1 = 0X00;
        
        P3M0 &= ~0x03;  //P3.0 P3.1口设置高阻输入
        P3M1 |= 0x03;
        
        //设置USB使用的时钟源
        IRC48MCR = 0x80;    //使能内部48M高速IRC
        while (!(IRC48MCR & 0x01));  //等待时钟稳定

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


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


第7个程序:模块化编程SOS求救灯

     学习这个的时候也有点小插曲,编译出现错误。代号L127 L128。如下图所示:

冲哥视频学习笔记-1.png

后面发现,是忘就添加delay.c和math.c文件。

冲哥视频学习笔记-2.png

后面通过反复找原因,反复看冲哥视频,对比以前的学习资料,找到这个问题,添加后,编译没有问题了。

冲哥视频学习笔记-3.png

实验程序如下:
main函数:

/**屠龙刀2022-6-20版***/

#include "stc.h"
#include "usb.h"
#include "delay.h"
#include "math.h"

#define MAIN_Fosc  24000000UL

void sys_init();
void delay_ms(u16 ms);
//int Add(u16 Number1,u16 Number2);
//int Sub(u16 Number1,u16 Number2);
//int Mul(u16 Number1,u16 Number2);
//int Div(u16 Number1,u16 Number2);

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


void main()
{
        sys_init();
        usb_init();  //USB初始化
        EA = 1;
        
        while (1)
        {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();
                        printf("计算Add(3,7)的结果为:%u\r\n",Add(3,7));
                        printf("计算Sub(10,5)的结果为:%u\r\n",Sub(10,5));
                        printf("计算Mul(10,5)的结果为:%u\r\n",Mul(10,5));
                        printf("计算Div(10,5)的结果为:%u\r\n",Div(10,5));
                }
/*********P2口灯闪烁3次间隔时间200ms,再闪烁3次间隔时间600ms,
                再闪烁3次间隔时间200ms,反复循环********************/
                P2 = 0X00;     //P2口灯亮
                delay_ms(200); //延时200ms
                P2 = 0Xff;                  //P2口灯熄灭
                delay_ms(200);
                P2 = 0X00;
                delay_ms(200);
                P2 = 0Xff;
                delay_ms(200);
                P2 = 0X00;
                delay_ms(200);
                P2 = 0Xff;
                delay_ms(200);
               
                P2 = 0X00;                                //P2口灯亮
                delay_ms(600);    //延时600ms
                P2 = 0Xff;        //P2口灯熄灭
                delay_ms(600);   
                P2 = 0X00;
                delay_ms(600);
                P2 = 0Xff;
                delay_ms(600);
                P2 = 0X00;
                delay_ms(600);
                P2 = 0Xff;
                delay_ms(600);
               
                P2 = 0X00;
                delay_ms(200);
                P2 = 0Xff;
                delay_ms(200);
                P2 = 0X00;
                delay_ms(200);
                P2 = 0Xff;
                delay_ms(200);
                P2 = 0X00;
                delay_ms(200);
                P2 = 0Xff;
                delay_ms(200);
        }
}


void sys_init()
{
        WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        CKCON = 0; //提高访问XRAM速度
        
/*******************************
        PnM1  PnM0
         0      0    准双向口
         0      1    推挽输出
         1      0    高阻输入
         1      1    开漏输出
        
        
        
**********************************/
        
        P1M0 = 0X00;         //P1口设置为准双向口
        P1M1 = 0X00;
        P2M0 = 0X00;  //P2口设置为准双向口
        P2M1 = 0X00;
        P3M0 = 0X00;  //P3口设置为准双向口
        P3M1 = 0X00;
        
        P3M0 &= ~0x03; //P3.0 P3.1口设置高阻输入
  P3M1 |= 0x03;
        
        //设置USB使用的时钟源
        IRC48MCR = 0x80;    //使能内部48M高速IRC
        while (!(IRC48MCR & 0x01));  //等待时钟稳定

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


延时函数(delay.h)头文件:


#ifndef __DELAY_H__
#define __DELAY_H__

#include "stc.h"

void delay_ms(u16 ms);

#endif


延时函数(delay.c)C文件:


#include "delay.h"

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


数学运算(math.h)头文件:


#ifndef __MATH_H__
#define __MATH_H__

#include "stc.h"

int Add(u16 Number1,u16 Number2);
int Sub(u16 Number1,u16 Number2);
int Mul(u16 Number1,u16 Number2);
int Div(u16 Number1,u16 Number2);

#endif


数学运算(math.c) C文件:


#include "math.h"

int Add(u16 Number1,u16 Number2)//加法计算
{
        return Number1+Number2;       //返回两个数的和
}

int Sub(u16 Number1,u16 Number2)  //减法计算
{
        return Number1-Number2;       //返回两个数的差
}

int Mul(u16 Number1,u16 Number2)  //乘法计算
{
        return Number1*Number2;       //返回两个数的积
}

int Div(u16 Number1,u16 Number2)  //除法计算
{
        return Number1/Number2;       //返回两个数的商
}


第8个程序:按键控制灯
此实验的时候发现了一个问题,按键按下移动灯,需要 加延时,后面自己解决了,没有想明白具体是啥原因。如下图所示:有文字描述。
冲哥视频学习笔记-1.png
下面的程序不加延时也可以。
冲哥视频学习笔记-2.png
冲哥视频学习笔记-3.png

实验程序如下:

/**屠龙刀2022-6-20版***/

#include "stc.h"
#include "usb.h"

#define MAIN_Fosc 24000000UL

#define Key1 P32
#define Key2 P33

void sys_init();
void delay_ms(u16);

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


void main()
{
        u8 LED = 0XFE;
        u8 num = 0;
        u8 LedChar[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
        P2 = 0Xfe;
        
        sys_init();
        usb_init();  //USB初始化
        EA = 1;
        
        while (1)
        {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();
                        
//                        printf("%.1f\r\n",1.12);
                }
///************(Key1)P32按下点亮P20,(Key2)P33按下熄灭P20**************/
//                if(Key1 == 0)
//                        {
//                                delay_ms(10);
//                                if(Key1 == 0)
//                                {
//                                        printf("P32按键按下\r\n");
//                                        P20 = 0;                        
//                                }
//                        }
//                        if(Key2 == 0)
//                        {
//                                delay_ms(10);
//                                if(Key2 == 0)
//                                {
//                                        printf("P33按键按下\r\n");
//                                        P20 = 1;                        
//                                }
//                        }
        
///************(Key1)P32按下点亮P20,松开灯熄灭**************/
//if(Key1 == 0)
//                        {
//                                delay_ms(10);
//                                if(Key1 == 0)
//                                {
//                                printf("P32按键按下\r\n");//打印按键动作输出,按键按下就打印
//                                        P20 = 0;                        
//                                }
//                                else
//                                {
//                                        P20 = 1;
//                                }
//                        }

///************(Key2)P33按下P20灯取反**************/                        
//                if(Key2 == 0)
//                        {
//                                delay_ms(10);
//                                if(Key2 == 0)
//                                {
//                                printf("P33按键按下\r\n"); //打印按键动作输出,按键按下就打印
//                                        P20 = !P20;         //按键按下动作
//                                        while(Key2 == 0)
//                                        {                                       
//                                        }
//                                        P20 = !P20;         //按键松开动作
//                                }
//                        }        


///************(Key2)P33按下P2灯取反**************/                        
//                if(Key2 == 0)
//                        {
//                                delay_ms(10);
//                                if(Key2 == 0)
//                                {
////                                printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
//                                        P2 = ~P2; //按键按下动作
//                                        while(Key2 == 0);
////                                        P2 = ~P2; //按键松开动作

//                                }
//                        }        
                        
                        
///************(Key2)P33按下P2灯左移**************/                        
                if(Key2 == 0)
                        {
                                delay_ms(10);
                                if(Key2 == 0)
                                {
                                        printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
//                                        while(Key2 == 0); //while(Key2 == 0)不能放这个位置,放这个位置不加延时灯不变化
                                        P2 = ((P2 << 1)+1);
                                        delay_ms(1);                //延时解决        while(Key2 == 0);不同位置,灯不变化的问题               
//                                        while(Key2 == 0);         //while(Key2 == 0)只能放这个位置,不用此句,按键按下灯也不变化                                
                                        if(P2 == 0XFF)//不能放在while(Key2 == 0)前面,否则按键按下不动作,加有延时就可以
                                        P2 = 0XFE;
                                        while(Key2 == 0); //while(Key2 == 0)不能放这个位置,放这个位置不加延时灯不变化
                                }
                        }
                        
/////************(Key2)P33按下P0灯左移 变量操作**************/                        
//                                if(Key2 == 0)
//                                                        {
//                                                                delay_ms(10);
//                                                                if(Key2 == 0)
//                                                                {
//                                                                        printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
////                                                                        while(Key2 == 0); //防此位置按键松手,才起作用
//                                                                        LED  = ((LED  << 1)+1);                                                                        
//                                                                        if(LED  == 0XFF)//不能放在while(Key2 == 0)前面,否则按键按下不动作
//                                                                        LED  = 0XFE;
//                                                                        P2 = LED ;
//                                                                        while(Key2 == 0);//防此位置按键按下,就起作用
//                                                                }
//                                                        }
                                                        
///************(Key2)P33按下P0灯左移 数组法**************/                        
//                                if(Key2 == 0)
//                                                        {
//                                                                delay_ms(10);
//                                                                if(Key2 == 0)
//                                                                {
//                                                                        printf("P33按键按下\r\n");//打印按键动作输出,按键按下就打印
////                                                                        while(Key2 == 0); //防此位置按键松手,才起作用
//                                                                        LED  = LedChar[num];                                                                                                                                                
//                                                                        num++;
//                                                                        if(num == 8)
//                                                                                num = 0;
//                                                                        P2 = LED;
//                                                                        while(Key2 == 0);//防此位置按键按下,就起作用
//                                                                }
//                                                        }
                                                        
                        }
}                        


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

        P0M0 = 0X00;         //P0口设置为准双向口
        P0M1 = 0X00;
        P1M0 = 0X00;         //P1口设置为准双向口
        P1M1 = 0X00;
        P2M0 = 0X00;         //P2口设置为准双向口
        P2M1 = 0X00;        
        P3M0 = 0X00;         //P3口设置为准双向口
        P3M1 = 0X00;
        
        P3M0 &= ~0x03; //P3.0,P3.1设置为高阻输入
  P3M1 |= 0x03;
        
        //设置USB使用的时钟源
        IRC48MCR = 0x80;    //使能内部48M高速IRC
        while (!(IRC48MCR & 0x01));  //等待时钟稳定

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


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


第9个程序:驱动蜂鸣器发声
很久没有更新,今天抽个空更新。我没有有源蜂鸣器,是无源蜂鸣器,声音没有视频的好听,板子是自己做的扩展板。
冲哥视频学习笔记-1.png
冲哥视频学习笔记-2.png
程序如下:

#include "stc.h"
#include "usb.h"

#define MAIN_Fosc 24000000UL

#define Beep P10  //蜂鸣器为P10口
#define Key P32   //按键P32口

bit BeepFlag = 0; //蜂鸣器工作标志,默认不响

void sys_init(); //系统初始化
void delay_ms(u16); //延时函数

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


void main()
{        
        sys_init();   //系统初始化
        usb_init();  //USB初始化
        EA = 1;      //开总中断
               
        while (1)
        {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();                                                
                }
               
///**********按键按下不松手蜂鸣器响************/
//        if(Key==0)  //按键按下
//        {
//                delay_ms(10);  //延时10ms
//                if(Key==0)  //按键再次确认按下
//                {
//                        printf("Key已经按下!\r\n");
//                        BeepFlag = 1; //蜂鸣器响
//                        while(Key==1);//Key==0测试按键按下时蜂鸣器不
//                        //响,松开蜂鸣器就响一下;Key==1测试按下按键不松手
//                        //蜂鸣器就一直响,按键松开,蜂鸣器不响。
////                        BeepFlag = 1;        //此行放在while(Key==1);前面效果一样                        
//                }
//                else
//                {
//                        BeepFlag = 0;//蜂鸣器停止响
//                }
//               
//                if(BeepFlag == 1) //蜂鸣器响
//                {
//                        BeepFlag == 0; //蜂鸣器停止响
//                        Beep = 0;      //蜂鸣器停止响
//                        delay_ms(20); //延时20ms
//                        Beep = 1;     //蜂鸣器响
//                        delay_ms(50); //延时50ms
//                }
//                else
//                {
//                        BeepFlag == 1;    //蜂鸣器响
//                        Beep = 1;        //蜂鸣器响
//                }        
//        }
               
/**********按键控制蜂鸣器响停************/
if(Key==0)  //按键按下
        {
                delay_ms(10); //延时10ms
                if(Key==0)    //按键再次确认按下
                {
                        printf("Key已经按下!\r\n");//打印输出按键按下
                        BeepFlag = ~BeepFlag; //蜂鸣器状态翻转
                        while(Key==0);//若是Key==1就不能实现按一下按键翻转
//                        BeepFlag = ~BeepFlag;//此行放在while(Key==1);前面效果一样                        
                        
                }
        }        
                if(BeepFlag == 1) //若蜂鸣器响
                {                        
                        Beep = 0; //蜂鸣器停止响
                        delay_ms(5);//延时5ms
                        Beep = 1;   //蜂鸣器响
                        delay_ms(5);//延时5ms
                }
                else
                {
                        Beep = 1;//蜂鸣器响
                }
               
               
        
        }
}                        


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

        P0M0 = 0X00; //P0口设置为准双向口
        P0M1 = 0X00;
        P1M0 = 0X00; //P1口设置为准双向口
        P1M1 = 0X00;
        P2M0 = 0X00; //P2口设置为准双向口
        P2M1 = 0X00;
        
        P3M0 = 0X00; //P3口设置为准双向口
        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)
{
        u16 i;
        
        do{
                i = MAIN_Fosc/6000;
                while(--i);
        }while(--ms);
}


第10个程序:按键控制LED灯和蜂鸣器1,按键处理控制LED灯和蜂鸣器2
按键控制LED灯和蜂鸣器1,只是使用了两个按键,用来模拟电磁炉的开关机和功能切换。
按键控制LED灯和蜂鸣器2,采用了多函数方法,添加了专用的KEYLED.H KEYLED.C函数
同时增加了按键3,实现了用LED灯来模拟电磁炉功能切换和开关机,还进行了工作状态指示。

程序压缩见后面附件。

第11个程序:数码管静态显示

1,这个程序学习的时候遇到一个问题,如下:

// 减法循环
        P2 = SegLED [Num]; //用数组来实现显示
        if(Num > 0)
        {
                Num--;      //循环数自减
                if(Num <= 0)    //为什么减法最低不能到0?
                                       //也就是说不显示0,最小显示1又变成9 了
                {
                        Num = 9;
                }
        }        
        delay_ms(500);   //延时500ms

数码管不能显示0,显示到1又变成9了。

2,通过一个按键设置数码管显示数字0-9循环,在按一下另外一个按键的时候,数码管上显示的数字几,
蜂鸣器就响几声
     老师的这个作业没有想到方法来实现。
程序文件见后面附件压缩文件包。

第12个程序:数码管动态显示
没有对应的硬件,自己用屠龙刀2022-6-20,自己搭接的四位数码管,硬件接口如下:

P0.1 数码管最低位阳极控制开关,低电平开。
P0.2 数码管次低位阳极控制开关,低电平开。
P0.3 数码管次高位阳极控制开关,低电平开。
P0.4 数码管最高位位阳极控制开关,低电平开。
P2.0-P2.7对应数码管a b c d e f g dp。
P7.5 蜂鸣器控制

硬件不同,程序也和冲哥视频有区别。
程序压缩 见后面附件。



1 点亮一个LED.rar

14.89 KB, 下载次数: 236

2 流水灯.rar

39.17 KB, 下载次数: 232

3 HIDI不断电下载点亮LED.rar

112.59 KB, 下载次数: 246

4 CDC不断电下载点亮LED.rar

109.3 KB, 下载次数: 238

5 打印C语言运算符和进制数.rar

111.22 KB, 下载次数: 242

6 LED闪烁和花样式点灯.rar

113.3 KB, 下载次数: 225

7 模块化编程SOS求救灯.rar

121.33 KB, 下载次数: 226

8 按键控制灯.rar

113.14 KB, 下载次数: 224

9 驱动蜂鸣器发声.rar

112.63 KB, 下载次数: 225

10 按键控制LED和蜂鸣器1.rar

113.8 KB, 下载次数: 222

10 按键控制LED和蜂鸣器2.rar

128.82 KB, 下载次数: 213

11 数码管静态显示.rar

115.07 KB, 下载次数: 223

12 数码管动态显示.rar

117.6 KB, 下载次数: 220

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-2-22 09:14:15 | 显示全部楼层
:handshake楼主很棒
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2023-2-22 10:46:09 | 显示全部楼层

学习遇到问题,冲哥多指点!

点评

嗯嗯,有问题随时留言  发表于 2023-2-22 15:14
  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2023-2-22 15:45:13 | 显示全部楼层
lcl*** 发表于 2023-2-22 10:46
学习遇到问题,冲哥多指点!

printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(100)=1.没有想明白为啥? 是不是“%u”这里有“%”的原因?

点评

%在c语言里属于强制转义符,如果想单纯的输出%,而不是作为其他用途的话,在需要输出%的地方写入“%%”,这样两个%就可以了  发表于 2023-2-22 16:54
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-27 14:40:11
已绑定手机

16

主题

468

回帖

2165

积分

版主

积分
2165
QQ
发表于 2023-2-22 16:48:01 | 显示全部楼层
棒棒的
www.STCAI.com
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2023-2-22 16:57:53 | 显示全部楼层
lcl*** 发表于 2023-2-22 15:45
printf("(100取余3)=%u \r\n",100%3); //"(100%3)=%u \r\n",100%***若是这样输入100%3,打印输出为:(1 ...

谢谢,就是你说这个原因!
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-2-22 17:09:22 | 显示全部楼层
lcl*** 发表于 2023-2-22 16:57
谢谢,就是你说这个原因!

:lol
  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2023-2-22 17:29:04 | 显示全部楼层

在上面我更新了,附有图片。
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-2-22 17:32:12 | 显示全部楼层
lcl*** 发表于 2023-2-22 17:29
在上面我更新了,附有图片。

:handshake嗯恩,有这个求知的心看起来非常适合学习,这几步剪视频的时候好像不小心删掉了,在论坛里其实有个帖子里面做了详细描述和解决办法,楼主能自己发现问题并尝试解决问题的心态非常好,到后面建议也可以尝试着做一下课后练习,会很有帮助。加油
  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-30 07:42:48

19

主题

205

回帖

816

积分

高级会员

积分
816
发表于 2023-2-23 08:59:42 | 显示全部楼层
电子DI*** 发表于 2023-2-22 17:32
嗯恩,有这个求知的心看起来非常适合学习,这几步剪视频的时候好像不小心删掉了,在论坛里其实 ...

学了20多年了,还没有学会。不知道是不是我方法不对,现在把希望寄托在你的视频上。有问题要多麻烦你。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-3 00:41 , Processed in 0.144130 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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