51单片机,STC单片机计数器,计数外部正脉冲信号, 为什么当period==20为什么==20时为一秒啊

51单片机,STC单片机计数器,计数外部正脉冲信号, 为什么当period==20为什么==20时为一秒啊,第1张

这是一个中断服务子程序,只有当定时器的计数寄存器溢出时申请定时中断,并得到CPU响应时才执行,而定时器的初值设置为 每50ms中断一次,每次执行这段代码时period会自加1(也就是对中断服务程序的执行次数进行计数),加到第20次时,时间值为 50ms20次=1000ms=1s

ps:原程序中

TL1= 0X00;

TH1= 0X00;——这个初值跟MCU的频率、计数周期、定时器的模式等因素有关,感觉简单的清零好像是不对的。

另外不建议使用==20,最好使用>=20 ,关于计数器“飞读”的问题,可以参考郭天祥的教程

可以的,你可以用三菱PLC的专用协议配合STC程序通过串口通讯。或用自由协议,自由协议比较复杂,但STC那边实现起来比较简单直接用串口按规则把电位器的值发送出来,在PLC这边写程序接收解析,PLC这边比较复杂,需要一定的编程功底。

具体的PLC专用协议,自由协议参考你可以去三菱官网下载电子档说明书,以上2种协议我都成功应用在设备上。

(需要外扩通讯板。)

优缺点:PLC专用协议STC那边需要遵守PLC固定的数据格式比如0530304646(WW指令)相对PLC那边就简单的多,因为数据直接写到了指定的寄存器内(如D,M等),可以直接使用。

PLC自由协议STC按照普通的串口发送数据方式按自己固定的格式将AD数据发送,PLC这边程序比较复杂,需要理解PLC的自由协议写法(如RS指令)并利用一定的算法将数据还原并保存到寄存器内。

如果你的数据是时好时坏的丢失,我建议你考虑清楚2个定时器之间中断优先级的问题,有个能串口1把串口2正在处理的数据优先屏蔽了

如果你的数据都是非正常的,我建议你做个协议进行数据校对,不过我觉得优先级的可能性比较大

#include <reg51h>

void delayms(int xms)

{

char i=0;

for(;xms>0;xms--)

for(i=0;i<110;i++)

;

}

main(void)

{

while(1)

{

P1=0xaa;

delayms(1000);

P1=0x55;

delayms(1000);

}

}

以上就是关于51单片机,STC单片机计数器,计数外部正脉冲信号, 为什么//当period==20为什么==20时为一秒啊全部的内容,包括:51单片机,STC单片机计数器,计数外部正脉冲信号, 为什么//当period==20为什么==20时为一秒啊、用三菱编程指令,STC单片机上的模拟电位器数据如何采集、毕业设计中使用STC12C5A60S2单片机。做双串口通信时候。串口1使用定时器1 串口2使用独立波特率发生器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9808879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存