jade1988 发表于 2012-4-21 13:01:38

大学初学51时总结的,适合刚入门的;

本帖最后由 jade1988 于 2012-4-21 12:42 编辑

大学时学51时记下的,笔记本已经烂了准备扔了,把里面的内容感觉重要的打上来,内容比较乱比较杂,不对的地方大家指出来;

边看电影边打得,《男人四十》;林嘉欣长的好漂亮啊;



中断程序不需要声明;

中断响应条件:1,中断源有中断请求 2,中断允许位为1 3,CPU开总中断;

子程序调用带参数声明时,类型必写,变量随便;函数体写在主函数前不需要声明;

注意uchar的范围0-255;

检测单片机是否正常工作:ALE是否为晶振频率的1/6方波;

晶振正常工作时,引脚处为正弦波;

EA引脚:内外ROM的选择,一般接VCC,不接时无法正常工作;EA=0时,P3只能当做普通IO使用;

IO口做输入时,之前先需要写1;

复位后,P0-P3寄存器为FF,其他寄存器一般为清零;

一个工程中可有多个C文件,但是main还是只能有一个;

按键两端并电容可以实现硬件消抖;

定时器工作设置:1,初始化:对TMOD赋值,确定T0.T1工作方式 2,计初值,写入TH0,TL0,TH1,TL13,中断设置,对IE赋值,开放中断 4,启动

定时器,TR0/TR1置1;

数码管使用时注意消隐;按键使用时注意消抖,松手检测;

数组声明时,前加code会把数据放入程序存储器里面;(因为51的RAM很小)

DA转换器的性能指标:1,分辨率,eg:对于5V满量程,采用8位,分辨率则为5/256=19.5mv;2,建立时间,电流输出型DAC的建立时间短,转换为电压时可

加运放转换;

串行通信的传输:单工-单向; 半双工-分时双向; 全双工-同时双向;

中断程序过程:中断发生-中断响应-中断服务-中断返回;

51单片机中断最多就2级嵌套;52有四个中断优先级,即可实现四级中断服务嵌套:IE0(0),TF0(1),IE1(2),TF1(3),RI/TI(4)(都是硬

件自动置位的);

定时器/计数器工作原理:输入的计数脉冲有两个来源,一个是由系统的时钟振荡器12分频后送来,一个是T0/T1引脚输入的外部脉冲源,每一个脉冲来,计数器加一,加满

时再输入一个脉冲,计数器归0,使标志位置位,向CPU发出中断请求;

串口的工作设置:1,确定T1的工作方式(TMOD)2,计算T1初值,装载TH1,TH0 3,启动T1 4,确定串行口控制(SCON);串口是一个全双工的,通过SBUF寄存器,发生和接

收占用的是同一地址;

漏极开路--场效应管(压Vgs控流id) 集电极开路--三极管(流ib控流ic);在允许从信号源取较少电流时,应用场效应管,相反应用三极管;

头文件reg51/52区别:52比51多定义一个定时器T2,其他区别不大;

C51的数据类型扩充定义(与C不一样):sfr(16):特殊功能寄存器声明,sbit:特殊功能位声明,bit:位变量声明;

《》:位左移位右移,空位补0;& |:多字节相与相或;&& ||:一位相与相或;~:按位取反;

&与==优先级:&的优先级小于==,所以在判断时应为“(A&B)==0”;

异步通信:通信的发生和接收设备使用各自的时钟;传输速率:比特率是每秒钟传输二进制位数单位位/秒(bps);

串口通信时,距离应不超过15m,最高传输速度20kbps;逻辑1:-3~-15,逻辑0:3~15;

51:一个机器周期=6个状态周期=12个时钟周期;

检测51单片机晶振引脚是否工作:在没有示波器的情况下,可以使用万用表测量2个引脚的对地电压估计晶振的工作状态,一般情况如下:5V系统中,2脚的对地电压是 2V左右,且压差不大,如果出现引脚电压为0V

或者5V(VCC)表明晶振没有起振,需要检查连接可靠性或者更换晶振;

ISP:In system programming;

keil仿真时,如果更改代码,退出debug:改之后必须编译一下在debug;

电池的容量:放电电流*放电时间(以固定电流放电,测出电压终止时的放电时间)eg:600mah

