-
麻烦大神帮忙看看分析一下波形以及分频比由3—8译码器确定,改变译码器的地址可以改变分频比,当3—8译码器的地址码为N时,可以得到N+1分频的输出脉冲。这里1≤N≤7。该分频器从X端输出的为负脉冲,若从X’输出,则可得到正脉冲输出信号。这句话如何理解,能否举例说明一下,在此先感激不尽
-
算了一下你的成本大概在10块钱,如果是我我能控制在5元钱。使用更少的引脚芯片。
-
你选用的是16位的定时器,以下的解释很好的解释了初值的计算,你所说的0xB8应该是(2^16-初值)的差值而不是真正的初值。应该是算错了通过正确的计算此差值为18492,而B8是184.
t=(2^16-初值)*机器周期=(2^16-初值)*时钟周期*12
若初值=0x4bfe=19454
t=(65536-19454)*1/11095200*12=0.04983993078087821760....约为0.05s即50ms
公式解释:
每个机器周期产生一个计数脉冲,计时器寄存器最大允许2^16,大于2^16就溢出触发中断。初值为T,则还有65536-T次计数,每次计数用时一个机器周期,所以总用时:t=(2^16-初值)*机器周期=(2^16-初值)*时钟周期*12
初值设置:把所需时间T=20ms代入上式解出初值0xB7C4,把0xB7作为TH,0xC4作为TL(因为所得出的0XB7C4是16位的,但是字节是8位的所以需要两个字节才能装,因此采用TH高8位存放B7,TL低8位存放C4)
也可以用上式推导出初值计算公式
-
首先你得告诉一下你的TMOD是怎么设置的
-
首先你的数组没有定义,如果定义了你再看看你的数组是否有16个数组元素。如果没有16个,比如你只定义10个数组元素,当 if(keycode == key_code[a]),a=11时就根本查不到数组元素。
-
比如每做一个项目都是奖励100块的话,建议将奖金分成两部分。第一部分称为基础奖金,只要完成了交付了项目就能拿到,比如给80块。只要每完成一个项目就给80奖励。第二部分为绩效奖金,比如工程师的某个项目有很多订单,则将积累的20元部分拿出来奖励工程师。或者直接从项目利润中抽取百分之几给工程师。这样项目做得多的及时下单少也能得到一定的回报,项目做得少的但是订单多的项目也能拿到相应的报酬。以此不会失去平衡。
-
P1端子接的是传感器吗? 具体说说工作过程
-
您说的轻按重按是短按和长按的意思吗?或者说你把你说的单刀双掷开关图片发上来参考一下
-
雨后的梧桐 发表于 2016-12-16 08:49
你可以做一个类似短路监测的啊,有水的时候短路,没水的时候不就开路了。这不行吗?
或者不是有专门的水位 ...
产品开发考虑的是低成本高性能,如果这样加成本就会将你扼杀
-
花样流水灯
for(i=0;i
-
maychang 发表于 2019-1-19 09:48
“在测试过程中测试人员反映非全功率加热时功率计跳动”
完全正常。你的控制方式,输出功率就是跳动的。
是的,有时候测试的就是抓住功率仪跳动不放。
-
dingzy_2002 发表于 2019-1-19 08:53
如果可能的话,应该用过零开通功能要比PWM或T方式会更好吧
是的,每次触发就是在过零点出发的,有过零检测电路的。现在控制方式已经能够满足EMC但是周波控制时,低功率时占空比停的时间较长测试的时候功率仪检测到的功率一直在跳动。
-
仙猫 发表于 2019-1-4 00:52
准确地说,不是降低扫描频率,而是减少点灯占空比。
有用
-
纯软件实现
-
你这个是放在大循环里面的顺序结构,还说不上分时扫描。程序执行时按顺序先执行显示扫描再执行按键扫描,只是单片机执行的比较快所以给人的感觉是同时进行的。
-
#define TIME 125 //定时器定时时间
#define IR_sample TIME //定义采样时间
#define IR_SYNC_MAX (15000/IR_sample)//120 //前导码最大时间(9ms+4.5ms=13.5ms)
#define IR_SYNC_MIN (9700 /IR_sample)//77 //前导码最小时间(连发9ms+2.25ms=11.25ms)
#define IR_SYNC_DIVIDE (12375/IR_sample)//99 //区分连发前导码((11.25+(13.5-11.25))/2=12.375ms)
#define IR_DATA_MAX (3000 /IR_sample)//24 //数据最大时间3ms
#define IR_DATA_MIN (600 /IR_sample)//4 //数据最小时间0.6ms
#define IR_DATA_DIVIDE (1687 /IR_sample)//13 //区分0和1数据,(1.12+(2.25-1.12)/2)=1.685ms
#define IR_BIT_NUMBER 32 //32位数据
#define User_code 0x0cf3
uchar IR_SampleCnt,IR_BitCnt,IR_UserH,IR_UserL,IR_data,IR_DataShit,IR_code,D_F0;
bit bdata Ir_Pin_temp,IR_Sync,IrUserErr,IR_OK;
void IR_RX_HT6121()
{
uchar SampleTimer; //信号周期
IR_SampleCnt++; //定时器对红外口检测次数
D_F0 = Ir_Pin_temp; //保存前一次扫描到的端口电平状态
Ir_Pin_temp = p_reg;//Ir_pin; //读取当前端口电平状态
if(D_F0 && !Ir_Pin_temp) //判断是否触发
{
SampleTimer = IR_SampleCnt; //记录脉冲周期
IR_SampleCnt = 0; //清零计数值
if(SampleTimer > IR_SYNC_MAX) IR_Sync=0;//超出最大前导信号,退出
else if(SampleTimer >= IR_SYNC_MIN)
{
if(SampleTimer >= IR_SYNC_DIVIDE) //区分连发信号与同步信号
{
IR_Sync = 1; //接收到有效同步信号
IR_BitCnt = IR_BIT_NUMBER; //赋值32位有用信号
}
}
else if(IR_Sync) //已接收到同步信号
{
if((SampleTimer < IR_DATA_MIN)|(SampleTimer > IR_DATA_MAX)) IR_Sync=0;//数据周期过长,退出
else
{
IR_DataShit >>= 1; //键反码右移一位(发送端是低位在前,高位在后格式)
if(SampleTimer >= IR_DATA_DIVIDE) IR_DataShit |= 0x80; //区分0和1
if(--IR_BitCnt==0) //所有数据接收完毕
{
IR_Sync = 0; //清除同步信号标志
if(~IR_DataShit == IR_data) //判断数据正反码
{
if((IR_UserH == (User_code / 256))&&(IR_UserL == (User_code%256)))
{
IrUserErr = 0; //判断用户码正确
}
else
IrUserErr = 1; //判断用户码错误
//IR_code = IR_data;
d_rem_key = IR_data; //取键码值
//Set_buz(5);//测试
IR_OK = 1; //键码值有效标志
}
}
else if((IR_BitCnt & 7)==0) //数据倒序
{
IR_UserL = IR_UserH; // 保存用户码高字节
IR_UserH = IR_data; // 保存用户码低字节
IR_data = IR_DataShit; // 保存当前红外字节
}
}
}
}
}
用定时器定时125us,然后在中断子程序中调用这个函数就好
-
消抖的延时太长导致的,消抖80ms程序死循环在此处。试试用时间片轮来代替延时。
-
在ADC.C文件中定义unsigned int ADCvalue[6][32]
在ADC.h文件中声明extern unsigned int ADCvalue[6][32]
-
雨后的梧桐 发表于 2018-11-21 14:49
if(60S到了)
{
60S清掉; work1(更新显示);
work2(时间倒计时);
}
是这个意思么?如果是的 ...
你好,是的,是这个意思。我以前的风格就是这样的形式,用定时器做定时,每个时间点打下一个标志,然后用if做判断然后执行相关子程序。 现在想用时间片轮任务数组的形式表现出来
-
chunyang 发表于 2018-11-21 16:52
见3楼帖,实时多任务的调度机制是切换时间片,不存在60s定时时间片就要连续执行60s的问题,更新显示和定 ...
大概 懂了,非常感谢解答