精华内容
下载资源
问答
  • 单片机分时复用

    万次阅读 2011-03-23 17:29:00
    分时操作系统却是把CPU的时间划分成长短基本相同的时间区间,即“时间片”,通过操作系统的管理,把这些时间片依次轮流地分配给各个用户使用。如果某个作业在时间片结束之前,整个任务还没有完成,那么该作业就被暂停...

    作为嵌入式系统主控单元——单片机,其软件往往是一个微观的实时操作系统,且大部分是为某种应用而专门设计的。系统程序有实时过程控制或实时信息处理的能力,要求能够及时响应随机发生的外部事件并对该事件做出快速处理。而分时操作系统却是把CPU的时间划分成长短基本相同的时间区间,即“时间片”,通过操作系统的管理,把这些时间片依次轮流地分配给各个用户使用。如果某个作业在时间片结束之前,整个任务还没有完成,那么该作业就被暂停下来,放弃CPU,等待下一轮循环再继续做。此时CPU又分配给另一个作业去使用。由于计算机的处理速度很快,只要时间片的间隔取得适当,那么一个用户作业从用完分配给它的一个时间片到获得下一个CPU时间片,中间有所“停顿”;但用户察觉不出来,好像整个系统全由它“独占”似的。分时操作系统主要具有以下3个特点:① 多路性。用户通过各自的终端,可以同时使用一个系统。② 及时性。用户提出的各种要求,能在较短或可容忍的时间内得到响应和处理。③ 独占性。在分时系统中,虽然允许多个用户同时使用一个CPU,但用户之间操作独立,互不干涉。

      分时操作系统主要是针对小型机以上的计算机提出的。一般而言,微处理器(MPU)驱动的通用计算机,系统设计人员对每一台的最终具体应用都是不得而知的,因此,在价格允许的情况下,硬件设计务求CPU时钟尽可能的快;计算及管理能力尽可能的强;程序和数据存储器的容量尽可能的大;各种计算机外设的配接尽可能的详尽等等,特别是采用分时操作系统的机器,因为是一机多用户的管理系统,它的要求就更高了。相对而言,微控制器(MCU)俗称单片机,是一个单片集成系统,它将这些或那些计算机所需的外设,诸如程序和数据存储器、端口以及有关的子系统集成到一片芯片上。从硬件上,单片机系统与采用分时操作系统的计算机系统是无法比拟的。但是,在单片机系统的设计中,设计人员对其最终具体应用是一清二楚的,它的使用环境相对是单一固定的。所控制的过程的可预见性为分时系统思想的实现提供了可能性。具体一点就是:虽然单片机的CPU速度较低,但其任务是可预见的,这样作业调度将变得简单而无须占用很多的CPU时间,同时“时间片”的设计是具体而有针对性的,因此可变得很有效。

    一、 单片机分时系统的设计

      单片机系统往往是一个嵌入式的控制系统,因此目前绝大部分的单片机系统还是一实时系统。能够真正体现分时系统的设计思想的往往是那些多路重复检测控制系统。即便是在这些多路重复检测控制系统中,它的实时性也是非常重要的。也就是说,在单片机系统中应用了分时系统设计思想,但其及时性应首先进行考虑。

    1. 对单片机分时系统硬件设计的建议

      随着单片机性能的提高,单片机系统设计中的一些硬件功能软件化是大势所趋。但同时,一日千里的芯片技术也为低成本的硬件完成高性能的功能提供可能。让一种功能到底是通过硬件实现还是通过软件来实现不能一概而论,只能是通过系统设计让整个系统的性能价格比最高才是每个单片机系统设计者孜孜追求的目标。

      在单片机分时系统的硬件设计中,由于对系统的及时性的要求不能降低,而大多数单片机的处理速度相对而言是较慢的。因此,在接口硬件的设计上应采用一些能将信息量保持的器件,如触发器、锁存器。同时要求这些器件应该是三态门输出,因为是多路分时系统,当CPU没有访问到时,器件输出呈现高阻,以利于总线对其他器件的访问。还有,一些用软件比较费时的操作应转给硬件完成。如LED动态显示,没有必要一定用intel 8155或intel 8255硬件接口让软件时时为显示数字而煞费苦心,完全可以用intel 8279或MAX7218及MAX7219这些可编程外围器件来完成,使显示既漂亮又简单。当然,到底哪些功能留给硬件完成,哪些功能留给软件完成,应根据系统的不同而具体设计。总之,应总体考虑,追求最高的性能价格比。

    2. 单片机分时系统的软件设计

      为了合理实现单片机分时系统,还须有完善的调度机制。完善的调度机制主要由调度指针和调度表组成。系统的调度分成两级,一是“路”的调度,相当于指示程序横向进行:从第一路的某一作业到第二路的某一作业,从第二路的某一作业再到第三路的某一作业……从最后一路回到第一路,循环往复。“路”调度的调度指针变化规律是固定不变的,算法简单,即递增一或递减一,循环到头后,再返回到起始。相对应的“路”调度指针还应构造“路”调度表。“路”调度表每一项表示各“路”程序入口地址及跳转指令。以MCS-51单片机为例,采用AJMP addr11作为每一项的内容,则调度表的每一表项占2个字节;当程序较长超过2K字节,则采用LJMP addr16作为每一项内容,占3个字节。所设计的单片机系统共有多少“路”,该调度表就有多少项数。二是作业调度,即相当于指示程序纵向进行:从某一路的第一作业指向该路第二作业,第二作业指向第四作业……也有从第六作业指回第三作业的等等。因稍复杂任务的流向都不可能是单方向性的,从上一作业流到下一作业都要根据系统的检测或运算结果来决定,因此作业调度指针的变化是随机决定的。作业调度表的构成形式与“路”调度表相同,每一项表示各作业模块的程序入口地址及跳转指令。作业调度表指示出各作业执行的一般先后次序,表项数等于一路任务的最大作业数。为了分清每路的任务进程,单片机系统要控制多少路就必须有多少个作业调度指针及相应作业调度表。以上两级指针都为1个字节的整数变量。调度指针与调度表的联系是通过指令JMP @A+DPTR实现的。DPTR中是调度表的首地址。累加器A中的内容是调度指针的整数倍,若表项内容是AJMP addr11,则A的值为调度指针乘2;若表项内容是LJMP addr16,则A的值为调度指针乘3。

      除了以上主程序的调度设计外,各个作业中共同的功能应放在中断中实现,主要是放在定时器中断。如计时功能应放在定时器定时中断中实现,定时参数的选择应考虑到系统各个作业中各种计时的要求,定时频率一般为最小计时频率的整数倍。任何软件延时都是不允许的。 实现分时控制的关键是在于合理地将系统的功能分解成各个作业模块。作业模块分得越细系统的实时性就越好。虽然单片机的时钟频率较低,在实际应用中当各个作业模块被细分成各个“动作”及简单的运算后,分时系统的实时性是能得到保证的。缺点就是各“路”的控制处理程序被分割得支离破碎,模块化得不到保证。

    二、 应用实例

    1. 系统硬件及工作原理

      宾馆用的视频点播系统VOD(Video On Demand)中,从各个机定盒送出的上行信号用DTMF码通过电话线传输到机房的主控制柜中的上行信号采集卡中。为了能同时接受多个用户的点播操作,上行信号采集卡必须有接受多路电话传输信息的功能,为此,笔者设计了8路电话采集卡,可同时接受8路用户的点播操作,系统硬件框图如图1所示。

     

       图1 电话采集卡硬件框图

      每路大致的主程序是:检测到振铃信号后(即为振铃检测脚变低并保持8ms以上),继电器吸合,同时马上给机定盒回一接通信号——#键(保持400ms)。然后等待机定盒发送点播信息:客房号、点播的节目号,共4位DTMF码;若1s内无DTMF码收到(收到表示为解码芯片的DV脚变高)表示操作有误,继电器断开,状态位复原,作业指针回0。收齐4位DTMF码后将其整理并带上该路的标志,转化成3字节送到串行发送缓冲区,在定时器中断服务程序中发送。等待视频服务器回送应答信息,根据应答信息不同向机定盒回送不同的信息;若超时无应答也向机定盒回送一码(发码时间都为100ms)。最后,继电器断开,状态标志复原,缓冲区清0,作业指针也回到0。一个过程完成。

     

    2. 作业流程

      为了能实现8路分时工作,最主要的工作是将这一过程细分成一个个作业。笔者通过设计把它分成8个作业,各作业的流程如图2所示。 以上每一作业返回后,“路”指针自动加1,到8后回到0,以保证分时工作合理。

    图2 各作业流程

    3. 几点技巧

      8路电话信息采集卡的编程中,为了使程序更精练,笔者应用以下3个技巧:

    ① 因为这8路的工作是相同的,程序可以共用,只须再构造1“路”地址表,每一表项含有本路的输入锁存器地址、输出锁存器地址、DTMF码存放RAM地址、计时单元地址。这样可以省掉“路”调度表,因为各路相同作业的入口地址是相同的。根据“路”指针的不同,带入该“路”的地址表项,即可用相同的程序对8路分别控制操作。

    ② 定时器中断设置成4ms一次,这是因为电话振铃是25Hz,检测脚保持低电平的时间为10ms,它是最低的计时值。当振铃检测脚低电平保持时间少于8ms时可认为是干扰。每一路都有自己的计时单元,每次定时器中断后,在定时服务自程序中各路计时单元自动加1。在上一次作业中将计时单元请0,下一次作业读出计时单元的值,延时值即为该值乘以4ms。这样任何延时都不占用CPU机时。

    ③ 串行数据的发送和接收是8路共有的操作,采用共同的模块。数据的链接是通过开辟缓冲区实现的,有发送缓冲区和接收缓冲区,采用4800baud的波特率。一般程序的串行数据发送时,都须要检测TI位的变化来判断1字节数据发送是否完成,由此决定可否发下一字节数据。应用到分时系统是行不通的,这要占用CPU机时,因为采用4800baud的波特率,则每一字节的发送时间少于4ms。当发送缓冲区有数据时,可在定时器中断服务自程序中发送。每一次定时中断中发送1字节数据,当下一次定时中断来时,上一字节数据必定已发送完毕,可发送下一字节数据。无须检测TI位,也不占用CPU机时。数据接收采用串行中断,接收到的数据存放到接收缓冲区供各路查询。

    结论

      将分时操作系统的思想引入单片机系统,提出了一个针对多路检测控制的单片机系统软件编程。大大减低了系统的设计成本,提高了系统的性能价格比,并在实际应用中获得成功。

    展开全文
  • 如题,现在用到STC15F2K60S2单片机,需要用到3个串口,但是本身只有2个串口,想用串口1分时复用,望大神能解答一下怎么实现,串口中断怎么工作的
  • 单片机外部扩展地址... 【摘要】文章分析了单片机外部扩展的总线时序,提出了当系统通过总线方式连接时,地址、数据总线的分时复用的问题,通过举例说明系统扩展中数据地址总线电路部分以及相应程序的设计方法。  

    单片机外部扩展地址数据总线的分时复用


    □ 李 玲

      【摘要】文章分析了单片机外部扩展的总线时序,提出了当系统通过总线方式连接时,地址、 数据总线的分时复用的问题,通过举例说明系统扩展中数据地址总线电路部分以及相应程序的设计方法。
      【关键词】单片机;时序;分时复用
      【 中图分类号】 TP393 【文献标识码】A
      【文章编号】1671-5969(2007)21-0191-02
      
      一、问题的提出
      
      80C51单片机有4个8位的I/O接口,分别是P0、P1、P2、P3口。当外扩存储器或I/O接口时,也要利用I/O接口传送地址及数 据。由于外扩的程序、数据存储器空间分别为64K,这就需要有16条地址线,8位数据线。为了节约I/O接口采用了低8位地址与数据总线分时复用的方法。 即当读写外部时,单片机首先由P0、P2口送出16位地址,然后通过P0口读写数据,并且要求在整个读写过程中,地址是不能改变的。单片机外部操作时序如 图1所示。
       单片机外部扩展地址数据总线的分时复用图片1
      从时序图上可看出单片机采用了在P0口上输出低8位地址的同时,由ALE引脚送出地址锁存允许信号的解决方法,但是具体硬件电路需外部实现。
      
      二、解决的思路
      
      根据不同的需要,单片机应用系统所需的外围电路多种多样,有的扩展芯片不带锁存器,有的芯片片内已集成有锁存器,因此解决P0口地址、数据分时复用的方法也不同。
       (一)在单片机外部连接锁存器
      当外扩电路的芯片中无锁存器时,要保证在单片机读写过程中地址不变。由时序图图1知道,当P0口输出DPL时,要进行地址锁存。则在单片机的 外部连接一锁存器。地址锁存控制信号ALE接锁存器控制端,ALE发生负跳变时,锁存器将低8位地址锁存,P0口方可作为数据线使用,其连接框图如图2所 示。
       单片机外部扩展地址数据总线的分时复用图片2
      (二)单片机与外扩芯片连接或通过锁存器连接
      外扩芯片中已集成有地址锁存器,此类电路,差别较大。下以A/D转换起芯片ADC0809为例说明。
      ADC0809部分性能:分辨率为8位,具有锁存控制的8路输入模拟开关,转换速度取决于芯片外接的时钟频率,时钟频率范围:10-1280KHz。其ADC0809内部结构如图3所示。
       单片机外部扩展地址数据总线的分时复用图片3
      部分引脚功能:
      IN0-IN8:八路模拟量输入端。
      ALE:地址锁存信号输入端。通常向此引脚输入一正脉冲时,可将三位地址选择信号ADDA、ADDB、ADDC输入地址锁存器内,并进行译码,选通相应的模拟输入通道。
      START:启动A/D转换控制输入端。一般向此引脚输入一正脉冲,上升沿复位逐次比较寄存器,下降沿开始A/D转换。
      ADC0809的工作时序如图4所示。
       单片机外部扩展地址数据总线的分时复用图片4
      通过对ADC0809的内部结构框图以及时序图的分析得知,此类芯片与单片机的接口有两种形式。
      1.直接与单片机连接
      图5是ADC0809的模拟输入通道与单片机的P0口直接相连的接口。由于ADC0809具有输出三态锁存器,故其8位数据输出线可与 89C51数据总线相连。在本图中模拟输入通道地址的译码输入A、B、C也由P0.0~P0.2直接提供。对照时序图图1、图4可知,单片机在DPL输出 时,ADC0809的ALE引脚上同叶出现地址锁存允许信号,随后 P0口上的地址消失,当8位数据输出时,单片机的P2.0作为片选信号,与进行或非操作得到一个正脉冲加到ADC0809的ALE和START引脚上。锁 存P0口上的低3位数据,即为通道选择。由于ALE和START连接在一起,因此ADC0809在锁存通道的同时也启动转换。
       单片机外部扩展地址数据总线的分时复用图片5
    展开全文
  • 软件定时器和分时复用的实现

    千次阅读 2017-04-10 15:32:57
    单片机编程中,最主要的是掌握单片机工作的时间节拍,最大限度地利用CPU资源,下面提供一种基于基准定时器进行软件定时、任务执行采用分时复用的方法,规定每个任务执行的时间,执行时间到后切换下一任务。...

    在单片机编程中,最主要的是掌握单片机工作的时间节拍,最大限度地利用CPU资源,下面提供一种基于基准定时器进行软件定时、任务执行采用分时复用的方法,规定每个任务执行的时间,执行时间到后切换下一任务。

    u16 Timer_Count = 0,Timer_Count_OverFlow = 0;
    u16 this_time = 0,last_time = 0,time_overflow = 0;
    #define Timer_Period             60000
    #define OutofRunningTime(time)  (Timer_Period*Timer_Count_OverFlow+this_time-last_time >= time)
    #define TIME_MS(x)              (1*x)
    #define TIME_S(x)               (1000*x)
    #define TOTAL_TASK              3      //定义任务总数
    enum {TASK1,TASK2,TASK3};
    
    void 26 interrupt PIT0(void)     //中断定时器,1ms进入一次
    {
    	Timer_Count ++;
    	if(Timer_Count >= Timer_Period)
    	{
    		Timer_Count = 0;
    		Timer_Count_OverFlow ++;
    	}
    }
    
    static u8 task1(void)
    {
    	last_time = Timer_Count;
    	Timer_Count_OverFlow = 0;
    	for(;;)
    	{
    		this_time = Timer_Count;
    		do_some_thing();
    		if(OutofRunningTime(TIME_S(2)))
    			return TASK2;
    	}
    }
    
    static u8 task2(void)
    {
    	last_time = Timer_Count;
    	Timer_Count_OverFlow = 0;
    	for(;;)
    	{
    		this_time = Timer_Count;
    		do_some_thing();
    		if(OutofRunningTime(TIME_S(2)))
    			return TASK3;
    	}
    }
    
    static u8 task3(void)
    {
    	last_time = Timer_Count;
    	Timer_Count_OverFlow = 0;
    	for(;;)
    	{
    		this_time = Timer_Count;
    		do_some_thing();
    		if(OutofRunningTime(TIME_S(2)))
    			return TASK1;
    	}
    }
    
    u8 task_process(u8 task)
    {
    	u8 next_task;
    	switch(task)
    	{
    		case TASK1:
    			next_task = task1();
    		break;
    		case TASK2:
    			next_task = task2();
    		break;
    		case TASK3:
    			next_task = task3();
    		break;
    		default:
    		break;
    	}
    	return next_task;
    }
    
    u8 Current_Task = TASK1;
    void main(void)
    {
    	Current_Task = system_init();
    	for(;;)
    	{
    		Current_Task = task_process(Current_Task);
    	}
    }

    代码中定义了一个时基为1ms的中断定时器,用Timer_Count作为自由计数值,计数上限为Timer_Period,到达上限后将Timer_Count清零,同时统计一次溢出次数Timer_Count_OverFlow,溢出次数自由计数,直到溢出后清零,进入下一轮回。

    main函数执行的时候进入task_process函数,同时传递进入当前需要执行的任务号,首次执行的时候传递进去的任务号是TASK1,从task1()开始执行,下面对task1()进行分析。

    执行任务函数的时候先记录当前Timer_Count的值,将溢出次数Timer_Count_OverFlow清零,然后一直执行for循环中的do_some_thing(),同时记录和检测当前Timer_Count的值,根据当前Timer_Count值和进入任务时的Timer_Count比较,如果时间到达我们需要任务执行的时间,则跳出for循环,同时返回下次要执行的任务号,在main函数中根据返回的任务号进入下一任务的执行。

    代码中实现的是基本的软件架构,并没有具体程序执行的功能代码,移植的时候只要使用单片机中的一个定时器,不断产生1ms的定时中断即可。

    展开全文
  • 文章目录01 - PCB原理图例程02 - 分时复用的注意项和设计2.1 - 注意项2.2 - 设计03 - 代码实现 只要我跑的速度够快,寂寞就追不上我 只要Key和Led切换速度够快,人眼就看不出来 ————小白   如果你存在按键...


    只要我跑的速度够快,寂寞就追不上我
    只要Key和Led切换速度够快,人眼就看不出来

    ————小白


      如果你存在按键Key和显示Led共用同一个IO时,需要分时复用的需求,则可以移植代码进行使用:

    • 代码所占code少于0.5K
    • 线程安全,中断安全
    • 可移植性高,配置容易
    • 注意:系统需要存在一个至少为1ms的时钟中断

    01 - PCB原理图例程

      举2个Key和Led共用IO口的例子,当MCU的IO口资源不足时,通常会让一些可以用速度欺骗人眼的做法进行资源的节省,比如Key扫描、Led扫描等,例如Led的扫描只要高于25Hz的速度,人眼就基本看不出闪烁,例如Key扫描只要大于100Hz,人的触感就难以察觉。

    例程1

    在这里插入图片描述

    例程2

    在这里插入图片描述

    02 - 分时复用的注意项和设计

    2.1 - 注意项

      Led和Key的分时复用需要考虑几个情况:
      1、Led扫描的频率,必须高于肉眼能看见闪烁的频率25HZ。一般为了效果较好,都会大于50HZ,也就是Led扫描时间<=20ms
      2、保证分时复用,扫描一定要有先后顺序。要确保Led扫描期间不能进行Key扫描,同时确保Key扫描期间不能进行Led扫描
      3、Led需要备份当前状态。因为扫描Key时Led是不起作用的,Key扫描完成后需要恢复Led的状态
      4、注意Led切换为Key时的准备动作。Led切换为Key时根据原理图要做哪些准备工作以防止切换后Key误触发,而Key切换为Led时按照电路决定是否需要做准备动作
      5、Led扫描时间比Key扫描时间长。考虑到肉眼的观察是最容易受影响的,时刻都能看见,而按键的使用次数则较低

    2.2 - 设计

      根据注意项,总体设计如下:
      1、系统需要有一个至少为1ms的时钟中断,里面调用扫描ISR函数LedKeyStatusSwitchService_1ms,用于保证高频扫描
      2、理清状态机,存在2种状态的切换,分别为KeyState和LedState,值得注意的是,Led和Key的数量暂时未知,如果数量较多则实际的扫描动作不宜在中断内进行,此时中断则只做状态切换,所以2个状态分别需要一个记录器
      3、决定取舍,Led为人眼可见,最为敏感,Led的扫描动作直接放在中断进行,舍弃Key的中断扫描,让Key在前台进行扫描

    03 - 代码实现

      以例程1的PCB为例,整个分时复用时间为6ms(167Hz),其中Led扫描占据4ms,Key扫描占据2ms,下面为参考代码:

    #define LED_SACND_TIME_MS	4
    #define KEY_SACND_TIME_MS	2
    volatile uint8_t configKeyFlag = 0;
    volatile uint8_t configLedFlag = 0;
    uint8_t ledKeyStatusSwitchCnt = 0;
     
     /* MCU的底层配置 */
    void IOPorts_ConfigKey(void)
    {
    }
     /* MCU的底层配置 */
    void IOPorts_ConfigLed(void)
    {
    }
     /* 恢复Led的状态 */
    void revProcess_AfterConfigLed(void)
    {
    }
     
     /* 在底层配置为Key之前的预处理,主要是Led电路对Key电路的影响 */
    void preProcess_BeforeConfigKey(void)
    {
        //COM1 & COM2必须拉高,否则数码管内会输出低电平导致Key误触发
        _IO_setDisplayCOM1(1);
        _IO_setDisplayCOM2(1);
         
        //把复用的IO拉高,防止寄存器内为0导致Key误触发
        _IO_setDisplayS5(1);
        _IO_setDisplayS6(1);
        _IO_setDisplayS7(1);
        _IO_setDisplayS8(1);
    }
     
    /* 为保证频率,Service一般都在中断内执行 */
    void ledKeyStatusSwitchService_1ms(void)
    {
        ledKeyStatusSwitchCnt++;
        if(ledKeyStatusSwitchCnt <= LED_SACND_TIME_MS) {
            if ((configLedFlag == 0) && (configKeyFlag == 0)) {
                configLedFlag = 1;
                IOPorts_ConfigLed();
                revProcess_AfterConfigLed();
            }
        } else if(ledKeyStatusSwitchCnt <= (LED_SACND_TIME_MS + KEY_SACND_TIME_MS)) {
            if ((configKeyFlag == 0) && (configLedFlag == 1)) {
                preProcess_BeforeConfigKey();
                IOPorts_ConfigKey();
                configKeyFlag = 1;
                configLedFlag = 0;
                 
                //当按键数较少而且扫描时间较短时,可以选择在中断内进行,但一般选择在main中进行
                /*
                keyScanHandler();
                configKeyFlag = 0;
                */
            }
     
        } else if (ledKeyStatusSwitchCnt >= (LED_SACND_TIME_MS + KEY_SACND_TIME_MS + 1)) {
            ledKeyStatusSwitchCnt = 0;
        }
    }
     
     /* 在main()前台执行 */
    void KeyScandHandler(void)
    {
        if (configKeyFlag) {
            keyScan();
            configKeyFlag = 0;
        }
    }
    
    展开全文
  • 摘要:提出基于分时系统思想的单片机系统设计方案,给出一具体应用的实例以及详细的实现方法。  关键词:分时操作系统 单片机系统 作业调度 指针 前言  作为嵌入式系统主控单元——单片机,其软件往往是一个微观...
  • 8051 P0口分时复用详解

    千次阅读 2014-05-11 21:37:21
    51单片机 P0口工作原理详细讲解 一、P0端口的结构及工作原理  P0端口8位中的一位结构图见下图:  由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路...
  • 本文借鉴软件操作系统的分时复用原理,来把任务分成多个时间片,在不同的时间片执行不同的任务。从而实现了较少I/O口的多功能控制。 1 EM78P156N单片机的主要功能 EM78P156N是台湾义隆公司推出的8位单片机,图1所...
  • 本文鉴戒软件操纵系统的分时复用原理,来把任务分成多个时间片,在不同的时间片执行不同的任务。从而实现了较少I/O口的多功能控制。
  • 我用一个单片机的TXD,RXD分别接两个模块,从一个接受信息,另一个发送信息,可以分时进行,电路不冲突(单个模块只与单片机的TXD RXD中一个连接即可通信),但波特率不同,那我是不是要分两次初始化串口呢?...
  • 在我们的实际产品开发过程中,为了...下面由我来给大家讲讲按键和LED复用IO口程序该如何处理吧。(上一讲已经讲过,我个人比较喜欢状态机编程,因此这里还是采用状态机编程的方法,来实现按键和LED复用扫描功能)。
  • 1、S-51系列单片机的CPU主要由A组成。A、运算器。控制器B、加法器、寄存器C、运算器、加法器D、运算器、译码器2、单片机中的程序计数器PC用来(C )A、存放指令B、存放正在...分时复用做数据线和低8位地址线的是( A...
  • 分复用和时分复用

    万次阅读 2017-03-24 13:02:07
    分复用(FDM,Frequency Division Multiplexing)就是将用于传输信道的总带宽划分成若干个子频带(或称子信道),每一个子信道传输1路信号。频分复用要求总频率宽度大于各个子信道频率之和,同时为了保证各子信道...
  • 三种单片机应用程序框架

    千次阅读 2016-12-21 23:04:02
    工作中经过摸索实验,总结出单片机大致应用程序的架构有三种: 1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。 2. 时间片轮询法...
  • 单片机奏乐

    2018-12-30 11:43:10
    以At89c2051为核心,主要由电源电路、复位电路、音频放大电路、时钟电路和数码管电路和蜂鸣器电路构成单片机奏乐附加时钟的一个小系统。内含电路原理图及程序,课程设计通过
  • 单片机

    2020-12-24 18:14:05
    第一章 ...2)在芯片引脚上,大部分采用分时复用技术。3)在内部资源访问上,采用特殊功能寄存器(SFR)的形式。4)在指令系统上,采用面向控制的指令系统。5)内部一般都集成一个全双工的串行接口。6)单片机
  • 在这里给大家分享一下学习51单片机心得体会:1、我从不说51是基础,如果我这么说,也请把这句话理解为微机原理是基础。2、对51单片机的操作本质上就是对寄存器的操作,对其他单片机也是如此。库只是一个接口,方便...
  • 前面几篇文章涉及到stm32编程需要了解的一些基础知识,本篇在记录一些编程中常用到的基础概念。 1、中断 本篇记录的是NVIC(Nested Vectored Interrupt Controller嵌套向量中断控制器),NVIC属于Cortex内核的...
  • 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。3. 操作系统,此法应该...
  • ·P0口:即P0.0~P0.7(引脚39~32),输入输出脚,可用于8位并行I/O口或分时复用为地址和数据总线。P0定义为I/O口时,为准双向I/O口,需外接上拉电阻,在程序中向该端口写入1后,成为高阻抗输入口。P0口作为输出口...
  • 单片机为例,CPU,存储器,时钟,IO输入输出设备组成最小系统。 类似的,只要将各个信号线,按照定义和CPU 连接起来,硬件上,外设就挂载到最小系统成功了。 此时,还需要软件上,让系统更准确的说让CPU 访问...
  • 浅谈单片机应用程序架构(原创)  2011-11-22 15:39:52| 分类: 单片机基础|举报|字号 订阅    下载LOFTER我的照片书 |  对于单片机...
  • CAN通讯以及STM32F1单片机程序 1、CAN通讯基本概念: (1)定义: CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986 年率先提出。此后,CAN 通过...
  • 这就要求我们将代码逻辑分解出其内在数据关系,这样我们就可以写出与数据无关的函数,这样的函数通用性很大,利于复用,耦合性也比较低,利于修改,且修改后不易出错。 这样的方法也有坏处,就是可读...
  • 实验内容1)编写程序,用P1.0~P1.2口连LED,查询拨盘开关SW1的状态来控制LED的亮和灭(P1.7口...实验原理ØP0口的特点:P0口是一个双功能的端口:地址/数据分时复用口和通用I/O口;具有高电平、低电平和高阻抗3种状态...
  • 万用表简介 万用表又被称为多用表、三用表、复用表,是一种多功能、多量程、便于携带的电子仪表。它可以测量直流电压、直流电流、交流电压、交流电流、电阻、电路通断、二极管的正向压降、三极管的放大倍数等,部分...
  • 单片机程序则是固化在flash 中,cpu运行的时候直接从flash 中读取程序,从RAM中读取数据. 造成这种差别的原因: x86架构的cpu是基于冯.诺伊曼体系的,即数据和程序储存在一起,而且pc机的RAM资源相当丰富,从几十M到...
  • 采用CISC结构的单片机数据线和指令线分时复用,即所谓冯.诺伊曼结构。它的指令丰富,功能较强,但取指令和取数据不能同时进行,速度受限,价格亦高。采用RISC结构的单片机数据线和指令线分离,即所谓哈佛结构。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,864
精华内容 1,545
关键字:

单片机分时复用程序