看门狗:就是一定时器,mCU需要每隔一定时间输入一个信号(喂狗),给WDT清零,否则就会引起中断(复位);

红外线是一种通过红外线光速传输data的设备;

电池的记忆效应(以前的电池):假如手机电池具有600mah的电量,若在电量损耗到一半时充电,它就会记住这一特性,每当放电到300mah即停止工作,必须重新充电;

DSP:1,digital signal processing2,digital signal processor;

OEM:原始设备制作商;

对于0805封装:0.08in*0.05in-----0.08*1000mil=0.08*25.4mm = 2mm ;

SPI缺点:没有流控制机制,也没有应答机制确认是否接收到数据;但是速度快;

PCB:按住ctrl选择一条线,其他部分变暗,只有与其相连的net变高亮;

在绘制原理图库的时候,放置引脚时,应注意引脚的哪一头放外(带四个小白点的一头放外 )以防止电气连接不上;

如果原理图库中的元件修改了,原理图中的元件不会立即修改,可以点开 SCH Library鼠标右键点击元件选择 Updates Schematic sheets;

在编辑 PIN 引脚的 display name 时,如果想让字母上面出现横线,则在字母的后面打上 \,例如 R\S\T\;

设置左边边栏中 Files 和 Projects 弹出和隐藏速度的设置:选择 Preferences —— System—— View —— Popup Panels 里 面;

当打开多个工程文件时可使用 Ctrl+Tab进行窗口之间快速切换;

每次打开工程的文件时都会出现报告,可以设置不让其显示,在Preferences —— PCB editor —— general 里面设置;

在 protell 99 中网络报表( NET )的生成不可以省略的;

引线式电容用于低频,贴片式(集成电感比引线式小很多)电容用于高频;

PCB布线时,布像RAM ROM 那样有多条地址线数据线的时候,可以选择一次布完,首先选中要布线的焊盘(按 Shift 重复选择)之后选择Place选择MultipleTraces ,之后选择一个焊盘(按,增加线间距按。减小)

要想设置工具栏中显示哪些不显示哪些可以在 View —— Toolbars 中 设 置;

集成库是将PCB库和原理图库组装在一起,只能通过在原工程中改变其内容,别人在没有进入原项目的时候只能调用其中的元器件,比如AD自带的集成库MiscellaneousDevices.IntLib 可以在Project里面打开修改,但在

Library里面调用时却Edit不了;

当想画除 45 度的其他线时,可以按 shif t+space,分别按下 Ctrl 和 Shift 移动元器件实现延长和复制;

把ad的PCB文件另存为protel可以打开的文件格式:PCB3.0/4.0;

在layer stack manager 里设置多层板参数;多层原则:使用同一类型的电源和地网络的元件应尽量集中放置,便于内电层的分割;AGND与DGND尽量分开,每个信号层都与一个内电

层平面紧密耦合,主电源与DGND平面紧密耦合,中间信号层midlayer介于两地之间可用于布高速信号;

AD中封装制作时位置需要注意: edit---set reference----location,否则导入PCB时容易出错;

铺铜时如果选择了 Pour over same net polygons only 导线还有Fill将与整个铜分开,同样 Net但分开,选择Pour over all same net objects将会把他们融合;

想要查看每个元件的 PCB 封装时,可以在 Tools —— footprint management 面查看,不用每个依次看;

设置只让一层显示可以右键单击层的选择栏选择 Layer Display Option —— Single LayerMode ,快捷键Shift+S;

如果过孔为盲孔或半盲孔,那内孔的颜色是起始和终止层面各占半个圆,以表示过孔所连同的层面;

当一个引脚多的元件可将其分成几个part,这几个part共用一个封装,可在不同的sheet中放置;

AD分割内电层:不像99中那样,直接选择Place--Line 就可以,在分割的内电层中,跟PCB背景板颜色不一样的表示其最终被腐蚀掉(包括画的 Line ),一个被分割的内电层不应该在包含其他分割内电层的网络,对于

