查看: 1013|回复: 0

单片机C语言编程

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 11:07
  • 签到天数: 226 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-1-13 08:51:18 | 显示全部楼层 |阅读模式
    分享到:
    这是一篇PIC单片机采用C语言编程,说明C编译器的特点之一。一点亮LED为例说明。
    LED点亮太简单了。不就是将接有LED的口置高或低就Ok了,却是如此。首先需要了解C编程。假设已有基本的C基础。此外将目标板连接好,在RC口的RC7~RC4连接串有102电阻的LED。如果是双向的LED效果最好。打开Uedit32,创建第一个项目,文件夹名:pic16f873a/picTest/,项目名:test。这款软件尽管以项目管理方式,但实际上他是文件操作管理软件,因此一个项目下可以放所有的相关编程,只要文件名能区别即可。
    在弹出的工程设置对话框中/关闭即可——除非已有程序,可以添加进工程中。在工程界面:文件/新建输入led.c;而后工程/添加到工程/文件,将刚创建的led.c加入项目。与所有单片机编程一样首相需要加入头文件,在头输入:
    #include<pic.h>
    __CONFIG(0xFF32);//参阅PIC16F873A pdf文档 P 142 14.1 Configuration Bits配置字
    //接着可以采用多种方法实现,最简单方法是直接创建main函数
    void main(void){
      long i;//长整形最大65535
      //define port
      TRISC=0b00001111;//H7-4=Input/L3-0=Out
      PORTC=0x50;//=01010000
      while(1){
      PORTC=0x50;
      for(i=50000;i>0;i--);
      PORTC=0xA0;//=10100000
      for(i=50000;i>0;i--);
      }
    }
    一共13行。
    为什么不用PORTB呢?因为B口的有弱上拉设置,所以我们先用简单的C口操作。在编译之前需要选择采用那种C编译软件,PICC是与Uedit32常配的编译器,单击高级/工程工具配置,按下述选输菜单项目名称:16f873a命令行ICC C编译器绝对路径\PICC\9.80\bin\picc.exe -16F873A %F工作目录:项目绝对路径\picTest工具栏位图/图标ICC C编译器绝对路径\PICC\9.80\resources\hitech_logo.ico第一行是编译项目名称第二行是编译器的文件夹路径和文件名后跟的参数第三行是要编译的对象文件的文件夹路径第四行是编译器的图标,可以不要
    之后在高级/最下一行可以看到:16f873a的选项,单击他会对当前打开的C文件进行编译,如果没有问题会产生一个与编译文件名一样的.hex文件,将此文件烧到MCU中就可以看到结果了。
    打开PicKit2,单击Device Family/Midrange/Standart;在下边的 Device右边下拉找到PIC16F873A;文件/Import Hex/将工程文件夹下的编译好的.hex加到程序中,本例文件为:led.hex;而后单击Write或Programmer/Write Device/数秒之后就下载完成了,可以单击VDD PICKit 2下边的On选框,加载电压到目标机,观看结果。
    小小改进,上述程序没有问题,一切如愿,但不规范——C规定先定义再使用,并且最好以模块化的方式。上述可以分析得到:IO口的定义,有一个延时语句,控制LED是主要的——分成ioInit、delay和main,程序改成:
    #include<pic.h>
    __CONFIG(0xFF32);//参阅PIC16F873A pdf文档 P 142 14.1 Configuration Bits配置字
    //define port
    void ioInit(void){
       TRISC=0b00001111;//H7-4=Input/L3-0=Out
       PORTC=0x50;//=01010000
    }
    //Delay
    void delay(long ts){
       long i;
       for(i=ts;i>0;i--);
    }
    void main(void){
       ioInit();
       while(1){
       PORTC=0x50;//=01010000
       delay(50000);
       PORTC=0xA0;//=10100000
       delay(50000);
       }
    }
    一共18行。
    上述程序从语句上看多了几行,从结构上非常清晰。编译后的程序效率呢?
    前边的:
    :040000008A11B02F82
    :100F600083018A11B32F0F3083168700503083120C
    :100F7000870050308700A301A201C330A100503088
    :100F8000A000FF30A007031CA107031CA207031C3D
    :100F9000A3072308803AFF0080307F02031DDA2F69
    :100FA00000302202031DDA2F00302102031DDA2F48
    :100FB000013020020318C12FA0308700A301A20135
    :100FC000C330A1005030A000FF30A007031CA107D0
    :100FD000031CA207031CA3072308803AFF008030EC
    :100FE0007F02031DFD2F00302202031DFD2F003064
    :100FF0002102031DFD2F01302002031CB92FE42F15
    :02400E0032FF7F
    :00000001FF
    改后的:
    :040000008A11B82F7A
    :100F700083018A11C22F0F308316870050308312ED
    :100F8000870008008A11BB278A1150308700A3010F
    :100F9000A201C330A1005030A0008A11DC278A11C1
    :100FA000A0308700A301A201C330A1005030A000EF
    :100FB0008A11DC278A11C52F2308A7002208A60062
    :100FC0002108A5002008A4002708803AFF008030EF
    :100FD0007F02031DF52F00302602031DF52F003080
    :100FE0002502031DF52F01302402031C0800FF30E9
    :100FF000A407031CA507031CA607031CA707E42FCF
    :02400E0032FF7F
    :00000001FF
    你会发现少了整整一行,效率反而高了。这就是神秘的C编译器。它是结构化的编译器。就是说,对顺序写的程序编译效率低,对结构化的程序编译效率高,当然一般来说执行速度也会好点的。如果你手里有PIC的反编译器,可以试试回来后的结果。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 13:01 , Processed in 0.112396 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.