侃侃单片机的裸奔程序的框架(经典)_第1页
侃侃单片机的裸奔程序的框架(经典)_第2页
侃侃单片机的裸奔程序的框架(经典)_第3页
侃侃单片机的裸奔程序的框架(经典)_第4页
侃侃单片机的裸奔程序的框架(经典)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们来谈谈单片机裸体本程序的框架!以下是我总结的几件东西,不一致的地方请大家指出。我第二次在21ic上发表文章。希望大家鼓励!07年参加全国大学生电子设计竞赛第一次接触单片机开发的4年,第一次学习单片机时,对串行端口(232,485)的各种功能IC控制、电机控制PWM、中断应用、计时器应用、人机界面应用、CAN总线等各种模块功能应用感到苦恼,基本技术。幸运的是,在参加电子设计大赛前的比赛训练的同时,MCU周围的控制训练很扎实。经过此阶段后,如果与其他MCU接触,您会发现存在不同的地方,具有不同的优点。学习新的MCU可以轻松启动任何类型的MCU,包括复杂的处理器。通过MCU的编程控制,一个高配置文件是对复杂算法的操作,它控制多种外围设备使用DSP)和与MCU的外围通信通常有多种计时,例如IIC、SPI、intel8080、M6800。MCU周围的编程似乎很简单。但这只是嵌入式开发的小毛皮。在接触MCU、复杂的设计要求、操作系统等后,戴尔在返回到单芯片微计算机的裸机开发时,会无意识地考虑整个程序设计的体系结构问题。好的程序框架是熟练的工程师和初学者的分水岭。下面概述了对SCM程序框架和开发中一些常用部分的理解。对时间的任何苛刻要求都是我们的敌人。必要时,为了消除这种情况,必须增加硬件成本。例如,在没有相关硬件支持的情况下,需要8个数字管,以显示使用MCU进行动态扫描必须工作良好。动态扫描多少会阻止MCU处理其他事情。在MCU负担得起的情况下,您将通过选择与max8279类似的周围IC来解决此问题。幸运的是,这并不需要太多的时间。例如,由于人们敲击键盘的速度是有限的,因此无需实时扫描键盘,就可以每几十毫秒扫描一次。但是,MCU可以在这几十毫秒的时间间隔内完成很多事情。虽然BMR是裸机运行(BMR),但现实的需求往往决定了您必须离开操作系统的姿势的多任务程序。例如,一般情况下有四种操作。1键盘扫描,2 led数码管显示器;3需要接受和处理串行数据;4串行端口需要传输数据。制造这种单片机的方法将成为我们的焦点。在阅读时代,将键盘扫描放入主环路,串行端口用于接收数据,中断服务函数创建对应于该帧格式后缀的标志位,在主函数环路中,还将数据处理、串行端口传输数据和led显示放入主环路。然后,整个程序以标志变量的通信方式在主循环和后台中断中一起运行。但是必须指出它的缺点。每个操作的时间片可能太长,这会降低程序的实时性能。通过这种方式,再添加一些操作,在一个周期中花费的时间太长,键盘扫描可能非常不敏感。因此,要创建一个好的通用编程模型,必须消除每个任务中耗时的部分,并找到重新分解每个任务的方法。让我详细说明各项工作的具体措施。1个键盘扫描键盘扫描是常用单片机的函数,表示常用键盘扫描仪中严重干扰系统实时性能的部分。按下一个键后的波形已知如下(低有效假设):如果按键被按下,则数据线的信号会抖动一段时间,然后降低,然后松开按键,则信号会抖动一段时间,然后增加。当然,如果数据线低或高,可能会产生一些窄的干扰信号。Unsigned char kbscan(void)Unsigned char sccode,recodeP2=0xf8If (P20xf8)!=0xf8)delay(100);/推迟20毫秒-太费时间了,太可怕了If(P20xf8)!=0xf8)Sccode=0xfeWhile(sccode0x08)!=0)P2=sccodeIf (P20xf8)!=0xf8)Breaksc code=(sc code 1)|0x 01;recode=(p20x F8)|0x0f;return(sccode recode);return(KEY _ NONE);键盘扫描需要软件晃动,但软件延迟(ms级别延迟)是维护系统实时性能的一大禁忌。一般来说,还有决定密钥发射的代码。While(kbscan()!=KEY_NONE)/死循环等待这很糟糕。如果继续按键盘,则整个系统中的其它操作也不会运行。这是一个很严重的错误。会有人这样处理:While(kbsan()!=KEY_NONE)delay(10);If(Num 10)Break连续按键盘一段时间后,将被视为有效的键。这不会导致整个系统中的其他任务无法运行,但由于大部分使用了延迟函数,系统的实时性能会降低。解决这个问题有两种有效的方法。即使一键功能相对简单,也要使用上述kbscan()函数进行扫描。只是消除了其中颤抖的软件,作为判断摇晃、密钥发射的一个函数处理,并不是软件延迟,而是作为计时器的计时(也可以作为正常计时)处理;代码如下Void ClearKeyFlag(void)KeyDebounceFlg=0;KeyReleaseFlg=0;Void ScanKey(void)KeyDebounceCnt/计时抖动(此计时也可以由后台计时器计时函数处理。)KeyCode=kbscan();If (KeyCode!=KEY_NONE)进入KeyDebounceFlg(if)/抖动状态的标志位if(keydebouncecnt de bounce _ time)/大于规定的时间如果If (KeyCode=KeyOldCode)/键仍然存在,则返回关键值KeyDebounceFlg=0;KeyReleaseFlg=1;/发行旗标Return/Here exit with keycodeClearKeyFlag();/KeyCode!=kiol dcode,只是抖动 elseIf (KeyReleaseFlg=0)KeyOldCode=KeyCodeKeyDebounceFlg=1;KeyDebounceCnt=0; elseIf (KeyCode!=KeyOldCode)ClearKeyFlag(); elseClearKeyFlag();/如果密钥不存在,则清除零标志KeyCode=KEY _ NONE如果有复杂功能的键(例如长键、组合键、组合键等),则倾向于使用状态机执行键盘扫描。/avr单片机4*3扫描状态机的实现Char read_keyboard_FUN2()Static char key _ state=0、key _ value、key _ line、key _ timeChar key_return=No_key,I;交换机(key_state)case 03360/初始状态,执行3*4键盘扫描Key _ line=0bfor(I=1);I=4;I) /键盘检查PORTD= key _ line/输出行级别PORTD= key _ line/要发两次!(注1)Key _ value=Key _ mask PIND/读取栏层级If (key_value=Key_mask)key _ line=1;/如果密钥不存在,则继续扫描ElseKey _ state/有键停止扫描Break/删除摇晃确认状态Break事例1: /此状态确定键是否由抖动引起if(key _ value=(key _ mask pind)/重新读取栏层级。Key _ state/进入键释放等待状态key _ time=0;Elsekey _ state-;/具有不同列级别的返回状态0,(抖动处理)Break等待Case 23360/密钥发布状态PORTD=0b/所有行输出行级别PORTD=0b/重复发送一次If (Key_mask PIND)=Key_mask)key _ state=0;/列线全部返回较高级别的状态0key _ return=(key _ line | key _ value);/已获取键值Else if(key_time=100)/如果长期未发行key _ time=0;key _ state=3;/输入组合状态key _ return=(key _ line | key _ value);Break对于Case23360/连字符密钥,每50毫秒提供一个密钥值,在windows XP系统上执行此操作PORTD=0b/所有行输出行级PORTD=0b/重复发送一次If (Key_mask PIND)=Key_mask)key _ state=0;/列线全部返回较高级别的状态0Else if(key_time=5) /每50毫秒按一次键key _ time=0;key _ return=(key _ line | key _ value);BreakReturn key _ return上面使用了四种状态,普通键盘扫描只需要使用前三种状态,下一种状态旨在增加“组合”功能。按下键时,关键点值会快速地响很多次,直到松开键为止。键盘扫描函数在基本循环上以10毫秒的间隔运行。我们把时间设置为10毫秒。当然,要求不严格。2数码管显示器通常使用通过动态扫描执行显示的8位数字管。幸好在50hz以上的闪烁中找不到人眼。所以我们有足够的间隔动态扫描数字管。时间限制设置为4毫秒(250HZ),计时器计时设置为2毫秒,计时器中断程序一次只显示一个扫描。当然,时间限制可能会更长。更推荐的方法是将显示函数放入主循环中,并定期中断相应的标志位。/Timer 0比较匹配中断服务,4毫秒计时interruptTim 0 _ compvoid time r0 _ comp _ ISR(void)display();/调用LED扫描显示.Void display(void) /8位LED数码管动态扫描函数PORTC=0xff/需要在此处关闭所有段。否则,数字管状体将生成拖动阴影PORTA=led _ 7dis _ buffposit;PORTC=职位职位;If (posit=8)posit=0;3串行接收数据帧串行端口以中断方式接收。这个不厚。但是,如果中断服务程序尝试结束一帧的数据接收,则会出现问题。永远记住中断服务函数越短越好。否则,将影响此程序的实时性能。通常,数据帧包含几个字节,因此,请确保帧完整且正确。在这个过程中,我们不能推迟软件,也不能等待死循环。在串行接收中断函数中,将数据入队到缓

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论