找回密码
 立即注册
楼主: 千年老姚

接下来我在这个帖子里准备发对冲哥视频做的笔记

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2023-1-1 18:45:13 | 显示全部楼层
保重,躺平也是幸福的事
  • 打卡等级:偶尔看看II
  • 打卡总天数:27
  • 最近打卡:2024-08-23 14:40:43

6

主题

60

回帖

1427

积分

金牌会员

积分
1427
发表于 2023-1-3 17:34:16 | 显示全部楼层
我差不多快好了:lol 但是状态还是没完全康复
听说冲哥又发了新视频 今晚先看一集:lol
  • 打卡等级:偶尔看看II
  • 打卡总天数:27
  • 最近打卡:2024-08-23 14:40:43

6

主题

60

回帖

1427

积分

金牌会员

积分
1427
发表于 2023-1-3 20:12:43 | 显示全部楼层
本帖最后由 千年老姚 于 2023-1-4 19:17 编辑

今天状态好点了 但是没完全阳康
不过做了第十一章的笔记 有误请各位指出!
第十一章:定时器的使用
一.定时器的作用和意义
  1. while(1)
  2. {
  3. TimeCount++;
  4. delay_ms(1);
  5. }
复制代码

但是如果出现以下情况:
已知左边代码,1ms变量TimeCount+1,那如果换成右边的呢?
  1. while(1)
  2. {
  3. TimeCount++;
  4. delay_ms(1);
  5. if (KEY == 0 )
  6. {
  7. delay_ms(10);
  8. if (KEY == 0)
  9. {
  10. while (KEY == 0)
  11. }
  12. }
  13. }
复制代码

那么像这样while函数在不断循环执行的时候,能否有方法能够让这个变量每隔1ms能自动+1,并且不受while循环的影响呢?
引入概念:中断
定时器是定时器和计数器的统称。
1)设置为定时器时,可实现硬件计时,或者使程序每隔一固定时间完成一项操作
2)设置为计数器时候能够对脉冲进行计数。
3)替代长时间的delay,提高CPU的运行效率和处理速度,能及时的响应某个事件
二.STC32G单片机定时器使用原理
1.首先先设置功能为定时器/计数器(本质都是加法计数器)
将TMOD位写为0
2.如果在定时器模式下,设置不分频或者12分频
不分频和分频类比:
不分频:脚踏车踩一圈,后轮转一圈
12分频:脚踏车踩十二圈,后轮转一圈
AUXR辅助寄存器默认十二分频,不分频的时候需要设置AUXR = 1
3.工作模式(4种工作模式)
4.定时器模式
TF可以软件或者硬件写0 不写0也行
TR一定要写1 否则定时器无法开启
5.中断
EA——总中断允许控制位——要写1
ET0——定时/计数器T0的溢出中断允许位——要写1
之前的课我们想要P60输出一个低电平,我们可以这样写:
方法1:P60 = 0;
方法2:P6 = 0XFE;  /./当然最好要写 P6 &= 0XFE;
ET0=1 另外一种写法: IE= 0X02 //具体查看手册12.4.1
三.定时器的简单应用
编写代码:T0定时器进行1ms
  1. /***省略部分源代码以及头文件***/
  2. void main()
  3. {
  4. T0M0 = 0X00; //设置定时器0为16位自动重载模式
  5. TL0 = 0X30;  //计算出的24m时钟下定时时间初始值
  6. TH0 = 0XF8;
  7. /**计算方法:24 000 000 ÷ 12 ÷1 = 2000;
  8.   65536-2000 = 62536 = 0XF830
  9. ∴ TH0 = 0XF8; TL0 = 0X30;    ***/
  10. TR0 = 1;  //启动定时器
  11. ET0 = 1;  //使能定时器中断
  12. }
  13. /*定时器0的中断函数*/
  14. void Tim0_Isr()  interrupt 1  //1ms执行一次
  15. {
  16. //函数可以写在这边
  17. }
复制代码

四.定时器的快速使用——stcisp软件
注意事项:中断频率越低越好
总结:
1.了解定时器和定时器中断
2.学会分析什么时候该用定时器
3.熟悉工具并能快速使用定时器
课后练习:
一、第十课的课后作业做一个简易时钟,在此基础上将时钟改成定时器驱动。
二、在上述基础上是增加一个按钮,按下一次就可以让时间暂停,在按一下时间又能继续走,在按一下再暂停!



  • 打卡等级:偶尔看看II
  • 打卡总天数:27
  • 最近打卡:2024-08-23 14:40:43

6

主题

60

回帖

1427

积分

金牌会员

积分
1427
发表于 2023-1-27 18:35:45 | 显示全部楼层
原定初五开始进行学习
因遭受感情问题 延期至初十一
感谢各位关注 抱歉

点评

这...感情问题,老弟加油  发表于 2023-1-28 09:33
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

积分
8058
QQ
发表于 2023-2-1 09:24:21 | 显示全部楼层
千年*** 发表于 2023-1-27 18:35
原定初五开始进行学习
因遭受感情问题 延期至初十一
感谢各位关注 抱歉

老姚,初十一了:victory:上班了
  • 打卡等级:偶尔看看II
  • 打卡总天数:27
  • 最近打卡:2024-08-23 14:40:43

