找回密码
 立即注册
楼主: ygyfy

冲哥视频 《STC32位8051单片机原理及应用》学习打卡【已送实验箱】

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-6-28 02:03:11 | 显示全部楼层
本帖最后由 ygyfy 于 2024-6-28 15:56 编辑

第七集 按键点灯 下

主要涉及移位,数组
数组:
类型 数组名[元素个数]={值,值……值};

u8 LED_DataTab[8] = { 0XFE,0XFD, 0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};

其中u8,8位无符号整型变量;LED_Data是数组的名字,中括号中的8表示这个数组有八个元素(值),大括号中是数组8个元素的每个值。
数组的引用,数组名称[下标],如LED_Data[0],LED_Data[1],LED_Data[2]……LED_Data[7],注意下标是从0开始而不是1开始,最大下标为数组元素个数减去1,如本例,最大数组下标为7而不是8.

数组的使用:先定义数组,然后引用,如同之前函数先定义,在引用一样

通过改变数组的值或者引用顺序,可以改变led的点亮顺序和方向以及每次点亮led的个数


本集中P6=0XFE会点亮P6.0的灯,依次引用数组元素会依次点亮P6.0到P6.7

因本人暂时没有试验箱,只能用屠龙刀板做实验,编写程序会依次点亮P2.0到P2.7。
屠龙刀也没反正,就简单写个程序,依次点亮P2.7开始往P2.0跑,每次点亮四个,然后再从2.7开始循环吧

  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/usb.h"
  3. #define MAIN_Fosc 24000000UL        //定义主时钟
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7. void sys_init();        //函数声明
  8. void delay_ms(u16 ms);
  9. void main()                                        //程序开始运行的入口
  10. {
  11.         u8 Led_Data=0xFE;
  12.         int num=4;
  13.         u8 Led_datatab[5]={0XF0,0XE1,0XC3,0X87,0X0F};
  14.         
  15.         sys_init();                                //USB功能+IO口初始化
  16.         usb_init();                                //usb库初始化
  17.         EA = 1;                                        //CPU开放中断,打开总中断。
  18.         
  19.         while(1)                //循环执行
  20.         {
  21.                 if( DeviceState != DEVSTATE_CONFIGURED )
  22.                         continue;
  23.                 if( bUsbOutReady )                                                               
  24.                 {
  25.                         usb_OUT_done();
  26.                 }
  27.                         P2=Led_datatab[num];
  28.                         delay_ms(500);
  29.                         num--;
  30.                         if(num<0)
  31.                         num=4;
  32.         }
  33. }
  34. void sys_init()                //函数定义
  35. {
  36.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  37.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  38.     CKCON = 0; //提高访问XRAM速度
  39.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  40.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  41.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  42.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  43.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  44.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  45.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  46.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  47.         
  48.    
  49.     P3M0 &= ~0x03;
  50.     P3M1 |= 0x03;
  51.     //设置USB使用的时钟源
  52.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  53.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  54.     USBCLK = 0x00;        //使用CDC
  55.     USBCON = 0x90;
  56. }
  57. void delay_ms(u16 ms)        //
  58. {
  59.         u16 i;
  60.         do
  61.         {
  62.                 i = MAIN_Fosc/6000;
  63.                 while(--i);
  64.         }while(--ms);
  65. }
复制代码




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-6-30 03:11:43 | 显示全部楼层

第八集 蜂鸣器
蜂鸣器分为有源蜂鸣器和无源蜂鸣器,有源蜂鸣器内部有振荡源,加上合适的电压就响,控制方便,价格较贵,外形特征是后部是背胶。无源蜂鸣器没有振荡源,直接通电不会响,价格便宜,可用于播放音乐,背部可以看到电路板。
本集涉及原来学过的的知识:.c和.h文件的创建,在keil5中添加文件,添加文件路径;函数使用(定义返回值,定义函数名称,入口参数);取反和移位。
涉及新的知识:函数中使用了bit作为变量,其取值范围是0和1.

