CHERRY2025 发表于 2025-9-12 08:42:40

开课讲得很好,对单片机有概况介绍,对不同阶段的人群都进行分析。

waershwb 发表于 2025-9-12 14:38:09

冲哥不仅讲课精彩,而且音质也好,像播音员

wuzhengmin 发表于 2025-9-15 09:59:03

七剑下天山之 冲哥 巨大奉献 !《32位8051单片机原理及应用》之具体,详细,非常少见

就算是点灯,也是和实践相结合,非常棒!!!
我们看看蜂鸣器+按键+LED的作业:
先奉上冲个的源程序:
#include "COMM/stc.h"                //调用头文件
#include "COMM/usb.h"
#include "test.h"




char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
       
void sys_init();        //函数声明
void delay_ms(u16 ms);        //unsigned int

void main()                                        //程序开始运行的入口
{
        u8 LED_Data = 0XFE;
       
        u8 num=0;
        u8 LED_DataTab = { 0XFE,0XFD, 0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
       
        sys_init();                                //USB功能+IO口初始化
        usb_init();                                //usb库初始化
        EA = 1;                                        //CPU开放中断,打开总中断。
       
        P6 = LED_Data;
        while(1)                //死循环
        {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();

                }
//                if( KEY1 == 0)
//                {
//                        delay_ms(10);
//                        if(KEY1 == 0 )
//                        {
//                                while(KEY1 == 0 );
//                                BEEP = !BEEP;
//                        }
//                }
                Test();
        }
}
/*
11111110 0XFE
11111101 0XFD
11111011 0XFB
11110111 0XF7
11101111 0XEF
11011111 0XDF
10111111 0XBF
01111111 0X7F
*/

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;
}


上面的Demo.c,下面是test.c:
#include "test.h"

bit Run_Flag = 0;                //0-1 开关机变量
u8Run_Mode = 0;                //0-8 模式几 0:没有模式

bit Run_Now = 0;                //0:停止工作1:开始工作


void Test(void)                //电磁炉的功能
{
        if( KEY1 == 0)                //开关机键
        {
                delay_ms(10);
                if(KEY1 == 0 )
                {
//----------------------还没有开机的时候,执行这个开机功能---------------------                       
                        if( Run_Flag==0 )                        //还没有开机
                        {
                                Run_Flag = 1;                        //开机变量改为1,表示已经开机了
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣
                                P40 = 0;                                //打开led的总电源
                                P6 = 0X00;                                //点亮全部LED
                                delay_ms(200);                        //延时200ms
                                P6 = 0XFF;                                //熄灭全部LED
                        }
//----------------------已经开机的时候,执行这个关机功能---------------------                               
                        else
                        {
                                Run_Flag = 0;
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣       
                                P6 = 0XFF;                                //熄灭全部LED       
                                Run_Mode = 0;                        //模式清0
                                Run_Now       = 0;                        //运行的模式改成停止                       
                        }
                        while(KEY1 == 0 );                //按钮按下,并等待按钮松开
                }
        }
       
        if( KEY2 == 0 )                                        //切换模式
        {
                delay_ms( 10 );
                if( KEY2 == 0 )
                {
                       
                        if( Run_Flag&Run_Now==0 )                //如果没在工作
                        {
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣                       
                                Run_Mode ++;                        //模式选择
                                if( Run_Mode>8 )                //如果模式>8
                                        Run_Mode = 1;                //回到模式1
                               
                                P6 = ~(1<< (Run_Mode-1));                //1<<1      0000 0001 -> 1111 1110
                       
                        }
                        while( KEY2 == 0);                //等待松开执行了
                       
                }
        }
       
        if( KEY3 == 0 )                //按键按下才会执行里面得大括号
        {
                delay_ms( 10 );
                if( KEY3 == 0 )
                {
                        if( Run_Mode>0 )                //已经选择了模式
                        {
                                BEEP = 0;                                //打开蜂鸣
                                delay_ms(10);                        //延时10ms
                                BEEP = 1;                                //关闭蜂鸣                               
                                Run_Now = !Run_Now;                //运行和停止之间的切换
                        }
                        while( KEY3 == 0);                //等待松开执行了
                }
        }
        if( Run_Now == 1 )                //正在运行
        {
                P6 = 0XFF;                                        //全部熄灭
                delay_ms(200);
                P6 = ~(1<< (Run_Mode-1));        //点亮这个灯
                delay_ms(200);
        }
        else                                        //停止运行
        {
                P6 = ~(1<< (Run_Mode-1));
        }

               
       
}


