荣誉版主 Yim_Hom,2024/8,技术漫步,共享,技术回复 索引
本帖最后由 国学芯用 于 2024-9-2 13:23 编辑一、技术文章:
1、入门IoT学习过程中的一点小心得(1):简单的方式解析json数据
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›作品展示›入门IoT学习过程中的一点小心得(1):简单的方式解析js ...
3、基于8H8K64U及官方库函数进行新建工程_第二部分
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›仿真/编译器/汇编器/头文件›基于8H8K64U及官方库函数进行新建工程_第二部分 ...
二、回复:
1、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›定时器/计内部时钟,计数器/计外部脉冲,时钟分频输出,软件延时›用ISP中的定时器设置工具,设置50ms,实际差不多10ms | ...
5#回复:
可以确定的是小工具没有问题,生成的代码也没有问题,问题在于你。
首先,上结果:
用定时器0来实现1ms定时,串口1用定时器2做波特率发生器115200,然后每500ms实现LED取反闪烁并用串口输出信息。
https://www.stcaimcu.com/data/attachment/forum/202408/27/003951zgy8nd7z9h99q4j9.jpg
从结果上看,如果没有异议,就继续往下看。
主程序很简单:
https://www.stcaimcu.com/data/attachment/forum/202408/27/004212xqnqs4pq30hzjgvx.jpg
那么,到这里,先说LED的初始化:
https://www.stcaimcu.com/data/attachment/forum/202408/27/004335xc5ccy0dd5iyin5b.jpg
然后是定时器0的初始化:
https://www.stcaimcu.com/data/attachment/forum/202408/27/004440zjjrpsru54i4iaju.jpg
然后是串口1的初始化:
https://www.stcaimcu.com/data/attachment/forum/202408/27/004546ag7dtmf6d83tv7xc.jpg
因为串口1初始化使用了定时器2,所以接着看定时器2的初始化:
https://www.stcaimcu.com/data/attachment/forum/202408/27/004716andqduq8an9bi9f8.jpg
ok,到这里while之前的都看了,
主循环里就干了3件事,一个是看定时500ms到没到,另两个是到了以后分别让led取反并完成串口打印。
500ms标志位怎么来的,看定时器0的中断:
https://www.stcaimcu.com/data/attachment/forum/202408/27/005035tjchcgcupoq97jc9.jpg
至于led取反和串口打印,暂时假设你没有问题。
那么我们接着看你的问题:
从你的截图里,没看到你选择内部IRC,那猜测你是用的外部11.0592晶振。
那么一点点看下去,就剩下串口了,看看是不是也是12T模式,和你的定时器0一致?
你可以参照我贴的图看看你的问题。
至于你的fc计数,我没那么写过,但看着没问题。但是还可以更准确:≥20。
另再备注一下:
很公立的说一句,STC这个小工具,经过这么多年的发展和成熟,现在能被新手发现的关于计算的问题几乎没有,
出了问题,建议还是先找自己的问题或者哪怕不会就问,先把自己可能存在的问题都排除掉,那你就已经成熟一大截了。
加油!
13#回复:
因为没用过这款单片机,真的是为了回答这个问题,我又专门把你用的STC12这款单片机的手册下下来看了下。
从手册上看,是支持16位,但不是自动重载
https://www.stcaimcu.com/data/attachment/forum/202408/27/102804y5811a4r23l2f1re.jpg
范例程序里的内容,在中断服务函数里,也是手动重载。
https://www.stcaimcu.com/data/attachment/forum/202408/27/102925ogwllg76i17ml7iz.jpg
https://www.stcaimcu.com/data/attachment/forum/202408/27/103016zqprjim55rkrympz.jpg
那么,到这里,如果使用小工具生成的,不就可以说明问题了吗
https://www.stcaimcu.com/data/attachment/forum/202408/27/103154p229iq91q2z2wizy.jpg
15#回复:
xxkj2010 发表于 2024-8-27 08:31
我把TMOD &= 0xF0; 改成TMOD = 0x01;把AUXR &= 0x7F; 去掉,OK!
即初始化改为:
看你这一条,问题是出在TMOD &= 0xF0;但是关联的问题在于使用这一句的问题上。
而且即便你下面这么写现在是OK,
void Timer0_Init(void) //50毫秒@11.0592MHz
{
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
}
但只是因为默认了12T模式,所以AUXR不用写进去,侥幸对了。
如果12T/1T模式,必须配置以后定时器才能工作,你还是得配置AUXR。
20#回复:
呵呵,使用定时功能,定时了不进中断,就失去了定时器的意义
21#回复:
工具功能也是建立在手册基础之上的,别人也就说了句不看手册,你依然不认为是因为自己没看手册的原因,纵观你的发帖记录,大概能判断出来一些东西。
27#回复:
只是因为默认了12T模式,所以AUXR不用写进去,侥幸对了。
如果12T/1T模式,必须配置以后定时器才能工作,你还是得配置AUXR。
你提的问题上一条回答里说了猜测你能定时成功但不对的原因,
可是你却连看都不看,那大家回答你的问题有什么意义呢?
任何一个元器件、MCU等的使用,都是建立在官方datasheet的基础上来完成,
可以道听途说也可以胡乱猜测,但结果肯定会有一堆问题。
跟着别人的视频画出来个pcb,复制粘贴现成的程序,都可以变成你自己的作品,但前提是得知道别人为什么这么画,为什么这么写。
仅仅一个8位机,不看手册就品头论足,说人家这不对那不好,等你用更高级的mcu时,骂娘都没用。
静下心多提升自己吧,不然以后要受伤走弯路的!
啰嗦了,仅是建议,也可以不听。
2、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›老鸟反刍/吐槽,新手乐园,毕业设计›LCD12864 乱码
6#回复:
这个题目一改,就能直接蹭一波这两天黑神话悟空的热度了
7#回复:
看下你那个中间的横杠,是不是汉字输入法里的,别是英文的-,换成汉字的—
10#回复:
就从你屏幕显示里扫了一眼看着不对,哈哈
那就完美解决了。
3、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›BLDC/144MHz-PWM-硬件移相/45路PWM+3路CCP/7组不同周期的PWM/DAC›8H1K08外部中断0没有进入中断服务程序的问 | 已解决 ...
7#回复:
从程序看,你截取的外部中断初始化和中断函数没有问题。
但因为只有一部分,无法猜测你具体是如何触发外部中断的呢?
比如 ac_cycle = 0;进中断以后 ac_cycle = 3;,那是怎么进了中断的,最好是硬件连接和程序都来一份,大家帮你分析!
8#回复:
看不到程序不能分析,你得自己看有没有触发外部中断,如果触发了再往下进行排查。
如果不方便发的话,以下是我自己写着玩的demo,你看看可以参考下。
先进行的是初始化
https://www.stcaimcu.com/data/attachment/forum/202408/30/001204np353c85y13u8c3f.png
然后是具体的执行
https://www.stcaimcu.com/data/attachment/forum/202408/30/001236waig8zs2qxxasmff.png
最后附上中断函数
https://www.stcaimcu.com/data/attachment/forum/202408/30/001428kein0zwdggiplaaz.png
4、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›串行口,DMA支持的4组串口,RS232,RS485,Modbus, CRC16›已解决:15w4k48s4使用串口1定时器2通过rs232发送给pc单 ...
地板回复:
https://www.stcaimcu.com/forum.p ... mp;page=1#pid102561
这是之前回复别人的,程序是我自己写的,没有参照官方例程,每一个寄存器的注释都很详细,
我用的IAP15W4K,理论上你能通用。
贴出来的图片也是按照程序前后顺序,附带了说明。
看完这个估计你就懂了
6#回复:
不客气
只是一种思路引导{:4_245:}
9#回复:
https://www.stcaimcu.com/data/attachment/forum/202408/29/132834hzlkv0ncintc7797.jpg
这是回复你的那位发的例程,
你对比看下你的,我大概扫了一眼,看着有区别。
他发的你可以直接复制粘贴试下
我这个是能保证绝对没问题😊
10#回复:
在外面手机上码字,看的比较累。
11#回复:
思路就是:
选择端口
端口初始化
定时器2做波特率发生器初始化
串口2初始化
配置好串口中断函数
串口发送 接收函数 或者加入printf函数
然后发送测试
13#回复:
我只是偶尔写一个东西写不下去了会参考官方例程,所以确实看的不多。
15#回复:
额…不至于吧,
现成的图片贴出来程序,附带着思路…难在哪儿?
你把我的敲一遍试试看啊
每次回帖我都是故意只发截图不直接粘贴代码,就是因为回答的目的是让提问者明白。
当然,你也可以从图片中提取文字复制粘贴啊…哈哈
17#回复:
我那个链接{:4_238:}
18#回复:
一会估计就有对官方例程熟悉的高人给你指点的,
除了代码还有硬件连接,你只能自己保证硬件连接没问题,不然就尴尬了…
20#回复:
把官方例程下载下来
确认下官方例程编译没问题
下载的时候确认芯片型号没错,晶振频率11.0592没错
接线和官方例程一致
然后下载到你的单片机里,看现象和官方例程的结果是不是一致
做好了上面几步,就能确认代码 接线 硬件都ok
然后看你改的代码,再按你的改接,看串口通信接的端口对不对
我怀疑你是管脚接的有问题。
22#回复:
哈哈哈哈,好了就行
23#回复:
使用官方例程,还得先看手册,看官方例程里的说明要求晶振是多少,然后再去用。
5、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›仿真/编译器/汇编器/头文件›8h1k08仿真adc中断异常,进不去
沙发回复:
感觉一样,感觉又不一样。。。
打开手册里的官方例程参考一下,我记得8H的手册里有专门的ADC中断例程
最近都是用库函数,好像寄存器离我很远很远。。。就不帮你看手册了。
https://www.stcaimcu.com/data/attachment/forum/202408/26/215540wn3nq14i2mm0nqef.jpg
这个是我用查询方式写的,手册里的例程你直接改对应的IO口和通道,单跑一个ADC试试,应该没问题的。
图1.JPG (58.44 KB, 下载次数: 0)
https://www.stcaimcu.com/data/attachment/forum/202408/26/214804ulpfg4qzgpp42ymh.jpg
6、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›老鸟反刍/吐槽,新手乐园,毕业设计›AI8051U, LCD12864, 播放BadApple 超简单
5#回复:
{:4_250:}
用stc15配合st7567玩过这个,波特率到961200
但是没您这个这么复杂,bin文件直接串口发,发了就不用管了
程序内部串口接收一次1024就显示,不做任何判断也成功了。
7、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›仿真/编译器/汇编器/头文件›分享:轻量化Keil C51命令行方式编译,适合配置超级低的 ...
13#回复:
从头看到尾,说点小感慨,感觉如果是我的话,会把精力放在代码如何写的更高效和电路如何分析的更好,还真不太可能会在命令行或者批处理去转文件格式上费精力。仅是个人感慨。
14#回复:
别误会,没有半点要起争执或者批判的意思,就像有人只用汇编,有人偏偏不用C要用C++,所以有人寄托于编译器,有人习惯命令行。萝卜白菜各有所爱,适合自己的就是最好的。
每一个个体都是独特的,应该充分尊重,所以才说仅是个人感慨。{:smile:}
8、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›BLDC/144MHz-PWM-硬件移相/45路PWM+3路CCP/7组不同周期的PWM/DAC›在线急救,我怎么判断电机已经停了!!!!!!! ...
地板回复:
这么试试行不行?
两次捕获,那就每一次捕获都有值,
如果电机不转,两次捕获都为0,不进行计算,认为电机不转;
如果第一次捕获电机转,第一次值不为0,第二次捕获时捕获值为0,这个时候还能计算,但计算值不一定对;
如果两次捕获都有值且不为0,就是正常情况。
根据捕获值决定是否进入计算和判断电机是否在转,应该算一种方法。
要不就是用标志位来判断,有值标志位置1,无值置0,也可以考虑。
至于计算结果正值 负值还是0,用于判断正转 反转还是转速未改变,前面的判断对结果应该没影响。
水平有限,希望思路能帮到你。
7#回复:
玩stc15的6路15位pwm时,没用过中断。
stc8的话,还没看到pwm,但是从范例程序里看,
可以判断cap_new和old的值试试啊,初始定义为0,中断里还是0,不也可以嘛?
9、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›其他技术交流›请问丝印是αn的这颗物料是啥?
5#回复:
自己对照着看一下吧,自恢复保险丝。
https://www.stcaimcu.com/data/attachment/forum/202408/17/211119ar5ara56zfobbz6d.jpg
10、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›老鸟反刍/吐槽,新手乐园,毕业设计›求助 库函数
12#回复:
我没看过他的源码,但是从你的截图中看出来确实你用的压根儿对函数的用法上理解就有问题
先上图说第一个问题
这里,函数是带返回值的,后面也有注释,也就是说,
key_multi()这个函数,返回一个unsigned char类型的值。
https://www.stcaimcu.com/data/attachment/forum/202408/17/204016nk9k9696aakxaew2.jpg
然后说第二个问题
unsigned char key_multi(void);
而你的问题恰恰就处在这里,函数的尾部括号是(void),也就是没有入口参数,
但你调用的时候却把11写进去,首先写进去不管这个值对不对,
编译器就一定会报错,因为函数没有入参。
其次说这个11是哪来的,是你理解的返回键值为1对吗?
你定义一个变量,比如unsigned char KeyNum,
KeyNum用来保存函数key_multi()的返回值,
那么这个时候是KeyNum = key_mult();//将读到的键和键值保存在KeyNum
通过判断KeyNum的结果再去判断哪个按键被按下以及对应的按键功能,
那么就是if(KeyNum == XXX),去做判断就可以。
(红色字体为啰嗦的两句,可以不看)
因为只看了你两张截图,KeyNum是个复合值,那么得去做分离,看他的程序里有没有对复合值做处理,
有的话,你就接着按照他的程序处理继续写下去就行;
如果没有,无非就是#define里对按键的声明
11 12 13
21 22 23
31 32 33
41 42 43
把KeyNum的十位和个位做一个分离,然后根据得出的结果判断是哪一个按键被按下,执行单击、双击、长按的。
https://www.stcaimcu.com/data/attachment/forum/202408/17/204742r1yzz5jozgvj1yb4.jpg
希望能帮到你,但也希望你可以再继续加强下基础,加油。
13#回复:
目前看,你确实C的基础比较弱一些,稍微补一点C语言基础的知识,会对你的帮助更大 ,当然补基础的时候一定不要耽误写程序
哪里不会补哪里,能快快的强大起来。
key_multi(void),你把void从括号里拿出来写到前面,这个。。。
前一个回答已经写明了应该怎么用,你看一下,应该能有所帮助。
https://www.stcaimcu.com/data/attachment/forum/202408/17/210147hl00zlkqr9zpvf9y.jpg
17#回复:
不客气
11、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›老鸟反刍/吐槽,新手乐园,毕业设计›单片机运行时自动复位 | 已解决,程序问题 ...
8#回复:
检查供电、信号接线
检查程序是不是while之前写的有问题
14#回复:
看来是while之前有问题
12、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›综合讨论›多串口通信导致单片机死机或跑飞需要加看门狗复位吗 ...
10#回复:
共地、干扰、看门狗、堆栈、中断异常,都有可能导致死机或程序跑飞,
遇到过共地、干扰、看门狗导致的问题。
13、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›ADC/比较器,DMA支持的12位ADC,轨到轨比较器,DAC›12位ADC 计算公式是/4096还是/4095;10位ADC 计算公式是/ ...
9#回复:
我从一开始就简单粗暴的认为应该4096/1024
因为从0-4095/0-1023,就该是4096/1024
不然,0-1算一个数还是两个数?
好像既简单又很粗暴{:4_249:}
14、
»AI32位8051交流社区,车规 AEC-Q100 Grade1›技术交流›ADC/比较器,DMA支持的12位ADC,轨到轨比较器,DAC›求助,ADC转化不成功,卡死
10#回复:
好像有点问题吧?
https://www.stcaimcu.com/data/attachment/forum/202408/31/202213a46p2t88641z4tiq.jpg
所以,当你转换状态时,转换函数只会返回0
那么…应该怎么都进不去才对!
https://www.stcaimcu.com/data/attachment/forum/202408/31/210518rku070bbh4bl7xzy.jpg
所以:
if完了应该加else,对不?
11#回复:
通过转换ADC step check状态决定ADC转换,用DMA也得他的状态返回ok,然后进DMA拿结果,并不冲突,现在的问题是卡在step2,要一直等返回是1,但实际上他的转换函数只能返回0,所以就只能卡在这。
页:
[1]