不在分割内电层上方的相同网络只有在信号层使用导线连接到此分割层的上方,中间内电层填充的 fill 实际上是被腐蚀的区域,对于霍尔元件或者高频部分元件(其下面的内电层是不进行铜膜填充,用fill填充;

当走线很细且非常密集时,可以不对导线焊盘进行添加泪滴操作;

当想找到原理图中的元件在 PCB 中的位置时或者想找到 PCB 中的封装在原理图中的位置时,可以使用 Tools —— Cross Probe;

层次电路图中(顶层电路)绘制时,port连接时,一个port上有多个netlabel用bus,一个则用wire;

布局时可先隐藏元件之间的预拉线,并隐藏元件的标着,view--connections-hide....;

对于内电层的分割:design---split planes;

对于刚做出来的PCB或焊接好的PCB:首先可以检查的就是VCC和GND之间电阻大小;

布线时:晶振离CPU近连线短,以减少噪声的耦合程序;使用地线将时钟电路与其他器件隔离;避免有其他层有信号从时钟电路下穿过;晶振与CPU连线要细;信号线经过的过孔要尽量少,关键的地方要加上泪滴;关

键的信号线在两边加上地线隔离,或者大面积铺铜;信号线避免经过电源转换电路;像CAN总线等差分信号保持在同一层上,尽可能平行,做到等长;相同类型的信号线,如地址,数据总线按成组平行的方式分布,尽

可能保持等长;

去(退)耦电容:针对输入信号,在电源和地之间,2个作用:1,集成电路蓄能(buffer)作用 2,旁路该器件的高频噪声;

高频不用电解电容:其是两层薄膜卷起来的,这种结构在高频表现为电感特性;

CMOS器件的最低高电平为3.5V,为了防止静电损坏,不用脚不能悬空,一般接上拉电阻;

电脑USB:5V-500ma;当外设功率大于2.5W,因使用外接电源;

角位移步进电机:脉冲的个数控制位移量,脉冲的频率控制速度和加速度;

一般的硅三极管导通时,be结电压0.7V,CE结电压则在0.3V左右或者更小;

电感与电容组成LC谐振回路,其作用:调谐,选频,震荡,阻流及带通(带阻)滤波等;

发光二极管导通电压1.7V所以一节1.5V电池不能点亮发光管,对于指针万用表,R*1和R*1k不能测试发光管,而R*10k使用9V则可以;

对于USB转并口只有一个打印功能,不能当成普通并口使用;

一般三端集成稳压电路的最小输入、输出电压差约为2V,否则不能输出稳定的电压,一般应使电压差保持在4-5V;

新买的电烙铁先要用万用表电阻档检查一下插头与金属外壳之间的电阻值,万用表指针应该不动。否则应该彻底检查;

干簧管 :干簧管是一种磁敏的特殊开关。它的两个触点由特殊材料制成,被封装在真空的玻璃管里。只要用磁铁接近它,干簧管两个节点就会吸合在一起,使电路导通;

压敏电阻:压敏电阻用作电路的过压保护,将压敏电阻和电路并联,其两端电压正常时电阻值很大,不起作用。一旦超过保护电压,它的电阻值迅速变小,使电流尽量从自己身上流过;

大伯嗑药 发表于 2012-4-21 14:17:32

支持well done

lcofjp 发表于 2012-4-21 14:21:02

总结了不少东西啊,有心的主啊,我从来都不记笔记,脑子里的东西太乱了。

huang331857001 发表于 2012-4-21 14:31:35

刚开始学单片机,谢谢楼主的资料

hellohaitong 发表于 2012-4-21 15:57:04

谢谢楼主的分享

niaiwma003 发表于 2012-9-15 01:45:53

好,刚开始学单片机,谢谢楼主的资料

q102241940 发表于 2012-9-15 23:00:03

谢谢楼主

笑谈 发表于 2012-9-17 08:55:36

MARK......

mixiegen 发表于 2012-9-19 14:23:11

脚踏实地好啊

bajie_zhl19 发表于 2012-9-19 15:08:56

mark一下马上就要学了~

zjk 发表于 2012-9-19 17:08:16

{:loveliness:}不错,很适合入门看看

zy0818 发表于 2012-9-20 02:17:56

精简~~~

polun2011 发表于 2012-9-20 08:01:24

楼上说的好~~~

liujingbin 发表于 2012-9-20 15:41:54

{:3_52:}谢谢

wjrong168 发表于 2012-9-20 20:03:38

记笔记是个好习惯

dingshidong214 发表于 2012-9-20 20:50:39

很有心的学生{:smile:}

小开 发表于 2012-9-20 23:36:36

好家伙,总结的好

biqi 发表于 2012-10-18 10:56:17

学习。{:loveliness:}

tonyone 发表于 2012-10-18 21:14:32

不错{:smile:}

hamipeter 发表于 2012-10-19 00:30:40

支持下!!

jngong 发表于 2012-10-19 19:48:24

元芳,你怎么看?

r166 发表于 2012-10-19 19:53:37


谢谢楼主的分享

hwdemtv 发表于 2012-10-20 08:58:28

LZ学习 很有心 学习了

yoz 发表于 2012-12-6 19:25:29

谢谢分享

安逸不易 发表于 2012-12-22 17:18:32

不错,谢谢分享!

ommanipadmehum 发表于 2012-12-22 20:19:36

楼主笔记好多呀!!!

qijun 发表于 2012-12-22 20:59:34

记笔记是个好习惯

51hubao 发表于 2012-12-22 22:22:51

总结的真好啊,谢谢楼主

51hubao 发表于 2012-12-22 22:26:56

我有个问题,用keil写51程序时,先定义变量比如 int a;再初始化P2口,比如,P2 = 0xff;这样编译时候正确,但是把两个的先后顺序换一下,就提示编译错误,不知道为什么

bh7nly 发表于 2012-12-23 17:07:17

51hubao 发表于 2012-12-22 22:26 static/image/common/back.gif
我有个问题,用keil写51程序时,先定义变量比如 int a;再初始化P2口,比如,P2 = 0xff;这样编译时候正确 ...

void mian(void)
{
    int a;
    P2=0xFF;
}

void main(void)
{
P2=0xFF;
int a;
}

好行没啥区别。

51hubao 发表于 2012-12-24 13:20:31

bh7nly 发表于 2012-12-23 17:07 static/image/common/back.gif
void mian(void)
{
    int a;


你试着编译一下,
void mian(void)
{
    int a;
    P2=0xFF;
}编译通过
但是
void mian(void)
{
    int a;
    P2=0xFF;
}提示错误 "错误 C141: syntax error near 'int' ”   和 " 错误 C202: 'a': undefined identifier”

lourrr 发表于 2012-12-27 19:40:52

楼上那个问题我也发现了。。一般当经验总结记住就好。
另外lz总结的不错,不知有没更多

灰色头像1 发表于 2012-12-27 20:45:07

看看
{:smile:}

CANSTAR 发表于 2012-12-27 20:47:40

LZ是有心人。

lmt50211 发表于 2012-12-28 11:07:20

楼主做笔记的习惯好。我就不爱,有时候很简单的东西也要上网查查。

dexidz 发表于 2012-12-28 22:51:45

51hubao 发表于 2012-12-24 13:20
你试着编译一下,
void mian(void)
{


变量声明要放前面,这不该有疑问啊!?

51hubao 发表于 2013-1-4 16:21:25

dexidz 发表于 2012-12-28 22:51 static/image/common/back.gif
变量声明要放前面,这不该有疑问啊!?

这是明确规定吗?给I/O口赋值和声明变量的顺序前后有什么区别呢,我认为互不影响啊

dexidz 发表于 2013-1-4 17:15:07

51hubao 发表于 2013-1-4 16:21 static/image/common/back.gif
这是明确规定吗?给I/O口赋值和声明变量的顺序前后有什么区别呢,我认为互不影响啊 ...

我菜鸟都算不上,算没入门吧!
我也没找到关于如何在内部声明局部变量,(也就是明确规定是什么)但我做了很多例子,局部变量放在最前面就没错,放在下面或别的地方就会出错。
于是我就确定声明放在前面。

wb156351 发表于 2013-1-7 18:12:42

有几个总结的不错

wzd5230 发表于 2013-1-9 22:37:12

很多细节还是值得看的!

yang476905763 发表于 2013-1-10 20:32:27

新人顶个

michrome 发表于 2013-1-10 21:02:05

{:smile:}{:biggrin:}{:biggrin:}{:biggrin:}{:biggrin:}{:biggrin:}

zh3251241 发表于 2013-1-12 22:37:02

多谢楼主的经验,少走弯路

flywater 发表于 2013-1-14 11:15:30

51hubao 发表于 2012-12-24 13:20 static/image/common/back.gif
你试着编译一下,
void mian(void)
{


这和编译器有关,
在编译时,编译器会先为所有你所定义的变量分配空间,
接着对变量进行初始化,
然后再调用汇编器,连接定位器等不同模块。
你把变量定义定在程序代码后面,编译分配变量空间时就没被考虑到,所以会在后期的汇编过程中提示变量未定义,
同样,你在编译器调用汇编模块过程中有定义变量代码,这些代码是不被识别的,所以会出现 syntax error 错误。

C++或上位机程序中是可以被这样定义的,这和编译器有关,因为51编译器在为变量分配空间时,只搜索了函数入口处至第一行程序代码前的范围,而不象上位机程序的编译器是搜索全部代码,所以会有这种问题存在,不过这对我们来说并无大碍,

破破破东风 发表于 2013-1-14 21:52:25

楼主辛苦了

xiaosongj210 发表于 2013-1-16 13:15:34

很宝贵的经验笔记啊。。

路过羊圈的狼 发表于 2013-1-16 15:49:51

看了下,学到了不少东西。感谢分享。

xuxer110 发表于 2013-1-16 22:30:47

{:lol:} {:lol:}

51hubao 发表于 2013-1-17 21:38:39

flywater 发表于 2013-1-14 11:15 static/image/common/back.gif
这和编译器有关,
在编译时,编译器会先为所有你所定义的变量分配空间,
接着对变量进行初始化,


你总结得真好,茅塞顿开,谢谢,哈哈

我惯的女人 发表于 2013-1-19 08:40:17

lourrr 发表于 2012-12-27 19:40 static/image/common/back.gif
楼上那个问题我也发现了。。一般当经验总结记住就好。
另外lz总结的不错,不知有没更多 ...

看看就行了了,还是自己总结的好。真正体会过再总结才会有感觉。(只有laopo是别人的才好)

jade1988 发表于 2013-1-19 22:56:33

本帖最后由 jade1988 于 2013-1-19 22:58 编辑

楼上说的不错,总结还得靠自己,自己总结的才能更理解,我总结的东西还有很多,这只是很小一部分,不过发上来你也只是硬背一下而已,人总的靠自己!

技术也不值钱,你发出来的东西别人的评价褒贬不一,还不如自己闷着学呢,提前祝顶帖子的新手新年快乐!新的一年大家一起努力学习!

soul5808 发表于 2013-1-22 11:05:07

{:loveliness:}{:loveliness:}{:loveliness:}{:loveliness:}

sss 发表于 2013-1-27 05:05:45

谢了!楼主!

cnjimchen 发表于 2013-2-28 17:23:12

新手,学习了

zjsdlt2013 发表于 2013-3-3 20:19:18

作笔记是个好习惯,方便巩固复习,谢谢你的分享,值得好好的看几遍。

xslff 发表于 2013-3-3 21:50:42

好东西,好习惯。

nsj21n 发表于 2013-3-7 12:39:10

都是精华啊,不错!

chenqi4332103 发表于 2013-5-6 16:18:38

又学习了 {:loveliness:}

a794001114 发表于 2013-5-6 17:55:46

mark            

小德GD 发表于 2013-5-6 17:59:03

好像我高三{:lol:}

ZTE_rain 发表于 2013-5-7 08:16:48

感觉看郭天祥老师的十天学会单片机更直观。。

思博 发表于 2013-5-7 14:19:00

楼主 辛苦了

喜羊羊 发表于 2013-5-8 16:12:21

51hubao 发表于 2012-12-22 22:26 static/image/common/back.gif
我有个问题,用keil写51程序时,先定义变量比如 int a;再初始化P2口,比如,P2 = 0xff;这样编译时候正确 ...

C语言中,要在函数开头把用到的变量定义好,然后才能用,C++中就支持在语句中变用变定义了。

活出自我 发表于 2013-5-8 16:34:03

谢谢楼主分享!经验无价。

zhujunjiejuan 发表于 2013-5-8 17:55:43

谢谢楼主分享经验。
页: [1]
查看完整版本: 大学初学51时总结的,适合刚入门的;