硬件原理:通过io口电平控制三极管的通断来让蜂鸣器响

P6<<1+1 之前讲的,P6左移一位,然后+1
                       
                       
P6 = ~(1<< (Run_Mode-1)); 本集,MODE先-1,然后左移1位,然后取反

大致逻辑

按按键1开机

自检(蜂鸣一下,所有灯一起闪一下)

按按键2选择功能

蜂鸣一下,灯跟着移动到对应功能点亮

按按键3使对应功能运行

蜂鸣一下,判断是否已运行,运行则锁定不让再选择其他功能,运行的功能持续闪烁

按按键1关机

蜂鸣一下,将所有灯熄灭,清除功能选择和运行状态使其归零,否则下次将可能导致功能紊乱

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-6-30 04:11:47 | 显示全部楼层
第九集 数码管的静态使用

数码管的本质,是一些LED(发光二极管),按照一定的要求组合在一起,实现显示时间或者字母、图标等功能。正极连在一起的数码管是共阳,负极连在一起的数码管是共阴。
截图202406300410529805.jpg

码表写的时候低位在后高位在前。

以8位2进制数,需要点亮的部分其对应io口电平置低电平。

在excel里面将10进制转化成16进制挺好用,输入=dec选择DEX2HEX然后选择要转换的10进制所在的表格然后回车。

根据笔画,选择需要点亮的对应的二进制转化成10进制使其通过对应端口输出对应需要的电平即可。

本集算是之前学过的按键点灯和蜂鸣器章节的拓展,只要理解数码管的本质即可实现本章学习

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-7-1 16:40:17 | 显示全部楼层
本帖最后由 ygyfy 于 2024-7-1 17:40 编辑

第10集 数码管的动态显示

点亮一位数码管:位码→段码→延时
点亮多个数码管:第一个数码管的位码→段码→延时→第2个数码管的位码→段码→延时→……第N个数码管的位码→段码
单个数码管延时在1ms左右,所有数码管的总延时加起来控制在20ms左右,即全部数码管刷新控制在50Hz以上,否则将明显闪烁。
定义段码数组,将0-9,0-9带小数点的16进制写在里面。
u8 SEG_Tab[20] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

定义位码数组,通过控制com0-com7控制其位码来点亮不同的数码管
u8 COM_Tab[8] = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe };

定义一个8位变量num,通过函数调用上面数组,进而控制点亮某位数码管并使其显示指定的数字。
TimCount是计数器?暂时没学过,不太了解。




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-7-2 00:42:13 | 显示全部楼层
第11集 定时器的使用

STC32G 系列内部包含了 5 个24 位定时器/计数器。

定时器是一个加法计算器,只能做加法。
设置为ET0=1和IE=0X02效果是相等的,前者更方便且不影响别的位。
TM0PS 定时器0的8位预分频寄存器,默认为0
默认不做设置的时候,是12分频器


        Timer0_Init();                        //定时器0初始化
        INT0_Init();                        //外部中断0初始化

放在主函数中EA=1(中断总开关)前面。


interrupt这个关键字,一定不能错,这是中断特有的关键字


STC32G规格书中可以查到所有定时器的中断号,定时器0的中断号是1
学会使用STCAI-ISP自带的定时器计算器,更加快捷方便。

没有试验箱只有屠龙刀,暂时不方便模拟

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-7-3 01:41:44 | 显示全部楼层

第13集 简单多任务处理 上

学习模块化编程
复习:


创建程序文件三部曲
新建文件夹并保存,添加到工程(双击source Group1选择.c文件),添加引用路径(kile软件魔术棒→c251→include paths→……选择文件夹)


函数定义三步:定义,声明,调用

新知识:
关键字 :extern
用在变量或者函数的声明前,用来说明这个变量或函数是在别处定义的,要在此处引用。
extern修饰的变量不能赋初值


bdata 位寻址变量,可以单独的寻找每一个位
用sbit关键词去定义每一个位,每一位都可以重新命名。


