3575|2

88

帖子

0

TA的资源

禁止发言

楼主
 

单片机C语言编程 [复制链接]

这是一篇PIC单片机采用C语言编程,说明C编译器的特点之一。一点亮LED为例说明。

LED点亮太简单了。不就是将接有LED的口置高或低就Ok了,却是如此。首先需要了解C编程。假设已有基本的C基础。此外将目标板连接好,在RC口的RC7~RC4连接串有102电阻的LED。如果是双向的LED效果最好。打开Uedit32,创建第一个项目,文件夹名:pic16f873a/picTest/,项目名:test。这款软件尽管以项目管理方式,但实际上他是文件操作管理软件,因此一个项目下可以放所有的相关编程,只要文件名能区别即可。

在弹出的工程设置对话框中/关闭即可——除非已有程序,可以添加进工程中。在工程界面:文件/新建输入led.c;而后工程/添加到工程/文件,将刚创建的led.c加入项目。与所有单片机编程一样首相需要加入头文件,在头输入:
#include
__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
__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的反编译器,可以试试回来后的结果。

最新回复

长见识了,谢谢版主热心的分享!  详情 回复 发表于 2017-7-1 16:13
点赞 关注
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
谢谢,PICC我要赶快学了!
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
长见识了,谢谢版主热心的分享!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表