Ⅰ 我该如何学单片机
首先你要会一点模拟电路(认识电子元件和功能)和数字电路(二、十、十六等数制之间的转换)最基础的知识,会电脑的基本操作。
有了这些你还需要工具,没有工具光看书是没有用的,学单片机就是要多实践才能学得好。电脑、学习板这些都是必须的。
现在网上有很多视频教程很不错的,我现在也是刚学单片机的,正在看视频自学,觉得收获很大。
Ⅱ 手把手教你学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
Ⅲ 手把手教你学avr单片机C语言程序设计-----周兴华
很难找的
Ⅳ 怎样学习STM32
你这种情况我当初自学单片机的时候也遇到过,不知道从何下手,似乎哪里都是重点却哪里都是钉子。我的解决办法就是把这些文档、手册先放一边,跟着教程一步一步去动手写动手做,教程里怎么做自己就怎么做。从最简单的配置启动文件和点灯开始,千万不要眼高手低,即使再简单的事例即使看懂了真自己去做的时候那种感觉和带来的认识也是完全不一样的。在学习初期,除了启动配置库里的代码,自己程序里的主代码最好自己写一遍,哪怕是照着打也最好不要直接复制粘贴。实践过程中遇到不懂语句或者电路去再去查阅手册和资料,尽量自己解决,查的过程中注意不要看一直看起来没完舍本求末也不要贪大求全,看到解决了问题为止就再把手册放一边。平时有空可以看看那几个常用手册的目录,对大体内容有个了解,方便遇到问题时查找。建议学的过程中做笔记,把自己的理解和经验记录下来,记在数据手册的margin上也行,记在专门的本子上也行,这个看自己怎么习惯怎么来,两种方法各有优点一般互相结合,这部分学习中的积累在未来将是你的巨大财富。关于视频,网上传的比较多的讲的都挺好譬如野火的、青岛李想的等等,没有谁的一定最好一说,适合自己的就是最好的。STM32教程有两种,一种是基于对寄存器操作,另一种是基于函数库的直接使用。如果你有单片机基础,并且想以此为职业,推荐从寄存器操作学起,然后在学函数库,有基础学这部分很快,跟51、avr没多大差别,就是寄存器多、位数多、功能多而已。如果你刚入单片机,推荐从函数库的使用学起,等到学的差不多再慢慢了解寄存器的相关知识和操作。最后一句话概括就是:千里之行始于足下。
Ⅳ 学单片机 找学校
上海周新华老师好像最近办了一个单片机的培训班,他也写过《手把手教你学单片机(汇编)》《手把手教你学单片机(C语言)》(北航出版社)等书,你可以去
http://www.hlelectron.com/
看看
Ⅵ 手把手教你学单片机课后习题答案:关于用定时器着流水灯程序
在51单片机开发板上,用定时器做了一个流水灯程序,调整非常灵活,很实用拿出来和朋友们一起分享#include<reg52.h>,这是一个左右循环的程序,如果想要其他花样只需改变数组里元素排列顺序即可,很好玩的,也很简单。
Ⅶ 单片机是如何,学习更有效.
学习单片机的最有效方法
对一个初学单片机的人来说,如果按教科书式的学法,上来就是一大堆指令、名词,学了半天还搞不清这些指令起什么作用,能够产生什么实际效果,那么也许用不了几天就会觉得枯燥乏味而半途而废。所以学习与实践结合是一个好方法,边学习、边演练,循序渐进,这样用不了几次就能将用到的指令理解、吃透、扎根于脑海,甚至“根深蒂固”。也就是说,当你此次学习完某几条指令后(一次数量不求多,只求懂),接下去就该做实验了,通过实验,使你感受刚才的指令产生了控制效果,眼睛看得见(灯光)、耳朵听得到(声音),更能深刻理解指令是怎样转化成信号去控制电子产品的。说句过分的话,单片机与其说是学出来的,还不如说是做实验练出来的,何况做实验本身也是一种学习过程。《电子制作》2003~2004的《手把手教你学单片机》讲座就是基于这样一种边学边练的理念展开的,从众多的读者反馈来看,效果特别好,许多读者经3~6个月的学习已能开发简单的产品了(如霓红灯广告牌控制、累加计数器等)。
学习单片机要合理安排学习时间持之以恒
学习单片机可不能“三天打鱼、二天晒网” ,要有持之以恒的毅力与决心,学习完几条指令后,就应及时做实验,融会贯通,而不要等几天或几个星期有时间后再做实验,这样效果不好甚至前学后忘。另外要有打“持久战” 的心理准备,不要兴趣来时学上几天,无兴趣时凉上几星期。学习单片机很重要的一点就是持之以恒。
学习单片机要使用循环学习法使之根深蒂固
《手把手教你学单片机》讲座入门起点低,很多朋友觉得好学、易学,很快就能将讲座从头至尾学完、学懂,但过了几个月,在开发产品时对指令的具体作用就有些淡忘了。根据现代科学的研究,对只短暂学过一遍的知识,充其量只比浮光掠影稍好。因此,较好的方法是,过一段时间后(1~2个月)再重新做一遍,这样反复循环几次就能彻底弄懂消化,永不忘却。有道是:若人生能细看《水浒传》10遍,那么里面的故事内容、人物场情将永生不忘。
学习单片机要进行适当投资购买实验器材及书籍资料
单片机技术是一门含金量高的技术,一旦学会后,它给你带来的效益回报当然也高,无论是应聘求职还是自起炉灶开厂办公司,其前景是光明无限。因此在学习时要舍得适当投资购买必要的学习、实验器材,另外还要经常去科技图书店看看,购买一些适合自己学习、提高的书籍。总之,春天不播种哪来秋天的收获?考虑到初学者的学习成本,《手把手教你学单片机》讲座主要采用“程序完成后软件仿真→单片机烧录程序→试验板通电实验”的方法(现在的快闪型单片机其程序可烧写1000次以上),而没有采用价格昂贵的在线仿真器(ICE)进行实验,这样整套实验器材(不包括PC机)只有几百元,对大部分已工作的爱好者来说都有这个经济能力承受。一旦当你掌握了单片机的编程技术,成为一个水平较高的单片机设计人员时,再买在线仿真器也不迟。
准备:
单片机烧录器
单片机仿真器
单片机(89c2051,便宜)
软件(Keil)
1、先找本单片机入门的书来看,对于寄存器不必很深的了解
2、照书上的电路图搭好电路(复位、晶振、IO……)
3、将书上的范例程序烧入单片机跑(或者仿真,看程序运行)
4、当你做完IO流水灯实验、串口收发数据实验,再回去看书,能有更深的体会。
5、高级应用的书,或者做更多的东西~~
Ⅷ 51单片机流水灯实验(我用的是手把手教你学单片机的教程)
呵呵,这个延时有点长哦,有10S,你耐心再看看,有没有变化,如果再没变化,你可以软件仿真一下那个i变量。看他是不是能加到10000,。还有,学51单片机的话建议你去学 郭天祥十天学会51单片机 那个很不错。希望采纳
Ⅸ 我是一名在校大学生 想学习单片机
书可以先不看,那些理论也不用去管它,
学单片机最主要的是动手,
只要你揭破了单片机神密的面纱,其实很简单,一个月就可以学会了,
至于多媒体的教学材料我想也没有多大作用.
自己先用万能板或者热转印弄个最简单的电路,就点亮一个灯,然后熄灭就行了.你就能感觉到原来这就是单片机.
记住:动手,看人家的程序,再动手!
有一个周传功(好像是这个名字)的<<手把手教你学单片机>>系列教程挺不错的,找找看.
Ⅹ 手把手教你学会单片机,宋雪松老师的简易计算器,怎么用普中科技单片机实现怎么接线
/* 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();
}
}