神农鼎
发表于 2023-1-1 18:45:13
保重,躺平也是幸福的事
千年老姚
发表于 2023-1-3 17:34:16
我差不多快好了:lol 但是状态还是没完全康复
听说冲哥又发了新视频 今晚先看一集:lol
千年老姚
发表于 2023-1-3 20:12:43
本帖最后由 千年老姚 于 2023-1-4 19:17 编辑
今天状态好点了 但是没完全阳康
不过做了第十一章的笔记 有误请各位指出!
第十一章:定时器的使用
一.定时器的作用和意义
while(1)
{
TimeCount++;
delay_ms(1);
}
但是如果出现以下情况:已知左边代码,1ms变量TimeCount+1,那如果换成右边的呢?while(1)
{
TimeCount++;
delay_ms(1);
if (KEY == 0 )
{
delay_ms(10);
if (KEY == 0)
{
while (KEY == 0)
}
}
}
那么像这样while函数在不断循环执行的时候,能否有方法能够让这个变量每隔1ms能自动+1,并且不受while循环的影响呢?引入概念:中断定时器是定时器和计数器的统称。1)设置为定时器时,可实现硬件计时,或者使程序每隔一固定时间完成一项操作2)设置为计数器时候能够对脉冲进行计数。3)替代长时间的delay,提高CPU的运行效率和处理速度,能及时的响应某个事件二.STC32G单片机定时器使用原理1.首先先设置功能为定时器/计数器(本质都是加法计数器)将TMOD位写为02.如果在定时器模式下,设置不分频或者12分频不分频和分频类比:不分频:脚踏车踩一圈,后轮转一圈12分频:脚踏车踩十二圈,后轮转一圈AUXR辅助寄存器默认十二分频,不分频的时候需要设置AUXR = 13.工作模式(4种工作模式)4.定时器模式TF可以软件或者硬件写0 不写0也行TR一定要写1 否则定时器无法开启5.中断EA——总中断允许控制位——要写1ET0——定时/计数器T0的溢出中断允许位——要写1之前的课我们想要P60输出一个低电平,我们可以这样写:方法1:P60 = 0;方法2:P6 = 0XFE;/./当然最好要写 P6 &= 0XFE;ET0=1 另外一种写法: IE= 0X02 //具体查看手册12.4.1三.定时器的简单应用https://cdn.nlark.com/yuque/0/2023/png/32797280/1672745716598-2c1b0200-e8b1-49f3-b532-55489567ff27.png编写代码:T0定时器进行1ms/***省略部分源代码以及头文件***/
void main()
{
T0M0 = 0X00; //设置定时器0为16位自动重载模式
TL0 = 0X30;//计算出的24m时钟下定时时间初始值
TH0 = 0XF8;
/**计算方法:24 000 000 ÷ 12 ÷1 = 2000;
65536-2000 = 62536 = 0XF830
∴ TH0 = 0XF8; TL0 = 0X30; ***/
TR0 = 1;//启动定时器
ET0 = 1;//使能定时器中断
}
/*定时器0的中断函数*/
void Tim0_Isr()interrupt 1//1ms执行一次
{
//函数可以写在这边
}
四.定时器的快速使用——stcisp软件注意事项:中断频率越低越好总结:1.了解定时器和定时器中断2.学会分析什么时候该用定时器3.熟悉工具并能快速使用定时器课后练习:一、第十课的课后作业做一个简易时钟,在此基础上将时钟改成定时器驱动。二、在上述基础上是增加一个按钮,按下一次就可以让时间暂停,在按一下时间又能继续走,在按一下再暂停!
千年老姚
发表于 2023-1-27 18:35:45
原定初五开始进行学习
因遭受感情问题 延期至初十一
感谢各位关注 抱歉
电子DIY小家
发表于 2023-2-1 09:24:21
千年老姚 发表于 2023-1-27 18:35
原定初五开始进行学习
因遭受感情问题 延期至初十一
感谢各位关注 抱歉
老姚,初十一了:victory:上班了
千年老姚
发表于 2023-2-2 14:51:46
电子DIY小家 发表于 2023-2-1 09:24
老姚,初十一了上班了
上班了上班了 今天至少更新一集:lol
千年老姚
发表于 2023-2-2 19:37:03
本帖最后由 千年老姚 于 2023-2-2 19:39 编辑
感谢大家最近以来对本帖子的支持!
因为个人原因 拖更了太久
但是最近又要准备期末考 所以我可能没办法更新很频繁 大概三四天一更。
谢谢各位关注 以下为今日复习:
第十二章:计数器的使用
一.计数器的用途例:直流有刷电机 对光电码盘的扫描编码器——咖啡机只要输出信号带着高低电平变化,想要计算个数的就可以使用计数器的功能二.计数器的配置T1C/T位写1T1_GATE = 0TR1 = 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; //位码的选择 P6 = SEG_Tab];//需要显示的数字的内码 赋给 P6 NUM =0 -> Show_Tab] = 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 = Count_T1/1000%10; Show_Tab = Count_T1/100%10; Show_Tab = Count_T1/10%10; Show_Tab = 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);}