• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

工程师手把手教你学习单片机(作者原创)

第一章  认识单片机及其如何工作

一、单片机简单说明
目前单片机主要8位、16位、32位单片机, 8位单片机应用最为广泛,教材也比较多,16位和32位在最近几年也应用的越来越广泛.
51单片机是8位单片机中使用最早,在我国使用最广泛的一种.常见的品牌有atmel, STC, SST, NXP(飞利浦) ,freescale(原摩托罗拉),华邦,高性能C8051F等品牌.
Intel的8031,8051早就不生产了,其它公司都是根据其内核生产的,使用其指令系统和结构,但是各个品牌又增加了自己很多功能,如FLASH存储器,内置看门狗,AD功能等功能,各个品牌的功能也不大一样.
作为学生或者初学者,学习51非常适合入门,资料丰富,例子较多,对以后学习其它高级的单片机是一个非常好的基础.
本开发板选用的是STC89C51单片机,该单片机是最近几年新出的,完全兼容MCS-51,增加了FLASH,ISP下载,大容量RAM,看门沟,内部复位电路,EEPROM,及最高80M的运行速度等功能.
大家如果对以上介绍的不太了解,不要紧,随着学习和积累经验,就明白了.

二、单片机工作的条件
1、一个51单片机要工作需要具备哪些条件?
DC5V电源(有的单片机是3.3V),复位电路,和晶振,单片机只要有了这三点就可以工作了.(但是有的单片机内部集成了复位电路或晶振,这时候外部的电路就可有可无了,比如STC单片机的内部集成了复位电路,C8051F单片机的内部集成了晶振电路)

复位电路,大部分51是高电平复位的(如下图),C8051F是低电平复位的,电阻和电容要更换位置.


晶振电路:常用的电容是22P或30P,晶振选择11.0592是为了通信的时候拨特率0误差.大家可以找教程查查拨特率和晶振的对应关系.


三、单片机如何编写程序呢?
    单片机除了具备以上的硬件条件,还要有程序才能真正运行,就象电脑需要装操作系统才能用一样的道理.
    单片机编程可以使用MCS-51汇编语言和C语言编程.其实单片机真正执行的是BIN或HEX文件,那么BIN和HEX文件是如何得到的呢,是通过汇编语言或C语言编写的程序,经过专门的软件编译后最后生成的.
C语言的编译软件主要用KEIL软件,也是最好用最常用的软件.汇编语言的编译软件比较多了,常用的有WAVE软件.
   四、单片机如何下载/烧录程序呢?
       1、使用通用的编程器烧录(并口烧录,可以烧录各种品牌的)
       2、使用下载线进行ISP下载,(只需要2-3根线),这种下载方式非常方便,缺点是各个品牌的下载方式不统一.比如STC,SST,飞利浦的使用TXD,RXD下载,比较方便;而atmel的,只有AT89S系列的才可以下载,AT89C51的就不可以ISP下载,并且使用P15,P16,P17三个引脚下载,而且下载线要有专用的下载电路.
ISP下载的非常适合学习和实验,而通用烧录的适合工厂生产.

现在,你已经学会了单片机怎么使用了,休息一下!进行第二章的讲解

全部回复(11)
正序查看
倒序查看
2008-12-04 12:11
基础的东西,表示支持
0
回复
ahai0306
LV.4
3
2008-12-04 12:30
@gdxizhilang
基础的东西,表示支持
为什么复制上去的图片都没有了呢
0
回复
ahai0306
LV.4
4
2008-12-04 12:33
第二章  单片机基础实验

一、单片机控制发光二极管实验

500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/72/67561228365123.jpg');}" onmousewheel="return imgzoom(this);">

首先学习一下硬件,拿第一路为例,R1为限流电阻,发光二极管导通后的压降为Ud,那么流过此二极管的电流为(U-Ud)/R,大家可以根据二极管的大小来调整电阻大小,以保证亮度.开发板用的0805/1206发光二极管使用1K电阻即可.如果是大功率的发光管需要加驱动如三极管电路之类的,不能直接连接单片机引脚的.各种品牌的IO驱动能力不一样的,STC89C51的IO灌电流能力是20mA.