6

主题

60

回帖

1427

积分

金牌会员

积分
1427
发表于 2023-2-2 14:51:46 | 显示全部楼层
电子DI*** 发表于 2023-2-1 09:24
老姚,初十一了上班了

上班了上班了 今天至少更新一集:lol
  • 打卡等级:偶尔看看II
  • 打卡总天数:27
  • 最近打卡:2024-08-23 14:40:43

6

主题

60

回帖

1427

积分

金牌会员

积分
1427
发表于 2023-2-2 19:37:03 | 显示全部楼层
本帖最后由 千年老姚 于 2023-2-2 19:39 编辑

感谢大家最近以来对本帖子的支持!

因为个人原因 拖更了太久
但是最近又要准备期末考 所以我可能没办法更新很频繁 大概三四天一更。
谢谢各位关注 以下为今日复习:
第十二章:计数器的使用
一.计数器的用途
例:直流有刷电机 对光电码盘的扫描
编码器——咖啡机
只要输出信号带着高低电平变化,想要计算个数的就可以使用计数器的功能
二.计数器的配置
T1C/T位写1
T1_GATE = 0
TR1 = 1
例如
TH1,TL1写入数值500
假设不分频 脉冲+1+1至65535,超过65535直接溢出重装载,又到了65536之后重新计数
例:定时器1:外部计数——扩展T1为外部下降沿中断
/*****省略部分代码*****/
void main()
{

TMOD = 0X40; //设置计数器模式

TL1 = 0XFF;  //设置计数器初始值

TH1 = 0XFF;  //设置定时器初始值

TF0 = 0;  //清除TF0标志

TH0 = 0;  //定时器0开始计时

ET0 = 0;  //使能定时器0中断

P3PU = 0X20;  //手册建议 打开4.1k上拉电阻 可使用stcisp进行配置

}
void Timer0_Inr(void) interrupt3
{

P60 = !P60; //检测到一个外部脉冲

}

手册建议 打开4k上拉电阻 可使用stcisp进行配置
三.计数器的应用
例:2017.全国大学生电子设计竞赛O题
任务:
在不检测电动机转轴旋转运动的前提下,按照下列要求设计并制作相应的直流电动机测速装置。
要求:
1.基本要求
以电动机电枢供电回路申接采样电阻的方式实现对小型直流有刷电动机的转速测量。
(1)测量范围: 600 ~ 5000rpm
(2)显示格式:四位十进制
(3)测量误差:不大于0.5%
(4)测量周期: 2秒.
(5)采样电阻对转速的影响:不大于0.5%
思路:
n=1/(tg*c)=F0/(M1*C)
M法测速:又叫做频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。设编码器单圈总脉冲数为C, 时间T0内,统计到的编码器脉冲数为M0,则转速n的计算公式为:n = M0 /(C*T0)
代码如下:
/*省略部分头文件*/
void sys_init();        //函数声明
void delay_ms(u16 ms);        //unsigned int
void SEG_Fre( void )
{
        //位码选择第一位,段码选择0  
        P7 = COM_Tab[num];                        //位码的选择
        P6 = SEG_Tab[Show_Tab[num]];//需要显示的数字的内码 赋给 P6   NUM =0 -> Show_Tab[num]] = 1 -> p6 = oxF9
        //delay_ms(SEG_Delay);
        num++;
        if( num >7 )
                num = 0;       
}

void Timer0_Init(void)                //1毫秒@24.000MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x30;                                //设置定时初始值
        TH0 = 0xF8;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
void main()                                        //程序开始运行的入口
{
       
        sys_init();                                //USB功能+IO口初始化
        usb_init();                                //usb库初始化
        TMOD = 0x50;                        //设置计数器模式   
        TL1 = 0x00;                                //设置计数初始值
        TH1 = 0x00;                                //设置计数初始值
        TF1 = 0;                                //清除TF1标志
        TR1 = 1;                                //定时器1开始计时
        ET1 = 1;                                //使能定时器1中断
            
        P3PU = 0x20;                         //打开内部上拉4.1K
        Timer0_Init();
       
        EA = 1;                                        //CPU开放中断,打开总中断。
       
        while(1)                //死循环
        {
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();
                }
       
               
        }
}
void Timer0_Isr(void) interrupt 1
{
       
       
        TimCount++;                        //每隔1ms+1                //        计数到2000 = 2s
        if( TimCount>=2000 )                //2秒定时时间到了
        {
                TimCount = 0;
               
                Count_T1 = (TH1 *256 )+ TL1;                // 转/2s  转/min
                TH1 = 0;
                TL1 = 0;
               
                Show_Tab[4] = Count_T1/1000%10;
                Show_Tab[5] = Count_T1/100%10;       
                Show_Tab[6] = Count_T1/10%10;               
                Show_Tab[7] = Count_T1/1%10;                //取10位
        }
        SEG_Fre();                //数码管刷新的
}
void Timer1_Isr(void) interrupt 3
{
       
}
/*
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;
}
void delay_ms(u16 ms)        //unsigned int
{
        u16 i;
        do
        {
                i = MAIN_Fosc/6000;
                while(--i);
        }while(--ms);
}

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

本版积分规则

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

GMT+8, 2025-5-2 19:34 , Processed in 0.120091 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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