单片机定是程序_单片机的程序在仿真上成功 实物中一定可以好吗 - CSDN
  • 程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯亮5秒,C灭,程序结束,不再运行。这程序该怎么写?用定时器精确定时……晶振11.092MHZ。 #include "REG52.H" /* * */ sbit LED_A = P1^0; sbit LED...

    程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯亮5秒,C灭,程序结束,不再运行。这程序该怎么写?用定时器精确定时……晶振11.092MHZ。

    #include "REG52.H"
    
    /*
    *
    */
    sbit      	LED_A	= P1^0;
    sbit      	LED_B	= P1^1;
    sbit      	LED_C	= P1^2;
    
    unsigned char TIME_BASE;
    unsigned char MACT_ENDB;
    unsigned char Rece_Errp;
    
    /*
    *    定时器初始化
    */
    void SystemInit(void)
    {
    	TMOD = 0x01;
    	TH0 = (65536 - 45872) / 256;	 // 定时50ms  //晶振:11.0592MHZ
    	TL0 = (65536 - 45872) % 256;
    	ET0 = 1;
    	TR0 = 1;
    	EA  = 1;
    }
    
    int main(void)
    {
    	SystemInit();
    
    	while(1)
    	{
    		/* 程序一开始上电Rece_Errp = 0 定时器5秒加一次 */
    		if(Rece_Errp == 0)
    		{
    			LED_A = 0;		// A亮5秒
    			LED_B = 1;		// B是灭
    			LED_C = 1;		// C是灭
    		}
    		/* 判断是否5秒时间到 */
    		else if(Rece_Errp ==1)
    		{
    			LED_A = 1;	 // A是灭
    			LED_B = 0;	 // B亮5秒
    			LED_C = 1;	 // C是灭	
    		}
    		else if(Rece_Errp == 2)
    		{
    			LED_A = 1;	// A是灭
    			LED_B = 1;	// B是灭
    			LED_C = 0;	// C亮5秒		
    		}
    		else
    		{
    			LED_A = 1;	 // A是灭
    			LED_B = 1;	 // B是灭
    			LED_C = 1;	 // C是灭
    			while(1);	 // 程序运行到这里停止
    		}				
    	}
    }
    
    void Timer0_IRQ(void) interrupt 1
    {
    	TH0 = (655365 - 45872) / 256;
    	TL0 = (655365 - 45872) % 256;
    	/* 进入中断50ms +1次 */
    	TIME_BASE++;
    	
    	if(TIME_BASE == 20)	 //	20ms * 50ms = 刚好等于1000ms 也就是1秒
    	{
    		TIME_BASE = 0;
    		MACT_ENDB++;	// 一秒加一次
    		if(MACT_ENDB == 5) // 等于刚好5秒时间到
    		{
    			MACT_ENDB = 0;
    			Rece_Errp++;   // 用来切换LED A、B、C5秒灭
    		}
    	}	
    }





    展开全文
  • 单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。 若不是硬件特性已的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个念头起源...

    单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。

    若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。为何要加一句while死循环让程序停留在main函数中呢。将while(1);语句去掉有什么影响么?

    写一个很简单的程序试一下。

    51单片机程序执行流程详细分析
    执行以上程序,由P1端口控制的流水灯闪了一下。程序最终进入while(1);里纠缠去了,这个到好解释。

    现将while(1);语句屏蔽掉。我还以为程序不能被正确执行了呢,因为退出了main主函数,就像Render需要循环来实现一样(尽管刚刚闪灯的程序不在循环之内,但我还是不由产生了这一错觉)。程序执行的结果是:流水灯不停的闪烁!

    看到这个现象后的猜想及动作-

    (1) 这块板坏了吧!(在带操作系统如linux字符界面下运行一个不带死循环的C语言文件完毕后就会返回到linux shell程序中)。赶紧换个板再测试一下,显然还是一样的结果。

    (2) 单片机中将一直执行main函数中的最后一个(些)语句?(基于带OS平台下运行标准C语言文件的经验,可从来没有想过是main函数被多次调用或多次进入)

    (3) 单片机内将C语言指令取出来加载到单片机内,单片机内自动生成一个主程序循环执行C语言中main函数的内容?(虽然很荒唐,还是想了)

    (4) 赶快谷歌百度一下单片机的执行流程(虽然在谷歌百度时以“51单片机程序执行流程”搜索,没有搜到相关内容)。换朴实的搜索词:“51单片机 main”。然后就出现跟我一样带有疑问的问题:为什么main函数中不加while(1);语句之后程序会反复执行呢?回答的关键词包括“程序跑飞、看门狗、复位”。

    (5) 趁上嵌入式的机会将“51单片机程序执行流程”搬出来并向老师讲述了我所写程序的得到的现象,包括我怎么验证呀等等。

    老师的回答:Keil C51程序自动加载了一个名为”STARTUP.A51”的文件,在这个文件里面进行了一系列的初始化操作后进入用户编写的C语言程序入口main函数中,main函数执行完毕后,STARTUP.A51文件后有一句跳转到程序入口main函数的语句,所以会再次进入C语言主程序main函数中执行相关内容。

    然后我用keil软件模拟了运行一下以上那一段代码:

    51单片机程序执行流程详细分析
    程序开始运行就在程序入口main函数的第一条语句之处,Disassembly窗口是c语言代码与汇编代码相对应的窗口,前面是地址,后面的是C语言对应的汇编语句。下面的窗口是相应文件的运行代码的位置,由黄色箭头指向当前正要执行的代码。然后点击单步运行工具条,指导跳出main函数为止,程序跳转到STARTUP.A51中的以下代码位置:

    51单片机程序执行流程详细分析51单片机程序执行流程详细分析
    这里是一个循环,根据DJNZ指令的功能:每执行一次DJNZ RO, IDATALOOP就将R0的值减1,若R0的值不为0则就跳到IDATALOOP地址去。很显然这是一个循环,那么RO的值是多少呢,在以下窗口显示:

    51单片机程序执行流程详细分析
    可见r0的初值为0x7f,这里将要循环0x7f(128)次,具体在这里r0值的含义可查看一下子的。那么在这个循环之后程序又将去哪里呢?跳过这个循环后程序运行的地方如下:

    51单片机程序执行流程详细分析
    在单步运行一次

    51单片机程序执行流程详细分析
    根据Disassembly的内容,此条语句执行了就又要回到main函数中去了,执行一下试试:

    51单片机程序执行流程详细分析
    是的!

    所以,在51单片机中,程序的执行流程就是会不断( 以r0的值作为延迟条件, 具体含义可继续探索 )的进入main函数中执行main函数中的代码。

    为什么我们在linux等上面运行不带死循环的C语言代码后程序就会自行终止呢?这是不同的操作流程:

    (1) C51单片机不带OS(操作系统),代码的执行形势在此看来就由STARTUP.A51来安排了,没有一个更大的程序来管理怎么调用main函数。

    (2) 像Linux这类的平台是带了OS的,运行一个C语言程序对linux来说就是一个任务,除了运行C语言程序这个任务外还有其它的任务。当运行一个C语言程序完毕时,此次的任务也算是完成了。如在linux shell界面运行一个文件名为“hello.c”功能为输出“hello world!”的C语言程序,过程如下:

    编译:gcc hello.c –o hello

    运行:./hello

    在运行hello可执行文件时,可以当做是shell调用了hello这个可执行程序。在hello运行完毕后,将返回值等返回给shell界面。整个C语言文件的生死全有linux shell程序管理。

    归其原因,还是代码规定的机制不一样吧。

    展开全文
  • 学习单片机最主要的是学习写程序的方法,程序的功能千变万化,是学不完的,只有掌握了一定方法,才能用这种方法去写新的程序。7 i4 f( `; b. s  以c语言写的单片机程序为例,程序总是从main程序开始,然后顺序执行...
    学习单片机最主要的是学习写程序的方法,程序的功能千变万化,是学不完的,只有掌握了一定方法,才能用这种方法去写新的程序。7 i4 f( `; b. s
       以c语言写的单片机程序为例,程序总是从main程序开始,然后顺序执行到main结束。由此可知,程序必须包含而且只能包含一个main程序,也就是常说的主程序
       main()
       {4 i  D" o: u. N
        主程序的内容。。。。。。$ ]3 E, {. y9 a/ V
        }
    % Q2 v. @  n# E, a7 k+ ]; f/ }5 ^
    实际使用中还需要在main程序中建立一个主循环体while 或者do while,主循环体可以是死循环,也可以是条件循环,如下:
        main()2 I- l5 q. e, B" t4 i) ~9 H: U
       {" r  h7 F) J5 G$ C5 C
        
          while(1)
             {
                 死循环体内的程序会循环执行* E& K) T7 c7 a7 u
                   }
        }
    /////////////////////////////////////////////////////////
        main()
       {
        2 e  p# y- J! V/ O
          while(Flag)
             {$ Z8 Y6 y' }$ m5 z( k
                 条件循环体内的程序会根据Flag的值的变化循环执行或者跳出循环
                   }" J% @0 q* p0 ?: s& C
        }4 Z2 E. ^* K2 [  u+ @. {
    /////////////////////////////////////////////////////////. u" D6 h! E( m
        main()& ?6 l7 i! x# q+ W/ u
       {
            程序会顺序执行
          while(1); //在此处停止
             
        }
    ////////////////////////////////////////////////////////
    一般第一种用的最多,所有的需要循环执行的程序都放在主循环体内,然后内部有可以再增加多个条件循环体。
    main程序的开始一般要做哪些工作呢?再单片机中,c语言再进入main程序的入口时会自动添加一些单片机的初始化工作,使单片机处在准备工作的状态。但仅仅单片机内部做的并不一定似乎我们需要的,所以main程序的开始我们还需要些一些自己初始化的代码,比如开机时候的各个端口的状态,声明的一些变量的初始化数值,定时器或者其他外设的初始化等,凡是需要在第一时间就需要设置的部分都再这个部分完成,然后到了主循环while部分,既然是循环,就说明循环体内的程序是顺序并循环执行的,什么语句需要放在这个里面呢?那就是需要随时变化的端口量,数值等,比方说,时钟,时钟是不停变化的,就需要循环的读取时钟的数值,然后更新数据到显示器件上(数码管或液晶或者电脑端),再比方按键,因为我们不知道什么时候会按下按键,所有最简单的方法就是不停的检测按键端口的变化,这个也必须放在主循环体内,以保证检测按键的时效性。! @) ?$ V& d1 Q0 o
    / e: w$ ^# Q5 ~7 C. g% y
        举例说明:开机后P1.1连接的LED点亮,然后随这按键的按下LED熄灭,释放按键在点亮,设置P3.4端口按键3 S/ n) t4 m/ n1 I2 n8 Y8 k) p
    sbit LED=P1^1;* k/ ]- L( H. w: `1 B
    sbit KEY=P3^4; //定义按键端口,可以根据硬件连接不同更改到其他端口) i* C; r* m" O- x! ~3 }
    9 b9 Z, w* j3 ]
    main()
    {. ]! d& v6 [1 E7 z4 h& o
    LED=0;//这里以低电平点亮LED为例子,这个语句是初始化端口8 p+ h* Q4 B- m! @

    while(1)/ e. a: u( Q1 O. @6 |8 _
          {* w; W# F6 E+ \; r8 R  P: I
          if(KEY) //检测按键端口是否为1,如果为1表示没有按下,如果为0表示按键按下% Q% G4 e$ X* ]3 e% `  L
            LED=0;//没有按下则LED点亮: [' b8 ~) k& Q3 h' C  r
          else
            LED=1;//按下则LED熄灭+ ]# L& U' D/ _) K' Y4 J
          }% d) D6 g8 \9 a2 s5 K1 |$ _* P! o
    }
    展开全文
  • 1/stc单片机下载程序的原理 首先我们要理解stc单片机下载程序的原理。在stc单片机中有两个程序区:用户程序区和ISP监控程序区。 这是stc89c52单片机数据手册中的内容。 根据数据手册,我们可以知道,当冷启动或者对...

    1/stc单片机下载程序的原理

    首先我们要理解stc单片机下载程序的原理。在stc单片机中有两个程序区:用户程序区和ISP监控程序区。

    这是stc89c52单片机数据手册中的内容。
    在这里插入图片描述
    根据数据手册,我们可以知道,当冷启动或者对ISP_CONTR寄存器送入60H产生复位以后,单片机会从ISP监控程序区开始执行程序。

    如果这时候检测到合法的ISP下载命令流(后面会说什么是ISP的合法下载流),则ISP监控程序开始与ISP下载软件通信(如stc-isp),软件也会进入编程模式,向监控程序发送程序码,监控程序接收程序码,并将其写入用户程序区中。成功后,用户程序立即生效,开始运行用户程序。

    如果这时候没有检测到合法的ISP下载命令流,单片机就会从用户程序区开始执行程序。

    2/冷启动下载

    我们刚开始接触stc单片机一般采用的都是冷启动来下载程序。但是这样做有一定的缺点。

    首先,单片机频繁的上电掉电会影响单片机的寿命,且一些特殊的外围电路要求一直保持有电状态。

    其次,也是我主要想说的一点是,市面上的USB转TTL模块质量参差不齐,绝大多数模块都没有做好隔离,导致电流会从模块的TX和RX倒灌进单片机,如果此时单片机上的电压高于单片机的上电复位检测门槛电压的话,就会导致单片机无法冷启动,进而无法成功下载程序。

    摘自stc15数据手册
    我测量了市面上购买的两款USB转TTL模块(PL2303)(ch340系列没有做好隔离的话也会出现同样的情况),一款模块会给单片机提供3.3V电压,这时候5V单片机的冷启动就很可能失败。另一款模块会给单片机提供2V电压,可见这两款USB转TTL模块都是无法正常给3.3V单片机烧录程序的。

    大厂的单片机开发板上下载电路的隔离一般是做的非常好的,我用做测试的是郭天祥的TX-1C开发板,USB只能给单片机提供0.02V的电压。

    数据手册中给我们提供了一个简单的PL2303下载电路,其中红色箭头指向的那个电阻和二极管就是起隔离作用的。当然,如果对隔离要求更为严格的话,还是要去查看芯片(PL2303,CH340,FT232等)的数据手册,设计最为合适的下载电路。

    在这里插入图片描述

    3/自动下载程序

    说是自动下载程序,其实是和冷启动下载程序相对的,也就是可以不掉电下载程序。

    讲解原理之前我们先要说一下什么是“合法的ISP下载命令流”。

    在这里插入图片描述
    在我们按下“下载/编程”后,电脑会通过串口给单片机发送一系列数据。

    如果我们在stc-isp上勾选了发送自定义命令的话,stc-isp首先会按照我们设置的波特率、停止位等配置向单片机发送我们自定义的命令。

    然后stc-isp会以我们设置的最低波特率和默认配置向单片机不断发送0x7F,这通常就是我们说的“合法的ISP下载命令流”。

    我们再回忆一下stc单片机下载程序需要什么。第一是需要程序冲ISP监控程序区运行,第二是需要检测到合法的ISP下载命令流。由于ISP下载命令流是stc-isp提供给我们的,所以我们其实可以检测到合法的ISP下载命令流以后进行一个软复位,复位到ISP监控程序区,这样便可以避免冷启动,直接下载程序了。

    4/代码实现

    作者这里使用的是STC89C52单片机,不同的单片机的寄存器不太一样,但原理相通,只需要根据数据手册稍作修改即可。

    作者将自动下载的代码封装成函数方便调用。

    首先是serve.c中的代码:

    //配置串口
    void uart_init(void)
    {
    		TMOD = 0x20;    
    		TH1 = 0xfd;     
    		TL1 = 0xfd;     
    		TR1 = 1;       
    		REN = 1;       
    		SM0 = 0;      
    		SM1 = 1;       
    		EA = 1;         					
    		ES = 1;        
    }
    

    serve.h:

    /*
    funtion:automatic download
    explanation:			
    		switch:#define _DOWNLOAD_(before #include"serve.h")
    		remember to use uart_init before!				
    */
    					
    #ifdef _DOWNLOAD_
    					
    #include<reg52.h>
    
    sfr ISP_CONTR = 0xe7;
    uint8_t uart_ser_n = 0;
    		
    void uart1_ser() interrupt 4
    { 
    		RI = 0;        //清空接收标志位
    		if(SBUF == 0x7f)  //STC下载指令0X7F
    		{ 
    				uart_ser_n++;   //判断位自加
    				if(uart_ser_n == 10) //如果收到10次0X7F
    				{
    						uart_ser_n = 0;   //判断位清0
    						ISP_CONTR = 0x60;//复位命令  
    				}
    		}
    		else
    		{
    				uart_ser_n = 0;	
    		}
    }
    				
    
    
    #endif
    
    /*
    explanation:
        crystal frequency:11.0592MHz
        bps:9600
    	timer1:mode2
    	UART:mode1
    */
    
    extern void uart_init(void);
    
    

    下面是main.c中的一个小示例:

    #define _DOWNLOAD_
    #include"serve.h"
    #include<reg52.h>
    
    int main()
    {
    	uart_init();
        while(1)
    	{
    		P1 = ~P1;
    		delay_ms(100);
    	}
    }
    
    

    5/补充说明

    1.这里作者并没有选择使用stc-isp上的发送自定义命令,因为不管发送不发送自定义命令,stc-isp最后总是要不断发送0x7F的ISP下载流,作者偷了个懒,就不用配置自定义命令了,这样别人拿过我的单片机也可以直接自动下载了。

    那可能有人会问:既然总是要发送0x7F的ISP下载流,那为什么stc-isp还要设置”发送自定义命令“这样一个功能呢?

    因为在发送自定义命令时我们可以自主选择串口通信的波特率、校验位、停止位等参数,且可以自主设置命令,这样就使得自动下载这个功能非常灵活,在比较复杂的项目里面使用自主设置命令会更加合适。

    2.关于stc不同单片机型号之间的区别,stc12、stc15和stc8支持更多复位方式,可以通过配置寄存器设置更多种“自动下载”,大家有兴趣可以自行翻阅数据手册。

    3.网上还有很多种“自动下载”的办法。有人使用外部中断来实现“自动下载”。工作流程是这样的:点击下载程序后按下按键,单片机进入外部中断。在中断服务函数中给单片机一个复位信号,实现“自动下载”。

    这种方式的优点是占用的资源少(一个外部中断),缺点是还需要按按键。其实不管怎么变形,我们只要理解了前面说的单片机下载程序的原理之后,所有的"自动下载"都是一样的。

    4.很有意思的是硬件的自动下载,通过硬件电路,在点击下载程序之后,改进过的USB转TTL模块自动实现冷启动复位,实现自动下载,这个思路和我们前面说的都不太一样,但是还是需要冷启动是硬伤。大家有兴趣可以自行搜索。

    展开全文
  • 在学习单片机之前,要先清楚单片机程序是如何烧写到单片机内部的,在烧写的过程中需要用到什么工具?因为不通用的烧写工具可能价格较贵,比如说Micorchip单片机使用的ICD系列编程器,单台价格在60...

    单片机是一种可编程控制器,搭好硬件电路后,可以利用程序实现很多非常复杂的逻辑功能,与纯硬件电路相比,简化了硬件外围的设计、方便了逻辑的设计、丰富了逻辑的输出。不同厂家的单片机需要不同编程IDE来实现编程。在学习单片机之前,要先清楚单片机程序是如何烧写到单片机内部的,在烧写的过程中需要用到什么工具?因为不通用的烧写工具可能价格较贵,比如说Micorchip单片机使用的ICD系列编程器,单台价格在600-1000元人民币之间。今天和大学来认识一下单片机最常用的四种烧写方式和所使用到的工具。

    1.使用JTAG接口实现
    JTAG接口是一种标准的测试协议,可以实现编程时在线调试,利用单步追踪可以很方便的查找代码的Bug,大多数的单片机都支持这种接口。这种接口除了电源线和复位引脚之外,还要用到单片机的四个引脚,分别是:TDI、TMS、TCK、TDO,他们所代表的含义如下所示:

    TDI–数据输入,所有写入寄存器的数据都是通过TDI接口串行输入的;
    TMS–模式选择,Jlink输出给目标CPU的时钟信号;
    TCK–时钟信号,所有数据的输入输出都是以该时钟信号为基准的;
    TDO–数据输出,所有从寄存器读出的数据都是通过TDO接口串行输出的;
    以上这四个引脚都是协议里强制要求的,而且协议建议在设计电路时要选用上拉电阻。JTAG接口有多种形式,常用的20引脚、14引脚和10引脚。以20引脚JTAG为例,所设计的JTAG烧写电路如下图所示:

    程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍
    JTAG接口

    上图中JTAG接口都通过电阻上拉了,有的单片机的这几个引脚在内部已经上拉,所以这几个上拉电阻可以省略,减少了成本和PCB空间的占用。

    JTAG接口烧录方式常用的工具为J-Link,实物图如下图所示。

    程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍
    Jlink实物图

    相信大家都见过或者听过这个烧写工具,这个工具很通用,但是大家在使用的时候一定要注意版权信息,因为这个工具是有版权的,前两年因为版权风波,网购平台还集中整治过一次。

    2.SWD接口烧录方式
    SWD是一种串行调试接口,与JTAG相比,SWD只需要两根线,分别为:SWCLK和SWDIO。他们的含义如下:

    SWDIO–串行数据线,用于数据的读出和写入;
    SWDCLK–串行时钟线,提供所需要的时钟信号;
    一般来说,大多数单片机的JTAG接口和SWDIO接口是复用的,SWD也是用J-Link工具来实现的。所以在使用的时候,只需要在软件界面做一下选择,使用SWD方式还是JTAG方式,硬件上无需改动。除了J-Link外,意法半导体的ST-Link也是支持SWD模式的。

    程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍
    SWD接口

    SWD的接口如上图所示,可以看出,SWD和JTAG是相互复用的,由于SWD只需要两根线所以大大减少了对单片机GPIO口的占用,SWD方式也是可以在线调试的。

    3.ISP烧写方式,用UART实现
    使用过国产51单片机的朋友都清楚这种烧写方式,这种烧写方式是通过单片机的UART串口来实现的,所需要的工具也比较简单-USB/TTL。这个USB/TTL的芯片可以通过MAX232、CH340G等芯片来实现,通过MAX232实现的UART烧写电路如下所示:

    程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍
    UART串口烧写电路

    在与单片机连接的时候,一定要注意交叉连接,所谓交叉连接即,单片机的TXD接串口RXD,单片机的RXD接串口TXD,否则数据通信失败。51单片机在使用该方式下载时需要断一下点再上电才能下载。

    STM32单片机可以使用UART来实现程序下载,但是需要选择BOOT的模式,现在通过CH340G芯片可以实现自动ISP的下载方式,即不需要手动设置BOOT模式。

    4.SWIM单总线下载方式
    这种下载方式是针对STM8系列的单片机,这种方式只需要一根线即可实现程序的下载,所使用的工具为ST-Link,如下图所示:

    程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍
    ST-Link

    以上为几种常见的烧写方式以及所使用的工具,欢迎大家留言评论,如果转载请注明作者信息和头条出处,感谢支持。

    展开全文
  • 最为精辟和实用的按键处理程序;1.新型的按键扫描程序;不过我在网上游逛了很久,也看过不少源程序了,没有;同时,这里面用到了一些分层的思想,在单片机当中也;以下假设你懂C语言,因为纯粹的C语言描述,所以和;...
  • 单片机程序主函数中while(1)的作用   在单片机的主程序中,我们在写程序的时候,总是写一个while(1)的语句,以此达到让程序进入一个无限死循环中,其目的是让程序一直保持在我所需要的运行情况下,例如:流水灯的...
  • 工作中经过摸索实验,总结出单片机大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。2. 时间片轮询法,此方法...
  • 转载----在工作中经过摸索实验,总结出单片机大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。2. 时间片轮询...
  • 延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器 周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念...延时程序是如何 实
  • 51单片机延时程序

    2013-03-28 19:31:13
    延时程序单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器 周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指 令周期的区别...
  • 延时程序单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器 周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指 令周期的区别和...
  • 单片机控制步进电机-单片机程序(avr) 硬件线路连接图见上一篇文章 软件: ICCV7 FOR AVR-写程序 Progisp-烧程序 速度S曲线生成器(后续后单独讲解)-生成S曲线数组代码 硬件: Atmega16 ASP下载线 杜邦...
  • LCD1602 工业字符型液晶。1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符.特殊接口说明 RS:寄存器选择输入端 RS=1:指向数据寄存器 RS=0:指向指令寄存器RW:读写控制输入端 ...程序编写:#include #inc
  • 51单片机串口程序

    2015-08-05 00:12:48
     串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了。然而在实际应用当中,基本上不会有单字节接收的情况。一般都是基于一定
  • 首先,我们要把硬件连接好,把板子插到我们的电脑上,打开设备管理器查看所使用的是哪个 COM 口,如图 2-21 所示,找到“USB-...下载软件列出了 5 个步骤:第一步,选择单片机型号,我们现在用的单片机型号是STC89...
  • 单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。  若不是硬件特性已的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个念头...
  • 单片机程序远程升级的设计 2012-01-19 11:13:06 作者:周东辉 孙晓苗 李立 来源:微计算机信息 关键字:16位单片机;SPCE061A;BootLoader;远程升级;S37格式 1.引言 单片机的应用非常广泛,在某些情况下,...
  • 在实际应用中,往往串口还要和电脑上的上位机软件进行交互,实现电脑软件发送不同的指令,单片机对应执行不同操作的功能,这就要求我们组织一个比较合理的通信机制和逻辑关系,用来实现我们想要的结果。 本节所...
  • 单片机PID算法程序

    2013-10-10 22:05:05
    转自:... 比例,积分,微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)、微分(Differentiation)控制,简称PID控制 ... 在实际应用中,可以根据受控
1 2 3 4 5 ... 20
收藏数 24,636
精华内容 9,854
关键字:

单片机定是程序