上面发光二极管的原理是,P00为高电平(5V),D1截止,不亮;P00为低电平(0V),D1导通,发光.二极管控制就这么简单,下面来编写程序吧

C语言程序:
#include           //调用头文件(单片机内部的寄存器定义)
sbit  LED0   = P0 ^ 0;  //必须定义,P0 ^ 0 脱离开sbit指令是其它意思
main()         //主函数
{
  LED0=0;      //LED0发光二极管亮(P00输出低电平)

  while(1);    //单片机在这里等待(待机)
}

汇编程序:

;***********硬件I/O口定义************
LED0             EQU                   P0.0

               ORG    0000H                ;上电后程序从这里运行
               AJMP  MAIN
              
MAIN:      
                   CLR    LED0               ;LED0发光二极管亮(P00输出低电平)
                   SJMP   $                     ;单片机在这里等待(待机)
                   END

第一个程序已经编写完了,编译后下载到单片机体验一下吧,我以前写过初学者的第一个单片机程序,大家可以看看:

http://blog.ednchina.com/ahai0306/19917/message.aspx

这时候大家已经会点亮第一个灯了,然后大家可以随便点亮其它的灯了,可以使用P0直接点亮8个灯了
C语言程序:
#include           //调用头文件(单片机内部的寄存器定义)
main()         //主函数
{
  P0=0;      //P0口的8个发光二极管全亮

  while(1);    //单片机在这里等待(待机)
}

汇编程序:

               ORG    0000H                ;上电后程序从这里运行
               AJMP  MAIN
MAIN:      
                   MOV P0    #00H              ;P0的8个发光二极管全亮
                   SJMP   $                     ;单片机在这里等待(待机)
                   END

