A. 手把手教你学51单片机的前 言
目前,51系列单片机在我国已得到大力推广和广泛应用,从工业控制系统到小型电子产品都可以见到51单片机的身影,它经典的结构使其成为单片机学习的入门首选,得到了广大单片机使用者的一致推崇,关于51单片机学习和应用的书也五彩纷呈,本书也是其中的一本。
编写本书的目的
笔者从事单片机设计工作已有多年,在这期间设计和参与设计了较多的单片机项目,取得了很多单片机实际设计经验,对单片机设计有了一些较深的认识。所以希望能通过这本书对初步学习单片机的读者有所帮助,并且也是自己对学习和应用单片机的一个总结。
通常在学校学习的单片机知识偏重于理论而不是技能,可是在工作中需要面对的是实际问题,而不是在纸上谈兵;作为一名单片机工程师,笔者在工作中对此深有感触。所以本书的着重点是想让读者了解一个完整的单片机设计过程所需的知识,而不仅仅只是讲述单片机的原理。通过本书的学习,读者可以独立设计和完成一个简单的单片机控制系统,即体验从原理图设计、制作电路板到单片机系统调试的整个过程。
本书的主要内容
本书概括地论述了单片机的基础知识,包括单片机的基本结构和工作原理;并就实际单片机项目开发中会遇到的各种问题进行了阐述,列举了单片机开发的流程和必须遵守的一些规范,说明了仿真器和编程器在开发中的作用以及基本的使用方法。具体内容如下。
首先论述了单片机的基础知识,包括单片机的基本结构和工作原理,阐述了目前单片机的发展情况,列举了最新流行的单片机种类,总结了单片机的选择方法。
在了解单片机基本知识的基础上,详细讲解了单片机的主要开发语言——汇编语言和C51语言;编程语言的使用是单片机和其他集成电路的重要区别,用它来赋给单片机命令,使单片机按照设计者的意志运行命令。
本书也花了一定的篇幅讲解了仿真器和编程器的原理和使用说明。编程器和仿真器是单片机项目开发中常用的工具,仿真器是单片机程序调试中很有用的辅助工具,可以逐步地观察单片机的运行过程,以便发现程序中的错误;而编程器是用来将编写好的程序写入单片机的工具。除了传统的仿真器和编程器外,还列举了一些最新的单片机开发手段,如在线仿真和ISP(在系统编程),这些新的方法大大降低了单片机的开发费用,在线仿真使得设计者不需要去购买昂贵的仿真器,而ISP则替代了编程器,这进一步降低了学习单片机开发的门槛。
在讲解这些理论知识的过程中,本书还简单讲述了单片机开发中的一些规范,包括单片机原理图、PCB图以及程序设计的设计规范。这在实际工作中是必须了解和遵守的,也是一个单片机设计工程师必须具备的基本知识。
完成了基本知识的学习后,本书由易至难列举了一些设计实例,这些实例基本上概括了单片机项目设计中遇到的各种问题。
通常,一个单片机系统设计可以分为如下五大方面。
(1)单片机能够运行的最小系统,包括振荡电路、复位电路以及电源电路。
(2)单片机I/O口的使用方法和定时器、中断系统的使用。
(3)单片机的通信接口,单片机的通信在单片机设计中是经常遇到的功能,所以必须注意目前单片机系统常用的各种通信接口和协议。
(4)单片机的系统扩展,系统扩展通常可以分为程序存储器的扩展、数据存储器的扩展以及单片机I/O口的扩展三部分。
(5)信号转换接口,主要是A/D、D/A转换以及PWM的实现。这是单片机信号处理中经常遇到的问题。
前面两部分是单片机最基本的功能,后面三部分则是单片机的扩展应用,掌握了这些基本知识,便可应对用单片机解决的各种项目。
本书的特点
本书具有知识全面、实例丰富、操作性强的特点,力求以全面、系统的知识和丰富、简短的实例指导初学者学习单片机各方面的知识。因此,本书适合于开始学习单片机设计和具有一定单片机基础知识的读者,目的是使读者通过本书的学习可以初步掌握单片机的开发应用。
本书安排有“提示”、“注意”、“说明”小栏目,通过这些小栏目可和读者分享一些经验和心得,同时也可为读者清除学习过程中的难点和疑点。
本光盘内容超值丰富,不但提供了书中全部范例的源代码和电路图,而且提供了多媒体视频教学录像,用以讲解如何使用本书光盘中的源代码,手把手引导读者直观深入地学习。
本书阅读顺序
本书章节的安排是依据读者对单片机学习的过程、以循序渐进的方式建立的,建议初学者从前至后阅读。
首先阅读第1章至第7章,这些章节是单片机设计的基础知识,必须掌握。只有熟读了这几章的内容,才能阅读后面的章节。其中,第3章可以放到完成基本知识的学习后阅读。
阅读第8章至第12章,这几章是讲述单片机设计中的一些基本手段和方法,涉及单片机系统设计中的方方面面,掌握这些知识可以解决单片机设计中的大部分问题。
阅读第13章——综合实例,它由浅入深、由简入繁,将前面讲解的一些知识应用到实际项目中,可以让读者对单片机设计项目有具体的认识。
致谢
经过紧张的策划、写作和编写,本书才得已完稿。在写作的过程中,得到了参与本书策划的各位编辑的大力协助;在此,对所有参与该书编辑、出版的老师表示衷心的感谢。
惠 仇
2008.6.28
B. 零基础怎么学单片机
可以的,单片机不难,先学C语言,英语常用的单词认识就行,一般都可以用翻译软件。0基础建议先学51
C. 51单片机流水灯实验(我用的是手把手教你学单片机的教程)
呵呵,这个延时有点长哦,有10S,你耐心再看看,有没有变化,如果再没变化,你可以软件仿真一下那个i变量。看他是不是能加到10000,。还有,学51单片机的话建议你去学 郭天祥十天学会51单片机 那个很不错。希望采纳
D. 看金沙滩的手把手学单片机有一个问题,编程步进电机的转动与反转的代码疑惑
1.在正转和反转里分别有index++和index--两条语句
而下面有tmp = tmp | BeatCode[index];这一条语句
随着index的加1或减1便可出现像tmp = tmp | BeatCode[0]、tmp = tmp | BeatCode[1]的正序或tmp = tmp | BeatCode[7]、tmp = tmp | BeatCode[6];这样的倒序
2.这里的tmp是一个进行运算的中间变量,如果你直接使用P1来进行运算,1运算的一些中间结果将会直接输出到P1口对外设产生影响,2外设的输入信号也会影响到运算过程。所以这里先将P1给了tmp,然后用tmp运算,再将运算结果送给P1
E. 手把手教你学会单片机,宋雪松老师的简易计算器,怎么用普中科技单片机实现怎么接线
/* S16 S12 S8 S4分别是123+
S15 S11 S7 S3分别是456-
S14 S10 S6 S2分别是789*
S13 S9 S5 S1分别是0 CLR = /
*/
/* 实现两个数的运算,每个数的位数至少可以八位 */
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit rw=P2^5;
sbit rs=P2^6;
sbit e=P2^7;
sbit led=P3^7;
sbit beep=P2^0;
uint8 key,num;
uint8 fuhao;//定义具体的那个符号,是加减还是乘除。
uint8 flag; //定义有没有按下符号键,这个是统称
long a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量
uint8 k; //定义小数点后面显示的位数
uint8 biao;
uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据
void delay(uint16 i)
{
while(i--);
}
void lcdwrc(uint8 c)
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(1000);
e=0;
}
void lcdwrd(uint8 dat)
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(1000);
e=0;
rs=0;
}
void lcdinit()
{
delay(1500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
lcdwrc(0x08);
lcdwrc(0x01);
lcdwrc(0x06);
lcdwrc(0x0c);
key=0;
num=0;
flag=0;
fuhao=0;
a=0;
b=0;
c=0;
d=0;
biao=0;
led=0;
}
void keyscan()
{
P1=0xfe; //令第一行为0,然后判断是哪一列按下
if(P1!=0xfe)
{
delay(1000);
if(P1!=0xfe)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=0;break; //1
case 0xd0: num=1;break; //2
case 0xb0: num=2;break; //3
case 0x70: num=3;break; //加
}
}
while(P1!=0xfe);
if(num==0||num==1||num==2) //确认第一行的数1,2,3
{
if(flag==0) //没有按下符号键
{
//led=1;
a=a*10+dat1[num];
}
else
{
//led=1;
b=b*10+dat1[num];
}
}
if(num==3)
{
//led=0;
flag=1;
fuhao=1;//加号+
}
lcdwrd(0x30+dat1[num]);
}
P1=0xfd; //令第二行为0,判断是哪一列按下
if(P1!=0xfd)
{
delay(1000);
if(P1!=0xfd)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=4;break; //4
case 0xd0: num=5;break; //5
case 0xb0: num=6;break; //6
case 0x70: num=7;break; //减—
}
}
while(P1!=0xfd);
if(num==4||num==5||num==6)
{
if(flag==0) //没有按下符号键
{
//led=1;
a=a*10+dat1[num];
}
else
{
//led=1;
b=b*10+dat1[num];
}
}
else
{
flag=1;
fuhao=2;//带表减号
}
lcdwrd(0x30+dat1[num]);
}
P1=0xfb; //令第三行为0,判断哪一列按下
if(P1!=0xfb)
{
delay(1000);
if(P1!=0xfb)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=8;break; //7
case 0xd0: num=9;break; //8
case 0xb0: num=10;break; //9
case 0x70: num=11;break; //乘*
}
}
while(P1!=0xfb);
if(num==8||num==9||num==10)
{
if(flag==0) //没有按下符号键
{
//led=1;
a=a*10+dat1[num];
}
else
{
//led=1;
b=b*10+dat1[num];
}
}
else
{
flag=1;
fuhao=3;//带表乘号*
}
lcdwrd(0x30+dat1[num]);
}
P1=0xf7; //令第四行为0,判断哪一列按下
if(P1!=0xf7)
{
delay(1000);
if(P1!=0xf7)
{
key=P1&0xf0;
switch(key)
{
case 0xe0: num=12;break; //0
case 0xd0: num=13;break; //清除rst
case 0xb0: num=14;break; //等号=
case 0x70: num=15;break; //除/
}
}
while(P1!=0xf7);
switch(num)
{
case 12:
if(flag==0) //没有按下符号键
{
//led=1;
a=a*10+dat1[num];
lcdwrd(0x30);
}
else
{
//led=1;
b=b*10+dat1[num];
lcdwrd(0x30);
}
break;
case 13:
lcdwrc(0x01); //清屏指令
a=0;
b=0;
flag=0;
fuhao=0;
break;
case 15:
flag=1;
fuhao=4;
lcdwrd(0x2f);//除号/
break;
case 14:
if(fuhao==1)//加
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=a+b;
while(c!=0) //一位一位显示
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==2) //减
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
if(a>b)
c=a-b;
else
c=b-a;
while(c!=0) //一位一位显示
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
if(a<b) lcdwrd(0x2d); //显示-号
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==3)//乘法
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=a*b;
while(c!=0) //一位一位显示
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==3)//乘法
{
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=a*b;
while(c!=0) //一位一位显示
{
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
}
lcdwrd(0x3d); //显示等于号=
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
if(fuhao==4)
{
k=0;
lcdwrc(0x4f+0x80);
lcdwrc(0x04);//设置光标左移,屏幕不移动
c=(long)(((float)a/b)*1000);//强制转换为long。
while(c!=0) //一位一位显示
{
k++;
lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
c=c/10;//取前面的结果数据
if(k==3)
{
lcdwrd(0x2e);
k=0;
}
}
if(a/b<0) //如果a比b小的话那么除的结果最高位是0
{
lcdwrd(0x30);
}
lcdwrd(0x3d); //显示等号
a=0;
b=0;
flag=0;
fuhao=0;//全部清除为0
}
break;
}
}
}
void main()
{
lcdinit();
while(1)
{
keyscan();
}
}
F. 单片机教程
王云 51单片机教程,就很好,身边很多同学在用。
G. 手把手教你学单片机的图书简介
本书以实际编程及做实验为主线贯穿全书。完全摒弃教科书的方法,采用“程序完成后软件仿真→单片机烧录程序→试验板通电实验”的方法,以全新的方式边学边实验,将初学者领进单片机世界的大门。随书所附的光盘中提供了一些工具软件以及本书所有的实验程序文件,在学习、实验时可参考。
H. 手把手教你学51单片机
这个我还是很有发言权的,因为我可谓搞单片机的“革命先烈”。要自学单片机最好先从51单片机开始入门,市面上有很多教程,我推荐去凡亿课程看下,比较详细。 网络里面也有详细介绍。