12下一页

单片机C语言3

  [复制链接]

工程师

发表于 2011-3-14 18:27:59   6274 查看 38 回复 显示全部楼层 倒序浏览
分享
本帖最后由 huangjunbo 于 2011-12-21 18:48 编辑


第三课 生成HEX文件和最小化系统
[/td]
在开始C语言的主要内容时,我们先来看看如何用KEIL uVISION2来编译生成用于烧写芯片的HEX文件。HEX文件格式是Intel公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用16进制数字表示, 常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。我们先来打开第一课做的第一项目,打开它的所在目录,找到test.Uv2的文件就可以打开先前的项目了。然后右击图3-1中的1项目文件夹,弹出项目功能菜单,选Options for Target'Target1',弹出项目选项设置窗口,同样先选中项目文件夹图标,这时在Project菜单中也有一样的菜单可选。打开项目选项窗口,转到Output选项页图3-2所示,图中1是选择编译输出的路径,2是设置编译输出生成的文件名,3则是决定是否要创建HEX文件,选中它就可以输出HEX文件到指定的路径中。选好了?好,我们再将它重新编译一次,很快在编译信息窗口中就显示HEX文件创建到指定的路径中了,如图3-3。这样我们就可用自己的编程器所附带的软件去读取并烧到芯片了,再用实验板看结果,至于编程器或仿真器品种繁多具体方法就看它的说明书了,这里也不做讨论。
(技巧:一、在图3-1中的1里的项目文件树形目录中,先选中对象,再单击它就可对它进行重命名操作,双击文件图标便可打开文件。二、在Project下拉菜单的最下方有最近编辑过的项目路径保存,这里可以快速打开最近在编辑的项目。)
[/td]


图3-1项目功能菜单


图3-2 项目选项窗口


