你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
hfei1980 发表于 2015-1-13 22:09 谢谢,刚转入STM8,请多指点。。
jcrorxp 发表于 2015-1-14 12:06 为什么要用220V变压器.我觉得不如用个5V USB充电器实际点吧, 把强电也弄到这里.除非你有塑料外壳. 不然不安 ...
STM8自学笔记(推荐STM8很好的入门电子书)
基于STM8的DALI (数字可寻址调光协议)
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM8S库函数中文参考 小软件
【资料分享】STM8L的智能手持血糖监测设备的源码
基于STM8S207工程模板
【培训资料】STM8系列PPT培训资料
STM8S 直流电机例程及相关资料
无刷直流电机控制应用+基于STM8S系列单片机---电子书
基于STM8S的外部I/O 中断 红外遥控解码
基于STM8S的红外遥控功能。我给大家分享一段代码。由于是产品了,不上传全部程序了
FuncState InfraredWate_Flag; //等待按键松开标志
Uint8 InfraredWate_Index; //用于等待按键松开计时
FuncState InfraredRec_Flag; //红外采集完成标志
Uint8 InfraredCode; //红外接收代码
Uint8 InfraredCode_Index; //红外接位计数
Uint8 InfraredBuffer_H; //红外识别码接收缓存
Uint8 InfraredBuffer_L; //红外接收代码缓存
Uint8 InfPeriod_Status; //红外周期状态
Uint16 TimeCounterVal; //计数器临时值
Uint8 ReciveIndex; //红外接收计数
static void TimeCounter_Start(void) //启动计数
{
TIM2->CNTRH = 0;
TIM2->CNTRL = 1;
TIM2->CR1 |= 0x01;
}
void TimeCounter_Stop(void) //停止计数
{
TIM2->CR1 &= 0xfe;
}
static void InfraredRec_Bit(Uint8* BufferAddr)
{
if((12000 < TimeCounterVal)&&(TimeCounterVal < 22000)) //0周期约为17000
{
*BufferAddr = (*BufferAddr) * 2;
}
else if((30000 < TimeCounterVal)&&(TimeCounterVal < 40000)) //1周期约为35000
{
*BufferAddr = ((*BufferAddr) * 2) + 1;
}
else ReciveIndex = 0;
}
void InfraredInterrupt_Process(void)
{
if(InfraredWate_Flag != L_FASE) //等待接收到按键松开的间隔符,才开始下次接收 每次中断4ms,10次约40ms
{
if(InfraredWate_Index <10) InfraredWate_Index ++;
else
{
InfraredWate_Flag = L_FASE; //已等到间隔符,清标志位
TimeCounter_Stop();
InfPeriod_Status = InfPeriod_Start;
}
}
else //防止计数中间产生的,错把间隔符当成正常位。还有一种是由于排除红外不工作时产生的干扰。
{
TimeCounter_Stop();
InfPeriod_Status = InfPeriod_Start;
}
}
void PeripheralInfrared_Receive(void)
{
if(InfraredWate_Flag == L_FASE) //处于非等待间隔符状态,开始正常接收
{
if(InfPeriod_Status == InfPeriod_Stop) //开始接收数据
{
disableInterrupts();
TimeCounterVal = ((uint16_t)TIM2->CNTRH << 8);
TimeCounterVal |= (uint16_t)(TIM2->CNTRL);
TimeCounter_Start();
enableInterrupts(); //存在一些硬件上的互锁机制,为了使得数据更准确,这里关掉中断,防止其它干扰
ReciveIndex ++;
if(ReciveIndex <= 8) InfraredRec_Bit(&InfraredBuffer_H); //前8位数据
else InfraredRec_Bit(&InfraredBuffer_L); //后8位数据
if(ReciveIndex >= 16)
{
InfPeriod_Status = InfPeriod_Start;
if(InfraredBuffer_H == InfraredUser_Code) //如果识别码正确
{
InfraredWate_Flag = L_TRUE; //已接收到功能码,等待间隔符
InfraredWate_Index = 0;
InfraredRec_Flag = L_TRUE; //
InfraredCode = InfraredBuffer_L; // 将数据送入缓存区
}
}
}
else //如果接收到了启始符,置标志位,开始接收数据
{
TimeCounter_Start();
InfPeriod_Status = InfPeriod_Stop;
ReciveIndex = 0;
}
}
else InfraredWate_Index = 0; //在等待按键松开,理论上讲,是不允许再接收重复红外信号的
}https://www.stmcu.org.cn/module/foru ... &pid=2049512&page=1
void Infrared_InitVar(void)
{
InfPeriod_Status = InfPeriod_Start;
TimeCounterVal = 0;
ReciveIndex = 0;
InfraredBuffer_H = 0;
InfraredBuffer_L = 0;
InfraredCode = 0;
InfraredCode_Index = 0;
InfraredRec_Flag = L_FASE;
InfraredWate_Flag = L_FASE;
InfraredWate_Index = 0;
}
在这个红外编码中由16位组成一串字帧。0 由 0.26ms的低电平和0.8ms的高电平表示, 1由 0.26ms的低电平和1.8的高电平表示。
两者的周期相差一倍,我把红外信号由红外接收头HS3818接收后送到STM8S的外部中断I/O上面,我是根据数据周期来判断是0
还是1的。
STM8S还是挺简单的,好好学,专心学习,天天学两周应该就可以了
不然不安全
实际的产品中绝大部分都是直接用市电220V的