社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1427|回复: 2

[讨论] 单片机C语言编程

[复制链接]

118

TA的帖子

0

TA的资源

禁止发言

发表于 2017-1-23 15:04:15 | 显示全部楼层 |阅读模式
这是一篇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命令行:PICC C编译器绝对路径\PICC\9.80\bin\picc.exe -16F873A %F工作目录:项目绝对路径\picTest工具栏位图/图标:PICC 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的反编译器,可以试试回来后的结果。
此帖出自PIC单片机论坛


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-2-2 11:32:30 | 显示全部楼层
谢谢,PICC我要赶快学了!


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-7-1 16:13:41 | 显示全部楼层
长见识了,谢谢版主热心的分享!


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-7-18 03:29 , Processed in 0.099566 second(s), 16 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表