static 静态变量
它的特点是,只有第一次执行的时候才会给它赋值,之后在该函数所有的执行次数中,它的值都是上一次函数执行结束后的值,即它可以保持前次的执行结果。



if……else if语句



        if (条件)       {语句 1;}

        else if (条件 2) {语句 2;}
        else if (条件 3) {语句 3;}
        ... ...
        else                    {语句 n;}
他的执行过程是:依次判断条件表达式的值,当出现某个值为“真”时,则执行相对应的语句,然后跳出整个 if的语句块,执行“语句 n”后面的程序;如果所有的表达式都为“假”,则执行 else 分支的“语句 n”后,再执行“语句 n”后边的程序。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:563
  • 最近打卡:2025-07-03 07:52:42
已绑定手机

1

主题

838

回帖

1785

积分

金牌会员

积分
1785
发表于 2024-7-3 08:25:56 | 显示全部楼层
持之以恒
靡不有初,鲜克有终
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-7-4 03:57:01 | 显示全部楼层

第13集 简易多任务处理器 中

.h文件的规范书写

头文件
引脚定义
变量声明
函数声明

垂直范围内的代码选择

shift+ALT和鼠标配合

截图202407040334504629.jpg

这功能挺好,之前看冲哥操作过几次没看明白是怎么回事

截图202407040345076282.jpg

截图202407040345437901.jpg

截图202407040346143596.jpg

按键按下的时间检测不能一直增加,因为会溢出

摘自其他书籍:

当我们程序中写 TR0 = 1 以后,定时器值就会每经过一个机器周期自动加 1,当我们程序中写 TR0 = 0以后,定时器就会停止加 1,其值会保持不变化。TF0,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成 16 位的模式,那么每经过一个机器周期,TL0加 1 一次,当 TL0 加到 255 后,再加 1,TL0 变成 0,TH0 会加 1 一次,如此一直加到 TH0和 TL0 都是 255(即 TH0 和 TL0 组成的 16 位整型数为 65535)以后,再加 1 一次,就会溢出了,TH0 和 TL0 同时都变为 0,只要一溢出,TF0 马上自动变成 1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-7-5 23:49:23 | 显示全部楼层

补 第12集 计数器的使用

T1_GATE:控制定时器1,置1时只有在INT1脚为高及TR1控制位置1时才可打开定时器/计数器1。
T1_C/T:控制定时器1用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作计数器(对引脚T1/P3.5外部脉冲进行计数)。

本集用作计数器时,T1_GATE=0,T1_C/T=1;

数字电平从0变为1 的那一瞬间叫作上升沿 ,从1到0的那一瞬间叫作下降沿。

定时器1的中断号是3.

单独一个位取反用!,如P60!=P60;//将P60的电平读取出来然后取反然后再赋值给P60.

学会使用ISP中自带的io端口配置工具设置io口,如打开内部4.1K上拉电阻。

M法测速:又叫频率测量法。在一个固定的时间内(以s为单位),统计这段时间内的变卖其脉冲数,计算速度值。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-01-30 03:33:01

2

主题

44

回帖

667

积分

高级会员

积分
667
发表于 2024-7-6 03:58:32 | 显示全部楼层

第13集 简单多任务处理 下

根据中集的列表进行按键状态的判断和读取



涉及for循环语句,摘自其他书籍:


for语句
在 C 语言中,for 语句最为灵活,它将一个由多条语句组成的代码块执行特定的次数。for语句也称for循环,因为程序通常会执行此语句多次。for语句的一般使用格式如下。

for(表达式1;表达式2;表达式3)  
语句   

上述格式语句的执行过程如下。
1)先求解表达式1。
2)求解表达式 2,如果值为真(非 0) ,则执行 for 语句中指定的内嵌语句,然后执行下面第 3 步;如果值为假(0) ,则结束循环,转到第5步。
3)求解表达式3。
4)转回上面第2步继续执行。
5)循环结束,执行for语句下面的一个语句。


具体流程如图所示




截图202407060349429906.jpg

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-3 10:24 , Processed in 0.129226 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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