现在大家可以用移位指令加上适当延时,来进行流水灯实验了,大家先思考一下如何实现?
不明白的地方和本人交流!
QQ:464976346
http://blog.ednchina.com/ahai0306/(我的博客)
0
回复
51icjm
LV.3
5
2008-12-14 23:29
@ahai0306
第二章  单片机基础实验一、单片机控制发光二极管实验[图片]500){this.resized=true;this.width=500;this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}"onclick="if(!this.resized){returntrue;}else{window.open('http://u.dianyuan.com/bbs/u/72/67561228365123.jpg');}"onmousewheel="returnimgzoom(this);">首先学习一下硬件,拿第一路为例,R1为限流电阻,发光二极管导通后的压降为Ud,那么流过此二极管的电流为(U-Ud)/R,大家可以根据二极管的大小来调整电阻大小,以保证亮度.开发板用的0805/1206发光二极管使用1K电阻即可.如果是大功率的发光管需要加驱动如三极管电路之类的,不能直接连接单片机引脚的.各种品牌的IO驱动能力不一样的,STC89C51的IO灌电流能力是20mA.上面发光二极管的原理是,P00为高电平(5V),D1截止,不亮;P00为低电平(0V),D1导通,发光.二极管控制就这么简单,下面来编写程序吧C语言程序:#include          //调用头文件(单片机内部的寄存器定义)sbit  LED0  =P0^0;  //必须定义,P0^0脱离开sbit指令是其它意思main()        //主函数{  LED0=0;      //LED0发光二极管亮(P00输出低电平)  while(1);    //单片机在这里等待(待机)}汇编程序:;***********硬件I/O口定义************LED0            EQU                  P0.0              ORG    0000H                ;上电后程序从这里运行              AJMP  MAIN              MAIN:                        CLR    LED0              ;LED0发光二极管亮(P00输出低电平)                  SJMP  $                    ;单片机在这里等待(待机)                  END第一个程序已经编写完了,编译后下载到单片机体验一下吧,我以前写过初学者的第一个单片机程序,大家可以看看:http://blog.ednchina.com/ahai0306/19917/message.aspx这时候大家已经会点亮第一个灯了,然后大家可以随便点亮其它的灯了,可以使用P0直接点亮8个灯了C语言程序:#include          //调用头文件(单片机内部的寄存器定义)main()        //主函数{  P0=0;      //P0口的8个发光二极管全亮  while(1);    //单片机在这里等待(待机)}汇编程序:              ORG    0000H                ;上电后程序从这里运行              AJMP  MAINMAIN:                        MOVP0    #00H              ;P0的8个发光二极管全亮                  SJMP  $                    ;单片机在这里等待(待机)                  END现在大家可以用移位指令加上适当延时,来进行流水灯实验了,大家先思考一下如何实现?不明白的地方和本人交流!QQ:464976346http://blog.ednchina.com/ahai0306/(我的博客)
0
回复
13147
LV.4
6
2008-12-15 09:22
@51icjm
谢谢楼主.芯片解密单片机解密
支持一下不错!
0
回复
2008-12-17 21:20
@13147
支持一下不错!
不错,我真想学习这个
0
回复
2008-12-22 12:51
@luoshichen
不错,我真想学习这个
恩,不错
0
回复
ahai0306
LV.4
9
2008-12-27 22:07
@luoshichen
不错,我真想学习这个
可以加我QQ:464976346  及时了解新的资料,有技术问题可以问我
0
回复
2009-01-04 12:14
很好的东西,谢了
0
回复
张伟明
LV.3
11
2009-01-09 12:08
@越来越寂寞
很好的东西,谢了
有没有人用汇编的啊,我用汇编的,C的不会,不知道容易学吗
0
回复
abing
LV.8
12
2009-01-10 10:39
@ahai0306
第二章  单片机基础实验一、单片机控制发光二极管实验[图片]500){this.resized=true;this.width=500;this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}"onclick="if(!this.resized){returntrue;}else{window.open('http://u.dianyuan.com/bbs/u/72/67561228365123.jpg');}"onmousewheel="returnimgzoom(this);">首先学习一下硬件,拿第一路为例,R1为限流电阻,发光二极管导通后的压降为Ud,那么流过此二极管的电流为(U-Ud)/R,大家可以根据二极管的大小来调整电阻大小,以保证亮度.开发板用的0805/1206发光二极管使用1K电阻即可.如果是大功率的发光管需要加驱动如三极管电路之类的,不能直接连接单片机引脚的.各种品牌的IO驱动能力不一样的,STC89C51的IO灌电流能力是20mA.上面发光二极管的原理是,P00为高电平(5V),D1截止,不亮;P00为低电平(0V),D1导通,发光.二极管控制就这么简单,下面来编写程序吧C语言程序:#include          //调用头文件(单片机内部的寄存器定义)sbit  LED0  =P0^0;  //必须定义,P0^0脱离开sbit指令是其它意思main()        //主函数{  LED0=0;      //LED0发光二极管亮(P00输出低电平)  while(1);    //单片机在这里等待(待机)}汇编程序:;***********硬件I/O口定义************LED0            EQU                  P0.0              ORG    0000H                ;上电后程序从这里运行              AJMP  MAIN              MAIN:                        CLR    LED0              ;LED0发光二极管亮(P00输出低电平)                  SJMP  $                    ;单片机在这里等待(待机)                  END第一个程序已经编写完了,编译后下载到单片机体验一下吧,我以前写过初学者的第一个单片机程序,大家可以看看:http://blog.ednchina.com/ahai0306/19917/message.aspx这时候大家已经会点亮第一个灯了,然后大家可以随便点亮其它的灯了,可以使用P0直接点亮8个灯了C语言程序:#include          //调用头文件(单片机内部的寄存器定义)main()        //主函数{  P0=0;      //P0口的8个发光二极管全亮  while(1);    //单片机在这里等待(待机)}汇编程序:              ORG    0000H                ;上电后程序从这里运行              AJMP  MAINMAIN:                        MOVP0    #00H              ;P0的8个发光二极管全亮                  SJMP  $                    ;单片机在这里等待(待机)                  END现在大家可以用移位指令加上适当延时,来进行流水灯实验了,大家先思考一下如何实现?不明白的地方和本人交流!QQ:464976346http://blog.ednchina.com/ahai0306/(我的博客)
很不错!!!
很合适初学者
0
回复