- 打卡等级:偶尔看看I
- 打卡总天数:16
- 最近打卡:2025-04-30 08:18:51
中级会员
- 积分
- 333
|
我是一个PLC从业者,有个需求,让我有了去做一块单片机板子去实现的想法,功能大约如下:
1:IO信号的处理,输入输出信号,我的想法是在RAM里面创建对应的变量,指定对应的输入输出点,比如我这个需求最大的点数96个输入,72个输出,(一个芯片没这么多点,通过通信做主从站)
每一个输入点有一个延时时间可设定,时间可设定,笼统的意思是,变量Input,变量TimeSet,变量Output,那么我我再用硬件去指定,比如我定义P2^0为X0,P2^1为Y0,得到的效果是按下X0,延时TimeSet设定的值,输出Y0,
2:通过模拟IIC去和TM1650去通信,显示和设定数值,
3:MODBUS通信,主站从站,主站从站直接读取写入中间变量,
现官网找到,库函数,延时,中断1MS,那么如何去扩展出96个延时呢?
我用的硬件是STC32G。
发帖的目的是想官方能不能也开发出相应的函数来,能让我们这些人也享受到国产单片机给我门带来的福利 。
比如说,
1,定时器,
2,模拟通信,TM1650,
3,MOSBUS通信,点位直接用中间替代。
。。。。。。。。
这样想我们这些只懂的工艺的人努力一下也能使用上单片机 ,当然都是简单的,复杂的还得专业的来。
我现在所做的,如下:
#include "STC32G_Timer.h"
#include "STC32G_GPIO.h"
#include "STC32G_NVIC.h"
#include "Global.h"
/************************ IO口配置 ****************************/
void GPIO_config(void)
{
P6_MODE_IO_PU(GPIO_Pin_All);
P4_MODE_IO_PU(GPIO_Pin_0);
}
void Timer_config(void)
{
TIM_InitTypeDef TIM_InitStructure; //结构定义
//定时器4
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
TIM_InitStructure.TIM_Value = (u16)(65536UL - (MAIN_Fosc / (1000*12))); //初值
TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
Timer_Inilize(Timer4,&TIM_InitStructure); //初始化Timer4 Timer0,Timer1,Timer2,Timer3,Timer4
NVIC_Timer4_Init(ENABLE,NULL); //中断使能, ENABLE/DISABLE; 无优先级
}
void main(void)
{
WTST = 0;
EAXSFR();
CKCON = 0;
GPIO_config();
Timer_config();
EA = 1;
P40 = 0;
while (1)
{
if (t_out_1000)
{
P65 = ~P65;
t_out_1000 = 0;
}
}
}
//========================================================================
// 函数: Timer4_ISR_Handler
// 描述: Timer4中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer4_ISR_Handler (void) interrupt TMR4_VECTOR //进中断时已经清除标志
{
if (arr[0] < 1000)
{
arr[0]++;
}
else
{
arr[0] = 0;
t_out_1000 = 1;
}
}
在单独.H文件里面写上extern bit t_out_1000;
在对应.C文件里面写上bit t_out_1000;
对于写多个延时,我的想法是,在全局变量建立输入中间变量数组,时间设定数组,输出数组,
然后再中断里面写,当输入有信号,时间就开始++,判断时间有没有达到,达到就输出,
//========================================================================
// 函数: Timer4_ISR_Handler
// 描述: Timer4中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer4_ISR_Handler (void) interrupt TMR4_VECTOR //进中断时已经清除标志
{
if (Input0)
{
TimeCount++;
if (TimeCount >= TimeSet)
{
TimeCount = 0;
Output0 = 1;
}
}
else
{
TimeCount = 0;
Output0 = 0;
}
}
如此复制96个,不知到会不会出问题,@版主,请赐教下,或者有没有更好的办法。
|
|