这是一个中断服务子程序,只有当定时器的计数寄存器溢出时申请定时中断,并得到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使用独立波特率发生器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)