单片机的程序‘_51单片机单片机数字频率计程序 - CSDN
  • 单片机执行程序的过程

    千次阅读 2008-04-06 19:34:00
    单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。 取指令的任务是:根据程序计数器PC中的值从程序...
    为了加深初学者对51单片机指令的理解,现在把指令执行的过程在此详细说明,希望对你有启发! 



    单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。

    取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。

    分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。
    计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。

    一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。

    下面我们将举个实例来说明指令的执行过程:

    开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。

    例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,

    0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:
    1 程序计数器的内容(这时是0000H)送到地址寄存器;

    2 程序计数器的内容自动加1(变为0001H);

    3 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;

    4 CPU使读控制线有效;

    5 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。至此,取指阶段完成,进入译码分析和执行指令阶段。

    由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在
    这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程

    与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。因为
    指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完

    毕。单片机中PC="0002H",PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到
    暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。  
    展开全文
  • 对于单片机程序占了多少字节?单片机还剩多少存储空间?想必你看到这篇文章时对这两个问题也很迷糊吧,  接下来我就把自己所了解到的关于单片机程序占用空间大小的问题做一个整理,方便自己也方便他人。  转载请...

      对于单片机程序占了多少字节?单片机还剩多少存储空间?想必你看到这篇文章时对这两个问题也很迷糊吧,

      接下来我就把自己所了解到的关于单片机程序占用空间大小的问题做一个整理,方便自己也方便他人。

      转载请注明出处!

      1.STM32类单片机中在程序编译后会出现下面图片中所示内容

                

        上图中分别有Code、RO-data、RW-data、ZI-data,

        Code:表示所要执行的代码,程序中所有的函数都位于此处。
        RO-data: 表示只读数据,程序中所定义的全局常量数据和字符串都位于此处。
        RW-data:表示已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。
        ZI-data:表示未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处。
        通过上面的描述就可以看出:

    • 下载到单片机FLASH的程序是:Code+RO-data+RW-data(上图中数据为字节数,kb=byte/1024);
    • 运行在RAM中的数据是:RW-data+ZI-data;

      2.51类单片机编译后会有如下画面

                

        上图上分别有data、xdata、const、code。

        data:片内RAM区消耗。

        xdata:片内扩展区RAM区消耗。

        code:表示所要执行的代码,程序中所有的函数都位于此处。

        下载到单片机FLASH中的程序大:code+const

        下载到单片机RAM的大小为:data+xdata

    转载于:https://www.cnblogs.com/brianblog/p/9883562.html

    展开全文
  • 基于Unique ID的单片机程序加密系统 单片机唯一ID程序加密 单片机一般作为一个产品的逻辑中心,工作时一直在进行着逻辑判断与执行操作,相当于人类的大脑。单片机可以通过修改程序来控制外围电路的工作状态,从而...





    文章原始地址:http://feotech.com/?p=25




    基于Unique ID的单片机程序加密系统 单片机唯一ID程序加密

    单片机一般作为一个产品的逻辑中心,工作时一直在进行着逻辑判断与执行操作,相当于人类的大脑。单片机可以通过修改程序来控制外围电路的工作状态,从而改变产品的功能。如果一个产品具有单片机,那么它往往是这个产品的核心。而开发一款功能复杂且成熟的产品所需要的费用不低并且研发周期较长,一些个人为了某些原因,为了快速仿造竞争对手的产品,一般就原样照抄对方的硬件电路,但由于单片机内部有针对产品功能单独设计的程序,不能直接再市面上购买,所以就只能想办法通过特殊的解密方法将单片机内部的程序读取出来。将解密后读取出来的程序烧录在新的芯片中从而完成产品功能的抄袭。通过专用的设备和工具,利用单片机芯片设计上的硬件漏洞或软件缺陷,通过多种技术手段获取单片机内程序这叫做单片机解密或单片机破解。以不正当方式获得其他公司或个人的商业秘密,是一种常见的不正当竞争行为。单片机加密技术是对产品知识产权保护的一种技术手段。

    Unique ID加密原理

    当前市面上的单片机资源中大多数具有Unique ID,即每一个芯片内部均具有唯一的芯片ID号。不同的芯片厂家实现该功能的方式不同,一些用生产线的流水号,另一些是用晶圆的特性来生成ID。 利用Unique ID加密的方法流程如下:

    单片机一般作为一个产品的逻辑中心,工作时一直在进行着逻辑判断与执行操作,相当于人类的大脑。单片机可以通过修改程序来控制外围电路的工作状态,从而改变产品的功能。如果一个产品具有单片机,那么它往往是这个产品的核心。而开发一款功能复杂且成熟的产品所需要的费用不低并且研发周期较长,一些个人为了某些原因,为了快速仿造竞争对手的产品,一般就原样照抄对方的硬件电路,但由于单片机内部有针对产品功能单独设计的程序,不能直接再市面上购买,所以就只能想办法通过特殊的解密方法将单片机内部的程序读取出来。将解密后读取出来的程序烧录在新的芯片中从而完成产品功能的抄袭。通过专用的设备和工具,利用单片机芯片设计上的硬件漏洞或软件缺陷,通过多种技术手段获取单片机内程序这叫做单片机解密或单片机破解。以不正当方式获得其他公司或个人的商业秘密,是一种常见的不正当竞争行为。单片机加密技术是对产品知识产权保护的一种技术手段。

    Unique ID加密原理
    当前市面上的单片机资源中大多数具有Unique ID,即每一个芯片内部均具有唯一的芯片ID号。不同的芯片厂家实现该功能的方式不同,一些用生产线的流水号,另一些是用晶圆的特性来生成ID。 利用Unique ID加密的方法流程如下:

    A. 将单片机烧录程序A后上电运行程序,完成加密操作。
    B. 将单片机烧录程序最终程序B,该程序包含ID识别部分。 加密流程图如下:
    这里写图片描述

    • 程序A负责读取芯片内部的Unique ID,并进行加密运算。将运算的结果写入芯片内部的EEPROM。
    • 程序B是实现产品最终功能的程序,该程序其中加入了产品身份识别功能。该程序首次上电后将首先读取EEPROM数据,并进行与加密算法相同的逆向算法,将加密后的数据进行解密获得芯片Unique ID。将解密后的ID与当前芯片的ID进行比对,如果数据不同则判断为非法程序。

    加密算法

    为了防止破解者通过仿真的方式找到芯片ID信息,一般不宜直接存放ID号。而是经过相应的加密处理后写入存储器中。校验方式也不宜采用常见、简单的校验规则,应尽可能采用某些特殊的检验方式,使破解者不能迅速确定校验算法。
    加密的算法类似数学公式 Y=F(X) 其中Y为加密以后的数据,X为原始数据,而F则为加密算法。
    加密算法有很多种,本实验中采用简单的位移后取反的方式来进行数据加密。

    这里写图片描述
    最后将加密的数据存入EEPROM中,由于芯片的ID厂家不允许更改,这大大增加了破解难度,加强了对产品的保护。

    详细设计过程
    使用Unique ID对单片机程序加密功能的实现需要以下几点功能:
    ① 实验板1用于对程序加密实验。
    ② 将从实验板1中读取到的数据烧录到实验板2中,通过实验板上的LED状态验证程序加密是否成功。
    基于Unique ID的单片机程序加密分为2个程序,这2个程序是不同的。
    程序A:用于读取芯片硬件ID并进行算法处理,将处理后的数据保存到EEPROM中。
    程序B:用于将EEPROM中的数据读取出来并使用与加密相同的算法进行解密获得芯片ID,将解密后获得的ID与芯片本身的ID进行比较。比较结果只有2种可能,即为相同与不同,程序根据结果从而执行不同的操作如图所示;

    这里写图片描述
    实验中使用STM8S单片机作为硬件载体

    软件设计

    系统初始化函数选择了内部16MHz时钟源,1分频后系统总线时钟频率为16MHz。
    将GPIO与EEPROM擦写均进行了初始化配置。 函数代码如下:

    void SystemInit(void)
    {
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //总时钟源 使用内部时钟源1分频 16M/1分频 =16MHz
        Gpio_Init(); //单片机系统GPIO初始化 FLASH_DeInit();//存储数据的EEPROM初始化
        FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);// 默认的EEPROM写入时间
    }
    

    LED驱动程序

    根据硬件的电路原理图可以看出,LED连接到PE5引脚。采用灌电流驱动,当引脚为低电平时LED点亮,引脚为高电平时LED熄灭。上电后LED默认为熄灭状态,所以引脚初始化配置为高速输出模式高电平。函数代码如下:

    /*描述:MCU外围GPIO初始化*/
    /*输入:无*/
    void Gpio_Init(vod)
    {
        //功能引脚上电初始化,引脚初始化状态根据外部功能而定义//
        GPIO_Init(GPIOE, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); //LED
    }
    

    LED的状态采用宏定义方式,直接控制IO管脚电平状态。 操作代码如下:

    /*LED操作宏定义*/
    #define LED_ON GPIO_WriteLow(GPIOE, GPIO_PIN_5); //点亮LED
    #define LED_OFF GPIO_WriteHigh(GPIOE, GPIO_PIN_5); //熄灭LED
    

    获取Unique ID程序

    STM8S105K4T6数据手册显示该芯片具有96bit Unique ID,96bit/8=12byte。存放ID的起始地址为0x48CD,从该地址读取12次,将芯片ID获取并存入数组。 函数代码如下:

    /*描述:获取芯片ID*/
    /*输入:存放芯片ID的数组*/
    /*输出:无*/
    /*参数:无*/
    void Get_ChipID(unsigned char *p)//Get chip ID
    {
        unsigned char i=0; for(i=0; i<12; i++) //读取12次
        {
            *p = *(u8*)(0X48CD+i); //将数据读出后进行存放
            p++;
        }
    

    获取Unique ID程序

    STM8S105K4T6数据手册显示该芯片具有96bit Unique ID,96bit/8=12byte。存放ID的起始地址为0x48CD,从该地址读取12次,将芯片ID获取并存入数组。
    函数代码如下:

    /*描述:获取芯片ID*/
    /*输入:存放芯片ID的数组*/
    /*输出:无*/
    /*参数:无*/
    void Get_ChipID(unsigned char *p)//Get chip ID
    {
        unsigned char i=0;
        for(i=0; i<12; i++) //读取12次
        {
            *p = *(u8*)(0X48CD+i); //将数据读出后进行存放
            p++;
        }
    }
    

    加密算法程序

    编码函数执行对Unique ID进行数据算法处理。实验中采用的算法为将存放Unique ID的数组进行左移三个元素后逐位取反。将编码后的数据存入另一个数组。
    编码函数代码如下:

    /*描述:对芯片ID进行编码处理*/
    /*输入:存放芯片ID的数组;存放芯片ID编码后的数组*/
    /*输出:无*/ /*参数:对输入数组左移三次后逐位取反*/
    void Encode(unsigned char *DataIn,unsigned char *DataOut)//对数据进行编码加密
    {
        unsigned char i;//数组数据左移次数 unsigned char j;//数据位移临时局部变量
        unsigned char DataSwap;//搬运数据用的临时变量
        unsigned char TempData[12];//数据处理交换变量数组
        for(i=0;i<12;i++)//数据数组交换
        {
            TempData[i] = *DataIn; DataIn++;
        }
        for(i=0;i<3;i++)
        {
            //数组元素左移操作
            DataSwap = TempData[0];
            for(j=0;j<11;j++) //数组左移搬运
            {
                TempData[j] = TempData[j+1]; } TempData[11] = DataSwap;
            }
        for(i=0;i<12;i++)
        {
            TempData[i] = ~ TempData[i] ; //对数组数据进行按位取反
            *DataOut = TempData[i] ; DataOut++;
        }
    }
    

    解密算法程序

    解码函数负责对从EEPROM中读取的数据进行解码,是编码函数的一个逆向算法处理。算法为将输入的数组(EEPROM数据)进行右移三个元素后按位取反。示意图如下:
    这里写图片描述
    函数如下

    /*描述:对从EEPROM读出的数据进行解码*/
    /*输入:存放编码数据的数组,存放解码数据的数组*/
    /*输出:无*/
    /*参数:数据右移三位后按位取反(算法)*/
    void Decode(unsigned char *DataIn,unsigned char *DataOut)
    {
      unsigned char i;//数组数据左移次数
      unsigned char j;//数据位移临时局部变量
      unsigned char DataSwap;//搬运数据用的临时变量
      unsigned char TempData[12];//数据处理交换变量数组
      for(i=0;i<12;i++)//数据数组交换
      {
        TempData[i] = *DataIn; DataIn++;
      }
      for(i=0;i<3;i++)//数据右移三次
      {
        //数组元素右移操作
        DataSwap = TempData[11]; 
        for(j=10;j>0;j--)//数组右移搬运
        {
          TempData[j+1] = TempData[j];
        }
        TempData[1] = TempData[0];
        TempData[0] = DataSwap;//最后一次搬运
      }
      for(i=0;i<12;i++)//对数组数据进行诸位取反
      {
        TempData[i] = ~ TempData[i] ;
        *DataOut = TempData[i];
        DataOut ++;
      }
    }
    

    数据写入EEPROM程序

    将编码处理后的数据写入EEPROM,存储器起始地址为0x000040A0,通过单字节写入。将12个字节全部写入EEPROM。函数代码如下:

    /*描述:EEPROM数据写入*/
    /*输入:数据源的数组*/
    /*输出:无*/
    /*参数:无*/
    void EEPROMWrite(unsigned char *p)
    {
      unsigned char i;//数据交换用局部临时变量
      FLASH_Unlock(FLASH_MEMTYPE_DATA); //解锁EEPROM,允许写入数据
      while( !(FLASH_GetFlagStatus(FLASH_FLAG_DUL)) );//等待EEPROM解锁完成
      for(i=0;i<12;i++)
      {
        FLASH_ProgramByte(0x000040A0+i, *p);//将数据写入EEPROM,写入存储起始地址为0x000040A0
        while( !( FLASH_GetFlagStatus(FLASH_FLAG_EOP)) );//等待EEPROM单次写入完成
        p++;
      }
      FLASH_Lock(FLASH_MEMTYPE_DATA); //锁定EEPROM
    }
    

    从EEPROM读出数据程序

    程序首先需要从EEPROM中读取加密后的数据,将数据保存到数组EncodeData中。程序代码如下:

    /*描述:读取芯片EEPROM数据*/
    /*输入:用于存放EEPROM的数组*/
    /*输出:无*/
    /*参数:*/
    void Get_EEPROMData(unsigned char *p)
    {
      unsigned char i=0; for(i=0; i<12; i++)
      {
        *p = FLASH_ReadByte(0x40A0 + i);//从EEPROM读取数据
        p++;
      }
    }
    

    数据比对程序

    数据比对函数负责将解密后数据与Unique ID两个数组的数据进行比对。该函数只有两个返回结果,数据完全相同与不同,返回不同的值。根据不同的返回值从而判断程序是否合法。函数代码如下:

    /*描述:将两个数据进行比对*/
    /*输入:要比对的数据A,要比对的数据B*/
    /*输出:比对结果 1:数据相同 0:数据不同*/
    /*参数:对数组进行按字节比对*/
    unsigned char IDCheck(unsigned char *a,unsigned char *b)
    {
      unsigned char i; unsigned char Flag;//比对结果标志 1:数据相同 0:数据不同
      Flag = 1; for(i=0;i<12;i++)
      {
        if( (*a) != (*b) ) { Flag = 0; } a++; b++;
      }
      return Flag;//返回值:比对结果标志 1:数据相同 0:数据不同
    }
    

    数据数组
    使用数组的存储芯片ID与编码加密后的数据。代码如下:

    /*数组定义*/
    unsigned char Chip_IDData[12]; //存放芯片
    Unique ID unsigned char EnCodeData[12]; //对芯片Unique ID编码加密后的数据
    unsigned char DecodeData[12]; //对芯片EEPROM解密后的数据
    

    A程序主函数代码
    本程序主要作用是将数据进行加密编码处理并将结果写入EEPROM, 程序的主函数调用上方的单元功能函数。

    /*描述:主函数*/
    /*输入:无*/
    /*输出:无*/
    /*参数:无*/
    void main(void)
    {
      SystemInit(); //系统初始化
      Get_ChipID(Chip_IDData); //获取芯片 ID并存储在数组
      Encode(Chip_IDData,EnCodeData); //编码运算处理
      EEPROMWrite(EnCodeData); //将编码数据写入
      EEPROM LED_ON; //写入完成后点亮LED
      while(1); //软件循环
    }
    

    运行该程序后,将读取到的芯片ID数据存入数组。通过内部编码算法函数将ID进行处理并写入EEPROM。程序运行流程图如图所示:
    这里写图片描述

    B程序主函数代码
    程序B作用为对EEPROM数据读取并进行解码处理后判断程序合法性。主函数代码如下:

    /*描述:Main主函数*/
    /*输入:无*/
    /*输出:无*/
    /*参数:无*/
    void main(void)
    {
      SystemInit(); //系统初始化
      Get_ChipID(Chip_IDData);//获取芯片自身ID Get_EEPROMData(EncodeData);
    
      //从EEPROM读取编码后的数据 
      Decode(EncodeData,DecodeData);//将编码数据进行解码 //将解码后的数据与当前芯片ID进行比对
      if(IDCheck(Chip_IDData,DecodeData))
      {
        //返回1 比对通过,芯片与ID身份识别通过
        LED_ON; //点亮LED
      }
      else
      {//比对失败 程序非法
        LED_OFF; //熄灭LED
        While(1); //死循环
      }
      while(1)
      {
        ; //程序正常执行循环
      }
    }
    

    解码程序为最终烧录到芯片中的程序,产品功能也是在次此结构下开发的。程序执行后会读取当前芯片自身的Unique ID与存储在EEPROM中的数据。将EEPROM中的数据进行解码后与Unique ID进行比对,当数据完全相同时判断程序合法并执行正常程序功能,当数据比对不相同后判断程序非法并执行相应操作。解码程序运行流程图如图所示:
    这里写图片描述
    系统测试
    这里写图片描述

    将运行B程序后的实验板1通过通过仿真器与电脑连接,将STVP切换到“Program Memory”选项卡后点击“Read curren tab of active sectors”按钮后读取数据。在菜单File->save中选择保存程序B。(模拟程序被解密)

    将读取的程序B烧录到实验板2中,观察LED的现象。
    烧录程序B后实验板1测试LED亮起,实验板2测试LED未亮起。
    这里写图片描述
    测试结果
    从实验中可以看到,实验板二虽然烧录了程序B,但是之前并没有运行过程序A的加密算法,所以程序识别出EEPROM解密后数据与芯片自身ID不匹配从而熄灭LED。
    本文所设计的系统已经通过上述过程的测试,可以满足对单片机程序加密的功能需求。

    当前加密系统中需要完善的部分
    程序中仅仅有1处判断程序合法性,一旦遭到反编译后容易被破解
    程序被判断为非法后没有保护操作,应加入强制擦除 Flash进行保护
    程序需要烧录2次来完成整个加密系统的流程. 应在程序中加入启动加密条件,实现一次程序烧录即可完成加

    展开全文
  • 单片机程序的基本思路和写法

    千次阅读 2015-09-27 10:48:04
     以c语言写的单片机程序为例,程序总是从main程序开始,然后顺序执行到main结束。由此可知,程序必须包含而且只能包含一个main程序,也就是常说的主程序。  main()  {4 i D" o: u. N  主程序
    学习单片机最主要的是学习写程序的方法,程序的功能千变万化,是学不完的,只有掌握了一定方法,才能用这种方法去写新的程序。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
    }
    展开全文
  • 单片机程序远程升级的设计

    千次阅读 2013-12-10 19:54:52
    单片机程序远程升级的设计 2012-01-19 11:13:06 作者:周东辉 孙晓苗 李立 来源:微计算机信息 关键字:16位单片机;SPCE061A;BootLoader;远程升级;S37格式 1.引言 单片机的应用非常广泛,在某些情况下,...
  • 单片机程序结构再分析

    千次阅读 2016-11-23 15:29:42
    在学C++时对对单片机程序有一些新的想法。  转载请标明本文地址:http://blog.sina.com.cn/s/blog_6f2b6ba80101c3xi.html   在《单片机用定时器分配任务程序结构总结》里面,把整个系统分为两个进程:主函数和...
  • 51系列单片机程序 关于常闭型震动传感器51单片机的程序我这里提供两种方法供大家参考。 转载引用请标明出处https://blog.csdn.net/qq_42860728/article/details/87218429 1、运用定时器中断 程序如下: *******...
  • 手把手教你单片机程序框架(连载) 大家好,我叫吴坚鸿,从事单片机项目开发已经有快十年了。现在借21IC这个平台把我认为最有价值的东西分享给大家。我这个技术贴每个星期更新一两篇,直到我江郎才尽为止。再次感谢...
  • 单片机程序死机跑飞查找原因

    千次阅读 2018-07-27 09:18:10
    单片机程序死机,跑飞了可以从以下几个方面查找原因:  1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象  2. 中断变量处理不妥。若定义某些会在中断中修改的...
  • 单片机程序主函数中while(1)的作用

    万次阅读 2016-09-16 22:15:39
    在单片机的主程序中,我们在写程序的时候,总是写一个while(1)的语句,以此达到让程序进入一个无限死循环中,其目的是让程序一直保持在...因为在嵌入式中,main函数是不能返回的,而虽然我们所编写的单片机程序是用的是
  • 单片机程序主函数中一定要加while(1)

    千次阅读 2018-07-26 15:44:18
    单片机程序主函数中while(1)的作用   在单片机的主程序中,我们在写程序的时候,总是写一个while(1)的语句,以此达到让程序进入一个无限死循环中,其目的是让程序一直保持在我所需要的运行情况下,例如:流水灯的...
  • 51单片机程序存储器和数据存…

    万次阅读 2014-08-19 16:25:48
    原文地址:51单片机程序存储器和数据存储器作者:SUN_403 为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定一条指令的地址。程序计数器PC正是起到了这种作用,所以通常又称其为指令地址计数器。在程序...
  • 安装KEIL5成功后,打开51单片机程序很多按钮都是灰色,或者编写51单片机程序的时候不能预编译,此时需要下载51单片机PACK包,要么去官网下载(但是要填写个人信息很烦),网上的答案几乎就是这个,要么就是要C币下载...
  • 1 传统单片机程序开发的不足 在传统的单片机程序中,通常是以“过程”和“操作”为中心的结构,程序按规定的过程顺序地执行,与外设的连接一般采用中断方式,在中断服务程序中完成外设的全部处理工作,主程序一般是...
  • 单片机程序死机跑飞查错指南

    千次阅读 2013-12-04 10:50:09
    单片机程序死机,跑飞了可以从以下几个方面查找原因: 1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象; 2. 中断变量处理不妥。若定义某些会在中断中修改的全局...
  • Modbus通信协议(内附RTU+51单片机程序)

    热门讨论 2020-07-30 23:32:46
    内容包括Modbus通信协议(PDF版),RTU说明,RTU+51单片机程序。有兴趣的可以看看。具体关于Modbus的问题可以咨询我,可探讨
  • 第一个单片机程序(C语言编写)

    千次阅读 2016-11-08 21:03:36
    第一个单片机程序: 纯文本复制 #include //包含特殊功能寄存器定义的头文件sbit LED = P0^0; //位地址声明,注意:sbit 必须小写、P 大写!void main(){ //任何一个 C 程序都必须有且仅有一个 main 函数 ...
  • 单片机程序死机,跑飞了可以从以下几个方面查找原因:1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。2. 中断变量处理不...
  • 单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。 若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个念头起源...
  • 用keil编写的单片机程序要编译成目标文件。具体要看你用的芯片。一般编译成十六进制文件或二进制文件。烧写的的方法也和芯片有关。有的要烧写器,有的就是在线。在线烧写就是不用把芯片写下来直接烧写。一般用串行口...
1 2 3 4 5 ... 20
收藏数 85,503
精华内容 34,201
关键字:

单片机的程序‘