void delay_ms(u16 ms)        //unsigned int
{
        u16 i;
        do
        {
                i = MAIN_Fosc/6000;
                while(--i);
        }while(--ms);
}
配套的test.h:
#ifndef __TEST_H
#define __TEST_H

#include "COMM/stc.h"                //调用头文件
#include "COMM/usb.h"


#define KEY1 P32                //定义一个按键 引脚选择P32
#define KEY2 P33                //定义一个按键 引脚选择P33
#define KEY3 P34                //定义一个按键 引脚选择P34


#define BEEP P54                //定义一个按键 引脚选择P54

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

void delay_ms(u16 ms);
void Test(void);       

#endif

其中test.c中49行:
if( Run_Flag&Run_Now==0 )                //如果没在工作

原来是:
if( Run_Now==0 )                //如果没在工作

我增加了Run_Flag&,这样保证在没有开机的时候,按开始工作和状态选择都没有动作

总之,冲哥对单片机的贡献是很大的,和其他学者不同的是,实用性很强,并且把自己平时的工作过程展现给大家,好难得!

wuzhengmin 发表于 2025-9-21 19:25:55

遇到USB_CDC,CDC模拟串口故障:


在学习冲哥哥视频教学:《32位8051单片机原理及应用》第十七集模数转换器ADC上

的时候,把编译好的Hex文件下载后:串口无法顺利打开,STC的ISP程序进入假死状态,没有反应




wuzhengmin 发表于 2025-9-21 19:27:39

就算侥幸打开串口,也无法关闭串口,显示无反应................

wuzhengmin 发表于 2025-9-21 19:29:54

就像下面这样:

wuzhengmin 发表于 2025-9-23 10:18:25

遇到个问题,在学习14集ADC按键时,冲哥下载后不按下按键,数码管显示是0


而我是显示9,P10口现在是高阻状态,按键0-8 (1-9)按下的显示倒是正常

为甚我的不按下按键,数码管显示是9?

wuzhengmin 发表于 2025-9-23 21:06:58

这几天还是困在ADC键盘扫描的实验里:


if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
                {
                        TIM_10MS_Flag = 0;                                                                        //清空标志位
                       
                       
                        BEEP_RUN();
                       

                       
                       
                        adc_val = ADC_Read(0);
                       
                        //ADC_KeyRead(adc_val);
                        CalculateAdcKey(adc_val);
                       
                        //printf("ADC的值: %d按键键值: %d\r\n",adc_val,(int)KeyCode);
                       
                        SEG0 = KeyCode/10;
                        SEG1 = KeyCode%10;

                }               
其实程序很简单,函数都是用的STC公司的模版直接搬运
但是函数CalculateAdcKey(adc_val);运行后,KeyCode变量的值始终没有改变,static也尝试过
无法完成编译。。。。。。。。。。
硬件环境是STC 大学计划试验箱9.6 2022-12-16


但是,如果直接就使用单文件,改写STC的ADC按键扫描,在同样的硬件环境是可以顺利执行的:


我也把改写的程序传上拉:
文件名字叫“单文件成功”






wuzhengmin 发表于 2025-9-25 09:48:39

反复折腾调试,改写成下面这样:


下载后初始显示变成00,第一次按0--9正常显示,不过马上死机

按SW10显示14后死机

头大啊........................

wuzhengmin 发表于 2025-9-25 09:51:48

其实我不知道完成第一次按键后,程序飞到哪里去了,也不会用Debug来检查,去哪里找人请教呢?
页: 257 258 259 260 261 262 263 264 265 266 [267] 268
查看完整版本: 视频教学:《32位8051单片机原理及应用》,一等奖2万, 送实验箱; 冲哥版