小涵子爸爸
发表于 2023-12-28 19:25:01
立创EDA很简单的,一学就会
Crystalline
发表于 2023-12-28 20:13:00
第九集
静态数码管的使用
数码管可以分为共阴和共阳两种,本质上就是多段LED灯
P67P66P65P64P63P62P61P60
dpgfedcba
011000000
111111100
210100100
310110000
410011001
510010010
610000010
711111000
8 1 00 0 0 0 0 0
9 1 0 0 0 1 0 0 0
这是共阳极数码管段码表,共阴极就是按位取反
给要显示的位选口赋1,把上表的二进制数转化成16进制或10进制存放在数组里面,赋值给P6口就可以让数码管显示相应的数字了!
Crystalline
发表于 2023-12-29 13:30:19
第十集
数码管的动态显示
数码管动态显示的原理就是利用人眼分辨不出50HZ以上的刷新率
只要让相邻两个数码管亮的间隔为1ms,在我们视角里它就是同时点亮的。
同时点亮八个数码管,逻辑就是:位选——段选——1ms延时——位选....
有一点我不明白,能不能让这个数码管亮的间隔更小呢?1us可以吗?
后面冲哥又以免单计数器给我们实战演练了一下动态数码管的应用,学一个东西马上就去实践它,好的教学!!!
Crystalline
发表于 2023-12-29 14:50:10
第十一集
定时器的使用
delay函数占用CPU大量时间,利用定时器中断可以定时进中断,提高CPU的运行效率
冲哥举了一个很形象的例子,主程序:你在背书 中断:妈妈让你5min后去看看锅里的汤有没有烧干
而如果不用中断表示的话,那就是 主程序:你在背书,过5min后再去看看锅里的汤有没有烧干
很明显你背书的时间是不确定的,中断可以打断你的背书,5min后立马去看看水有没有烧干,再回来继续背
而如果不用中断,你就要等背完书再去看看水有没有烧干,说不定那个时候水已经烧干了呢?
使用定时器0定时要把TMOD中的清零,分频与不分频取决于T0x12,计数值相差12倍
定时时间计算方法:
配置定时器0进行1ms定时,定时器0中断号为1,中断处理函数要加上interrupt 1,函数名可以随便起
这样就配置好了1ms的定时器中断
计算定时长度太麻烦的话可以使用stc-isp软件
神农鼎
发表于 2023-12-29 14:54:05
建议立即 【免费+包邮送】实验箱,提高学习效率
深圳国芯人工智能有限公司-工具软件 (stcai.com)
lzl1okOK
发表于 2023-12-29 15:55:11
rengran 发表于 2023-12-28 10:54
图1
我的板子在定时器里调用printf可以使用,但是在主函数里会卡在哪里是咋回事?
rengran
发表于 2023-12-29 16:29:00
lzl1okOK 发表于 2023-12-29 15:55
我的板子在定时器里调用printf可以使用,但是在主函数里会卡在哪里是咋回事? ...
你把你的主程序和定时器的程序贴上来看看才能分析一下,不然看见你的问题有点蒙
lzl1okOK
发表于 2023-12-29 16:34:18
在外面等下回去就贴上来一起研究下
Crystalline
发表于 2023-12-30 16:56:52
本帖最后由 Crystalline 于 2023-12-30 16:57 编辑
感谢STC!实验箱已经在路上了!如此良心!不愧是国产单片机/MCU的领航者,1T 8051单片机的领导者,32位8051单片机的领导者!
第十二集
计数器的使用
上一节课用的是定时器0作为定时器的模式,这节课是作为计数器的模式
定时器是系统内部时钟进行计数
计数器就是通过外部引脚输入的脉冲信号计数,可以借助编码器用于电机测速
冲哥利用了按键模拟脉冲信号,要配置内部引脚的上拉电阻才可以做到电平从高到低的转变
stc-isp软件中有快速配置的方法
看冲哥视频,是脉冲下降沿计数,按键按下,电平由高-低-高,有一个下降沿
计数溢出产生中断,在中断中把LED引脚电平取反
但是如果实际中要用到上升沿或者双边沿计数怎么办?怎么配置呢?想请教一下各位
手上有一个旋转编码器,就只能用编码器测试一下了
这里用的是定时器1作为串口1的波特率发生器,定时器0计数,不断向串口发送当前计数值
给大家看一下
Crystalline
发表于 2023-12-30 17:02:00
Crystalline 发表于 2023-12-30 16:56
感谢STC!实验箱已经在路上了!如此良心!不愧是国产单片机/MCU的领航者,1T 8051单片机的领导者,32位8051 ...
#include <STC32G.H>
#include <stdio.h>
unsigned int count = 0;
void System_Init()
{
EAXFR = 1;
CKCON = 0x00;
WTST = 0x00;
//高阻输入模式
P3M0 = 0x00; P3M1 = 0x10;
EA = 1;
}
void Uart1Init(void) //9600bps@24.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x8F; //设置定时初始值
TH1 = 0xFD; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
void Timer0_Count()
{
TMOD = TMOD|0x04; // 16位计数模式
TL0 = 0xff;
TH0 = 0xff;
ET0 = 1;
TR0 = 1;
}
void Timer0_handler() interrupt 1
{
count++;
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(!TI);
TI = 0;
}
void main()
{
System_Init();
Uart1Init();
Timer0_Count();
while(1)
{
UART_SendByte((unsigned char)(count>>8));
UART_SendByte((unsigned char)count);
}
}