IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 常用的单片机裸机非阻塞式框架 -> 正文阅读

[嵌入式]常用的单片机裸机非阻塞式框架

常用的单片机裸机非阻塞式框架

软件定时器

1.设置1ms定时器中断,设置变量在定时器中断函数中++/–,以此计数,while(1)中对改变量进行值判断就能得到指定时间。
2.不仅适用于51系列,跑裸机都可以使用此框架,非阻塞式延时。
3.注意MCU的工作频率和机器周期。

unsigned int Cnt1 = 0;
unsigned int Cnt1 = 0;
void main()
{
	while(1)
	{
		if(Cnt1)      	//1ms执行一次
		{
			Cnt1 = 0;
			task_1ms();  //在此任务函数中,可以继续计时
		}
		
		if(Cnt2 >= 10)  //确定时间,10ms执行一次
		{
			Cnt2 = 0;
			task_10ms();
		}
	}
}

void timer0() interrupt 1
{	
	TL0	= 0x1C;	//与计算值会有一定偏差,需做补偿
	TH0	= 0xFC;	//定时器重赋值
	Cnt1 = 1;   //1ms定时器
	Cnt2++;     //不定	
}

按键扫描消抖

1.机械按键按下会产生抖动,通过非阻塞式的延时去抖。
2.根据不同场景,可以增加双击、组合键等功能,需要代码的评论或私发。
3.最好放在1ms中断函数中,对时间要求高。

void KeyScan(void)      //1ms定时器中
{
	static uint Su16TouchKeyCnt = 0;	//计时
	static bit SbTouchKeyLock = 0;		//长按锁
	static bit SbKeyShortPressFlag = 0;//确定短按
	if(!(Tu16CurKey & (0x08)))  //没有按下时
	{
		SbTouchKeyLock = 0;	 
		Su16TouchKeyCnt = 0; //按下时间清零
		if(SbKeyShortPressFlag)//短按任务
		{
			SbKeyShortPressFlag = 0;
			//短按标志位
		}
	}
	else if(!SbTouchKeyLock)		//避免多次触发长按功能
	{
		Su16TouchKeyCnt++;			//按下计时
		
		if(Su16TouchKeyCnt >= 20)	//大于20ms才算按下,以此来延时消抖,并且不会阻塞系统
		{
			SbKeyShortPressFlag = 1; //已有短按
		}
		if(Su16TouchKeyCnt >= 2000)	//长按2s后,取消短按/锁住长按
		{
			SbTouchKeyLock = 1;
			SbKeyShortPressFlag = 0;//取消短按
			//长按标志/长按任务
		}
	}
}

//任务函数
void Key_Task(void)
{
	switch或者if判断是哪种类型的按键按下
}

数码管显示

1.假设是共阳双八数码管。
2.假设用按键设置时,数码管闪烁显示。
3.假设是单片机的P2口连接数码管引脚。

void DisplayScan(void)   //1ms定时器中扫描
{
	static uchar Su8ScanStep = 0;//动态扫描步骤
	 
	if(GbWorkStatus)
	{
		if(GbLedEnableFlag )
		{
			//消隐
			P2 = (unsigned char)0xFF;	//共阳,给高电平不亮
			LED_COM1_CLOSE;				//第一个8片选关闭
			LED_COM2_CLOSE;				//第二个8片选关闭

			switch(Su8ScanStep)			//扫描步骤
			{
				case 0:     //first
					P2 = Gu8LedDigTableBuf[Gu8LedFirstShowData]; //在外部确定Gu8LedFirstShowData的值是多少,将0-9和部分字母的编码列举在Gu8LedDigTableBuf[]数组中
					LED_COM1_OPEN;	//选中第一个数码管
					LED_COM2_CLOSE;
					Su8ScanStep++;	//下一次显示第二个数码管
				break;
				
				case 1:     //second 
					P2 = Gu8LedDigTableBuf[Gu8LedSecondShowData];//第二位数据
					P27 = !GbLedThirdShowEnable;				 //是否带小数点
					LED_COM1_CLOSE;
					LED_COM2_OPEN;
				
					//=============================以下为闪烁部分程序,不需要闪烁时,删除下面case 1程序,添加Su8ScanStep = 0;即可
					if(!GbLedFlickerFlag)	//闪烁标志位,没有要求闪烁的话跳回到第一个数码管的显示
					{
						Gu16LedOffFlickerCnt = 0;
						Su8ScanStep = 0;
					}
					else if(++Gu16LedOffFlickerCnt >= LED_ON_FLICKER_TIME)//要求闪烁时,闪烁时期亮的时间
					{
						Gu16LedOffFlickerCnt = 0;
						Su8ScanStep++;
					}
					else
						Su8ScanStep = 0;	
					break;
				case 2://
					LED_COM1_CLOSE;
					LED_COM2_CLOSE;
					if(++Gu16LedOnFlickerCnt >= LED_OFF_FLICKER_TIME)	//闪烁时期灭的时间
					{
						Gu16LedOnFlickerCnt = 0;
						Su8ScanStep = 0;
					}
					break;
			}
		}
		else
		{
			LED_COM1_CLOSE;
			LED_COM2_CLOSE;
		}
	}
}

无源蜂鸣器

1.通电后需要一定震荡频率蜂鸣器才会响。

unsigned int xdata Gu16BuztimerCnt = 0; 
#define BUZ_OPEN (Gu16BuztimerCnt = 200)  //一次响200ms
void BeepTask(void)
{
	static bit Su8Buzlock = 0;
	static uchar TempCnt = 0;
	static uint IntervalCnt = 0;		//间隔时间
	static SbVoiceIntervalFlag = 0;		//间隔响
	
	if(SbVoiceIntervalFlag == 0 && Gu16BuztimerCnt > 0) 		
	{
		if(Su8Buzlock == 0)
		{
			Su8Buzlock = 1;
			TempCnt = Gu16BuztimerCnt;	//重新赋值不受Gu16BuztimerCnt影响
			PWM_Set(Enable,x);  //PWM开启
		}
		else
		{
			TempCnt--;
			if(TempCnt == 0)
			{
				Gu16BuztimerCnt = 0;					
				SbVoiceIntervalFlag = 1;
				PWM_Set(Disable,x);   //PWM关闭 
				Su8Buzlock = 0;
			}
		}
	}
	else if(SbVoiceIntervalFlag == 1)    
	{
		IntervalCnt++;
		
		if(IntervalCnt >= 50)		//间隔50ms使能
		{
			IntervalCnt = 0;
			SbVoiceIntervalFlag = 0;
			Gu16BuztimerCnt = 0;		
		}	
	}
}

基础的后续慢更

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:36:10  更:2021-12-04 13:38:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 2:12:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码