图3-3 编译信息窗口
[/td]
或许您已把编译好的文件烧到了芯片上,如果您购买或自制了带串口输出元件的学习实验板,那您就可以把串口和PC机串口相联用串口调试软件或Windows的超级终端,将其波特率设为1200,就可以看到不停输出的"Hello World!"字样。也许您还没有实验板,那这里先说说AT89C51的最小化系统,再以一实例程序验证最小化系统是否在运行,这个最小化系统也易于自制用于实验。图3-4便是AT89C51的最小化系统,不过为了让我们可以看出它是在运行的,我加了一个电阻和一个LED,用以显示它的状态,晶振可以根据自己的情况使用,一般实验板上是用11.0592MHz或12MHz,使用前者的好外是可以产生标准的串口波特率,后者则一个机器周期为1微秒,便于做精确定时。在自己做实验里,注意的是VCC是+5V的,不能高于此值,否则将损坏单片机,太低则不能正常工作。在31脚要接高电平,这样我们才能执行片内的程序,如接低电平则使用片外的程序存储器。下面,我们建一个新的项目名为OneLED来验证最小化系统是否可以工作(所有的例程都可在我的主页下面下载到,网址:http://cdle.yeah.nethttp://www.cdle.net )。程序如下:
#include <AT89X51.h> //预处理命令 void main(void) //主函数名
{
//这是第一种注释方式
unsigned int a; //定义变量a为int类型

do{//do while组成循环
for (a=0; a<50000; a++); //这是一个循环
P1_0 =0; //设P1.0口为低电平,点亮LED
for (a=0; a<50000; a++); //这是一个循环
P1_0 = 1; //设P1.0口为高电平,熄灭LED
}
while(1);
}
[/td]

图3-4 AT89C51最小化系统
[/td]
这里先讲讲KEIL C编译器所支持的注释语句。一种是以"//"符号开始的语句,符号之后的语句都被视为注释,直到有回车换行。另一种是在""符号之内的为注释。注释不会被C编译器所编译。一个C应用程序中应有一个main主函数,main函数可以调用别的功能函数,但其它功能函数不允许调用main函数。不论main函数放在程序中的那个位置,总是先被执行。用上面学到的知识编译写好的OneLED程序,并把它烧到刚做好的最小化系统中。上电,刚开始时LED是不亮的(因为上电复位后所有的IO口都置1引脚为高电平),然后延时一段时间(for (a=0; a<50000; a++)这句在运行),LED亮,再延时,LED熄灭,然后交替亮、灭。第一个真正的小应用就做完,呵呵,先不要管它是否实用哦。如果没有这样的效果那么您就要认真检查一下电路或编译烧写的步骤了。

工程师

发表于 2011-3-19 10:20:55    楼主|
{:3_48:}沙发
回复

点赞 举报

工程师

发表于 2011-12-21 13:45:56    楼主|
{:52:}
回复

点赞 举报

工程师

发表于 2011-12-21 14:03:09  
{:52:}{:52:}
回复

点赞 举报

技术员

发表于 2011-12-22 15:14:23   来自手机
不错哈
回复

点赞 举报

实习生

发表于 2011-12-23 17:05:43  
顶一个。。。
回复

点赞 举报

实习生

发表于 2011-12-24 21:09:08  
{:48:}支持
回复

点赞 举报

技术员

发表于 2011-12-24 21:30:48  
好资料
回复

点赞 举报

技术员

发表于 2011-12-26 22:43:23  
谢谢分享!
回复

点赞 举报

技术员

发表于 2011-12-28 20:54:08  
各位高手,小弟有个问题这两天都没有解决掉。无奈下前来求助,问题是这样的。我要用单片机外接DA和产生中断的延时方法控制发光二极管的亮暗交替变化 。我写的程序如下,请高手帮我指出错误!感激不尽!
while(1)

  {
    if(count==10)  //中断在这里开始  中断子程序我就没贴过来了。
    {
    count=0;
    P0=a;   // P0口接DA  
    a++;
    if(a>255)  //8位DA应该是有256种变化值吧   我的意思是等a加到255的时候就执行下面的语句
    {
    b=255;
    P0=b;
    b--;
    }
    }
回复

点赞 举报

实习生

发表于 2011-12-28 22:08:40  
好好学习
回复

点赞 举报

实习生

发表于 2011-12-29 09:21:59  
谢谢
回复

点赞 举报

实习生

发表于 2011-12-30 09:14:29  
谢谢分享
回复

点赞 举报

技术员

发表于 2012-1-4 09:38:00  
你好。我也是新手,我看了一下这个东东。我觉得a这个变量只有自增,没有自减也没有赋值0。我觉的你这个程序将这样执行。当a第一次等于256的时候,程序将一直满足 if(a>255)那么P0=56,a变成257,然后你又把255赋给P0。b变成254。接下来下一次中断,P0=257,然后p0=254 ……这样 频繁的变化,我想应该是看不见你想要的由暗到亮,再由亮到暗的吧。。
回复

点赞 举报

技术员

发表于 2012-1-4 09:53:33  
我觉得可以使用一个标志flag,当a为255的时候将flag赋值1,为0的时候赋值0.
while(1)
{
        if(flag==0)
        {
                P0=a;
                a++;
                if(a==255)
                {
                        flag=1;
                }
        }
        delay(50);
        else
        {
                p0=a;
                a--;
                if(a==0)
                {
                           flag=0;
                }
                delay(50);       
           }
}
你看这样能行么,希望能帮到你。
回复

点赞 举报

发表于 2012-3-30 18:48:45  
看看
回复

点赞 举报

高级工程师

发表于 2012-8-9 11:13:42  
回复

点赞 举报

发表于 2012-9-7 11:11:57  
回复

点赞 举报

技术员

发表于 2012-11-25 15:25:43  
谢谢分享
回复

点赞 举报

助理工程师

发表于 2012-11-25 16:15:48  
不错
学习
回复

点赞 举报

12下一页
高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

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

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

电子展览展会专区

芯片求购|供应发布区