第一篇:MSP430单片机学习心得总结
改变CCS字体方法:
perferance>General>Apperance>Colors and Fonts >Basic>Text Font
将c语言编译成汇编语言之后执行。如果c语言结构不好,则编译后 会出现编译成汇编后代码冗余,使得执行效率不高。
板子有可能与电脑连接出问题,可以拔下重插一次。
在单片机内部flash存储空间有剩余时,可以用于数据存储空间,并且可以使用单片机程序进行数据管理。POR PUC是复位信号
看门狗定时器溢出发生复位 复位时设置如下:
1.RAM堆栈的指针指到最顶端 2.初始化看门狗 3.初始化外设 GIE是总中断
具有欠压复位功能 工作电流小于20UA 待机电流小于0.8UA 4个特殊功能寄存器 R0是PC指针 R1是堆栈指针 R2是状态寄存器 R3是常数发生器
12个通用寄存器R4-R15 27条内核指令 24条仿真指令 7中地址模式 无累加器
三个时钟:
ACLK辅助时钟:频率较低,低速外设 MCLK是主时钟,CPU运行的时钟,高频 SMCLK是次主时钟,高速外设
DCO是数字震荡控制器1M 8M 12M 16M共4个级别,可以通过 内置数据进行设置
内置VLO低频振荡器,频率为4-20khz。所以可以通过DCO进行分频 Timer_A频率可达系统振荡频率,用于定时器时,最小单位时间 是20ns 2553的电阻有0~15共16中。用RSEL选择。RSEL与DCO配合,值越大 频率越大。
LF是外接时钟
USART支持UART、SPI 共2种通讯方式 USCI支持 UART、I2C、SPI 共3种通讯方式
关于变量:
static变量是对于局部变量而言,如果不定义成静态变量,则 每次执行时都会被重新初始化,静态变量则不重新初始化。全局变量和静态变量是存储在RAM中的。
extern是外部变量,即将一个文件中的变量在另一个文件中 使用。如在文件1中声明了变量z,在文件2中声明extern int z 就可以使用文件1的z I/O口赋值方法与C51中的相同,可以使用OXxx或OXxxxx赋值。对P管脚整体赋值是对寄存器的赋值操作
BIT0,BIT1,BIT2,BIT3分别表示二进制的第一位,二位,三位为1,四位为1.表示0x01,0x02,,0x04,0x08.P1OUT|=BIT1,是除了第一位的寄存器值被改变,其他位的值 都不变,这样可以防止对其他位做了误操作。
关于逻辑操作:
&0xff与|0x00则不改变原值
^BIT0分为^0和^1,^1则每次之前的状态都改变,^0则每次之前的 状态都不变。因此^BIT0表示^0x0001,即前15位都不改变状态 只有最后一位翻转,可以用于位翻转操作。
<<移位操作经常用于数值计算以及某些循环操作。左移n位表示 *2^n.必须先对需要的未进行输入输出设置,之后才能进行读写操作。
模数转换器具有14路输入。
定时器与比较器配合,可以得到某个时间函数,如果知道了某 物理量随时间的变化规律,就可以进行测量。
利用定时器和RAM等存储数据的模块或数组,可以实现任意PWM波的 产生,再利用电容的充放电作用可以模拟出任何的周期性波形,方 法如下:定时器赋初值,启动定时器,计数停止后进入中断,在中 断中将下一个要计的时间加在初值上,继续计数。如此循环。每次 进入中断时都翻转一下输出电平。定下某个循环的次数作为一个大 周期。
P口要选择作为I/O口还是作为寄存器,选定后还要在方向寄存器中 确定是输入还是输出。
PXDIR为0时,要使用PxREN进行上拉下拉操作,上拉则默认输入是高 电平,下拉则默认是低电平。如P1REN|=BIT0;不操作时都默认为下拉。可以在P1REN寄存器里找到各位状态。
上电后P1DIR全部为0,即输入状态。P1OUT 的7~1都是1,p1.0是0.P1IN 的P1.1 P1.2为高,其他为低。
在使用时应该先分清自己是要输入还是要输出,然后可以根据需要 使用P1REN调整初始状态。
I/O口作为输出时,如果输出寄存器P1OUT是高,则对输入寄存器PIN 有影响,会直接将P1IN寄存器变为高电平,这就是那位学长说的要 注意的问题,要尽量避免,如在进行初始化时P1OUT =0X00;不应该 利用这一现象,这不正宗。
I/0口的中断注意事项:
1.寄存器名称根据芯片的寄存器名称设置,2553是IE1,IE2,不是 P1IE,P2IE(要以调试时的寄存器为准,不要看头文件中的。)2.IE1为1是开中断,不要搞反了
3.将需要的端口的PxREN置1,即接上拉电阻。4.标志位要软件清零
5.逻辑判断时要加括号,否则不能执行
6.不必局限于头文件中宏定义的OFIE,OFIFG等,P1,P2的所有管脚 都可以独立中断。可以独立设置。
7.PxSELx只要置1,那么中断就自动禁止,不管PxIE是什么
不同的编译软件的寄存器名称不一样,设置时需要根据实际的进行 设置,否则寄存器无效。!!!!!
定时器是CCR0,CCR1,CCR2,CCR0的优先级最高,并且返回时不要 软件清除中断标志位,是自动复位的(相当于51的8位自动重装 定时器)。其他定时器必须软件清除中断标志位。CCR0,CCR1都是 计数值,相当于51的TH0,TL0.TH1,TL1.关于定时器的连续工作模式和增计数模式????????
数据段的数据个数一般要超过256个才能通过8路AD转换。
MCLK的频率等于机器频率,每一个周期都能够完成一个基本操作。一个指令周期等于1-6个机器周期,根据指令而定。可以参照MSP430 时钟设置及其总结一文。ACLK用于低速外设 MCLK用于CPU SMCLK用于高速外设
注意对寄存器进行位设置时的语法,可以是x|=a+b+c...x表示寄存器名称,a,b,c表示寄存器的位名。
多机USART通信时,数据格式为 :起始位 地址 停止位 起始位 数据 停止位 起始位 数据 停止位。。,其中在空闲模式下,连续10个
以上高电平表示空闲,在此之后的一定是地址帧。在10个之内的一定 是数据帧。
看某种类型变量是几位时,可以用使其溢出后自动赋值的方法来得到。
进入中断要有以下几条语句:
_BIS_SR(LPM4_bits + GIE);
// Enter LPM4 w/interrupt,写在主函数中 #pragma vector=PORT1_VECTOR __interrupt void Port_1(void){ }
简易延时要把延时数据定义成全局变量。
串口接收部分的软件设置包括对错误数据的处理 和对地址、数据的判断及处理两个部分。如果是正确的地址帧,则自动唤醒单片机,RXWAKE置位(只针对地址有效),如果URXWIE 软件置位则可以进入地址中断服务程序,进行 匹配。
GIE是全局中断,_BIS_SR(LPM1_bits+GIE);通常这样用。
串口通信中的中断使能寄存器是IE2,书写并 不复杂。标志位寄存器是IFG2。写入发送缓冲器时使得标志位复位,发送缓冲器写入移位寄存器后标志位置位。在发送中断打开的情况下会进入发送中断。响应 发送中断后标志位自动清零。不响应中断则不会 自动清零,需要软件清除。
(并不需要在发送中断中将标志位复位,因为 如果有继续发送的数据会在写入发送寄存器 时自动使得标志位复位。)
接收时收到完整字符并进入接收缓存后接收标志 置位。响应接收中断或读取接收缓存后使得标志 复位。
无论是软件设置标志位置位还是由于接收或发送 产生的标志位置位,都可以进入相应的中断。2553的串口中没有ME1,ME2寄存器,即没有 串口使能寄存器。有中断使能寄存器IE1,IE2.功能不同。
全局变量可以被任意模块改变。累计改变。
RXWAKE是可以进行检测的标志位,在地址多机 模式下,收到的字符地址位置位则唤醒。在空闲 模式下,接收到字符前检测到线路空闲则唤醒。唤醒了则表示接收到的字符是地址。
芯片所有的寄存器在头文件中都有解释,即 SFR_8BIT();芯片总中断: _EINT();
在写入发送寄存器时要检测是不是空闲,即检测 UCA0TXIFG是否置位,可以用 while((IFG2&UCA0TXIFG)==0);
头文件的定义与调试中寄存器界面的顺序是一样的
UCSWRST位置位,将使UCRXIE,UCTXIE,UCRXIFG,UCRXERR,UCBRK,UCPE,UCOE,UCFE,UCSTOE 和 UCBTOE 位复位,UCTXIFG 位置位。(这就可 以解释为什么以上点之后就可以进入发送中断)清除UCSWRST 将释放 USCI,使其进入操作状态。
数据接收中断的优先级最高
f/波特率 其实就是每个数据位采样的次数,因此 不应该小于3.定时器连续模式用于产生给定的时间间隔.通过 中断实现。是比较模式,不需要设置输出模式。
#pragma vector=TIMER0_A1_VECTOR是定时器中断 和CCR1~CCR4中断向量。具体是哪些还要看头文件 中的解释。如:
#define TIMER1_A1_VECTOR(12 * 1u)
/* 0xFFF8 Timer1_A CC1-4, TA1 */表示CCR1~ CCR4以及TA1.#pragma vector=TIMER0_A0_VECTOR是CCR0中断 向量。
定时器增模式:产生PWM波(比较部分)
定时器连续模式:产生间隔中断处理一些事情,也可用于键盘扫描,产生PWM波等(比较部分)定时器增减模式:产生对称的波(比较部分)
定时器连续模式:结合捕获到的TACCRx来测 量时间间隔、频率、速度等(捕获部分)
以下是地址多机模式发送字符的函数格式: void sendchar(unsigned int address){
unsigned int i;
UTCTL1|=TXWAKE;
TXBUF1=address;
while((UTCTL1&0X01)==0);
UTCTL1&=~TXWAKE;
for(i=0;i<=6;i++)
{
TXBUF1=Data[i];
while((UTCTL1&0X01)==0);
} }
下位机(五个149)其中一个地址位为0x01的149接收上位机数据的程序为:
/*************************************************/
/*说明:UART点对多点多机通信主机程序。
*/
/*UART以9600bps,8位数据,1位地址,1位停止模式发送。
*/
/*当地址位为1时判断地址,确认呼叫,接收后续字符串,并检查结束0。*/
/********************************************/
#include
//定义从机的地址位 unsigned char j1,count1=0;char Data1[20],Buffer1[20];void InitRS_SLA1(void){
UCTL1&=~SWRST;//SWRST复位,USART允许
UCTL1=CHAR+MM;•//8位数据位,1位停止位,地址位模式
URCTL1|=URXWIE;//只有地址字符使URXIFG置位
UBR01=0X03;
UBR11=0X00;
UMCTL1=0X4A;
•//使用32KHZ晶振时,波特率为9600bps
UTCTL1=0X10;•//选定ACLK(32KHZ晶振)为时钟源
ME2|=0X30;
//UART1发送及接收模块允许
P3SEL=0XC0;• //P3.6,P3.7被UART1发送模块占用
P3DIR=0X40;//P3.6输出,P3.7输入
IE2|=URXIE1;• //接收中断允许 }
interrupt[UART1RX_VECTOR] void UART1RX(void){
if(URCTL1&URXWIE)//接收为地址方式时,等待正确地指出现
{
if(RXBUF1==ADDRESS1)//地址正确,改变接收为数据方式,准备接受
{
URCTL1&=~URXWIE;
count1=0;
}
}
else
• //接收为数据方式时
{
Data1[count1]=RXBUF1;//数据存入Data数组中
if(Data1[count1++]==0)//是否到达末尾
{
URCTL1|=URXWIE;//改变接收为地址方式
for(j1=0;j1 Buffer1[j1]=Data1[j1];//复制字符串 } } } 最新发现:UCDORM相当于URXWIE,即只有地址 才能使得RXIFG置位,UCTXADDR相当于TXWAKE,即下一个要发送的字符是地址。 UCDORM在接收程序中用到,UCTXADDR在发送程序 中用到。 ADC10中的INCH_x表示所用通道的最大标号。从这 里开始进行采样。ENC=0;则在一次转化结束之后 跳到通道都没设置的初始化状态,MSC=0;则一次 转化后跳到需要触发信号触发的状态。 ADC10:单通道单次转换 一次转化以及转化结果进入ADC10MEM期间应保证 ENC=1;否则转化结果不确定。在采样保持期间ENC 可以变为0,此时结束转化。 ENC和ADC10SC可以不在同一条语句中。可以先ENC 再SC 单通道单次转换在转化结束(由于转化结果出现 或ENC=0引起)则不进行下一次转换,跳转到最初 的采样通道都没有选择的情况。 ADC10:序列通道单次转化 必须置MSC=1,否则再一次转化完成后不会继续向 下一通道采样转化,需要重新给触发信号。就像 单通道单次转换一样。要把使用的通道选定 要把对应管脚的的复选功能打开 要软件开通各通道:ADC10AE0,ADC10AE1.因为序 列通道转换是从高A15向A0的方向采样的,由于并 不是这之间的所有通道都有采样的需要,所以要 使用通道开放功能,将需要采样的通道置1,不需 要采样的置零关闭。 ADC10:单通道多次转换 工作期间必须使得ENC=1;否则会在一次转化完成后 跳到没有定义采样通道的初始化位置。如果一次 转化完成后MSC=0;就不会继续转化,等待下一次 触发信号启动转化。 ADC10的停止方法: ①在单通道单次转换中,应检测到busy==0时令 ENC=0; ②在其他转换中直接令ENC=0;会在相应的多次 转化末时自动结束。 One-Block模式下直到所定义的一块的数据量被 传送完毕之后才会置标志位。 USCI包括USCI_Ax和USCI_Bx两个不同的模块,如果 同一模块有几个,则x从0开始编号。 I2C要注意master还是slaver,是发送器还是接收器 主从可以通过对UCMST编程确定,收发可以 通过对UCTR编程确定。 I2C自己的地址可以通过对UCBxI2COA(自己)寄存器编程确定,对于主机还可以把要访问的 芯片地址写在UCBxI2CSA。还可以指定对于 general call(广播)是否回应。 I2C可以选择低功耗模式,使用SMCLK,系统自动 在需要SCL时启动SMCLK,以达到降低功耗的目的 但是SMCLK在其他模块也在使用,启用或关闭就会 影响其他模块的功能,建议不使用自动低功耗。当芯片处于slave receive时,由于SCL由外部 芯片提供,所以可以工作在LPM4下。接受或发送 中断会唤醒芯片。 I2C有两个中断源,接收和发送共用一个中断向量,四种通信状态标志共用一个中断向量。收发中断 用于收发数据,状态中断用于识别通信格式。 (UCALIFG/UCNACLKIFG/UCSTTIFG/UCSTPIFG)以上四种状态中断与UART中的UCAxRXIFG接收中断 共用一个中断向量,数据收发与UCAxTXIFG共用一 个中断向量。 在接收到非应答或写入数据时UCBxTXIFG复位。可以在中断中使用循环,将数据一次性发送出去。也可以通过发送一个字节就退出发送中断,发送 结束后再次进入发送中断的方式多次发送。 从机可以将SCL拉低来暂时停止数据传输。 I2C作为主机接收数据:设置从机地址、发送起始 位,开通接收中断即可。发送起始位之后自动发送 从机地址,在从机应答后立即清除起始位UCTxSTT I2C作为主机发送模式:设置从机地址、发送起 始位,开通发送中断即可。发送起始位之后自动 发送从机地址。在发送起始位时立即置位发送标志 进入发送中断,可以把数据进行发送。,在从机 应答后立即清除起始位UCTxSTT 要在传送完某个字节的数据之后立即结束,应该 检测UCBxTXIFG是否置位,只有在置位之后发出 STOP,才能保证数据的完整传输和快速停止。 主机发送模式下,要停止数据可以在数据发送之后 立即发送停止位。在主机接收模式下,要停止数据 可以在接收完一个字节后发送非应答位和停止位。 看门狗在复位模式下不能使用LPM4.因为看门狗 总需要一个时钟源。在中断模式下各种低功耗模式 都可以使用 看门狗在复位模式下可以保证所使用的时钟源不受 低功耗模式影响,所以尽量不要选用SMCLK,否则 在低功耗时SMCLK不会被关闭。LFXT1CLK可高可低,高达400k—16Mhz,低至32768 XT2CLK 只能是400k—16Mhz VLOCLK是内部非常低的振荡器,可达12Khz。 ACLK: LFXT1CLK VLOCLK MCLK: LFXT1CLK VLOCLK XT2CLK DCOCLK SMCLK: LFXT1CLK VLOCLK XT2CLK DCOCLK BCSCTL3中当XTS=0时说明LFXT1CLK选择低频率,可以 选择32768HZ或VLOCLK的12Khz,这可以使用LFXT1Sx 来选择。10为VLOCLK,00为32768hz。ACLK默认使用 LFXT1CLK,且默认为32768。当VLOCLK选中后 LFXT1CLK会自动停止,直接使用VLOCLK作为ACLK.不同的低频需要选择电容,高频或外部数字信号不 需要选择电容。XCAPx=00;但是需要选择频率范围。 电容感测:先选择某些引脚具有电容感测功能,P1 的引脚连在TA0的计数器上,P2的引脚连在TA2.FLASH擦出操作时:先定义地址,再设置擦出模式,再解锁,在写数据。 5529: 管脚2组为一大组,P12345678...分为PA~PD...。所有的赋值时使用PA|=0Xxxxx的方式。仅仅对于 中断寄存P1IV,P2IV不使用PAIV的形式,对于输入时的上拉下拉选择已经明确,是否上下拉 由PREN决定,上下或下拉选择则用PxOUT决定,1为 上拉,0为下拉。 各中断的优先级为P1.0最高,依次向下递减。当管脚选择了复选功能,则中断功能立即失效。 SPI模式: 当接收的数据进入SBUF未及时读出即被覆盖,则 UCOE置位。 单片机学习心得 一直想写一个帖子,将自己学习单片机的经历、经验和方法总结一下,今天终于动手写了,呵呵,这是我学习单片机的经验、心得、方法。希望对大家学习单片机有所帮助。 经常在群、论坛里看到有人问:怎么学单片机?也常看到有人说学了好几个月可就是没有什么进展。当然,受限于每个人受到的教育水平不同和个人理解能力的差异,学习起来会有快慢之分,但我感觉最重的就是学习方法。一个好的学习方法,能让你事半功倍,这里说说我学习单片机的经历和方法。 05年的时候,因为制作FM发射采用了BH1415的芯片,需要用到单片机控制,所以开始接触使用单片机,虽然以前读书时作为一门功课学过,不过也快丢荒了10年了,基本上都忘光了,也算是从头学起了吧。我当时是买了一块实验板,很简单的功能,比论坛实验板还要少功能,还有一个仿真器,也是比较简单的,SST芯片的。然后开始从大家都知道的流水灯写起,万事开头难,第一个程序基本上就抄人家的,翻查了一份快速入门的学习资料,写下第一个程序。然后,在仿真机是单步的看运行结果,从每一步执行,都硬件上反应出来的效果,很快,对单片机的运作有了一个非常感性的认识,这跟只看书然后自己想象运行是完全两码事。然后,是进一步的其它程序学习,一个月时间,基本上已经熟悉了51的各种硬件资源。把流水灯,数码管动态扫描,中断等等的学习了,然后就是写综合性的程序,也就是我发在论坛里的时钟。通过这个程序的编写,使自己的编程水平有了很大的飞跃。之后,就是逐步学习编写更多的程序,各种外围器件的控制等等,通过编写程序使自己不断的提高。在学过汇编之后,我又转到了C语言学习,因为以前没有学习过C语言,一切都很陌生,所以自己沿用了学习汇编的方法,大约花了3天功夫基本就对C语言有了初步的了解,然后就是尝试写上面所说的时钟,以汇编程序的思路作为参考,以C语言来编写,花了几天功夫完成了这一程序,也实现了从汇编编程为主到C编程为主的转变。然后,就是以C语言编写外围器件的控制程序,以此来熟悉C的编程风格,一直到现在,基本上就是C语言编程,汇编已经是作为调试程序的辅助。 下面我概括了几点我的学习经验和心得体会: 1、万事开头难、要勇敢迈出第一步。开始的时候,不要老是给自己找借口,说KEIL不会建项目啦、没有实验板啦之类的。遇到困难要一件件攻克,不会建项目,就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少,总得建个项目,再配置一下项目,然后建个程序,加入项目中,再写代码、编译、生成HEX,刷进单片机中、运行。必须熟悉这一套工序。个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。单片机是注重理论和实践的,光看书不动手,是学不会的。 2、知识点用到才学,不用的暂时丢一边。厚厚的一本书,看着人头都晕了,学了后面的,前面的估计也快忘光了,所以,最好结合实际程序,用到的时候才去看,不必说非要把书从第一页看起,看完它才来写程序。比如你写流水灯,完全就没必要看中断的知识,专心把流水灯学好就是了,这是把整本书化整为零,一小点一小点的啃。 3、程序不要光看不写,一定要自己写一次。最开始的时候,啥都不懂,可以抄人家的程序过来,看看每一句是干什么用的,达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次,你会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。。当你自己能写出来的时候,说明你就真的懂了。。 4、必须学会掌握调试程序的方法。不少人写程序,把代码写好了,然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:为什么我的程序不能正常运行?然后就等别人来给自己分析。这是一种很不好的行为,应该自己学会发现问题和学会如何解 决问题。这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。这一个过程非常重要,通过程序的排错,你可以学到的知识是书上得不到的。 5、找到解决问题思路比找到代码更重要。我们用来控制周边器件,达到我们想到的目的,这是一个题目,而如何写出一个程序,来控制器件按你想要的结果去运作,这个就是解题的思路。要写程序,就得先找到解决问题的思路,你学会找出这个解题思路,比你找到代码更为重要。不少人很喜欢找人家的代码,有的人甚至有了代码就直接复制到自己的程序中,可以说,这不是一种学习的态度,无助于你编程水平的提高。我几乎不怎么看人家的代码,多数时候是看别人的思路,有方框图最好,没有的话文字说明也可以,要从代码中看出别人处理问题的思路,是相当困难的,特别是大型的程序,看起来是非常的累人,所以现在我也明白了,以前读书时说的程序流程图很重要,现在算是知道了。当你知道一个问题怎么去解决了,那么剩下的只是你安排代码去完成,这就已经不是什么问题了。举个例子:数码管动态扫描,没写过的初学者可能搞不清是怎么回事,其实,就是分时让每一时间段时只控制一只数码管显示数字,几只数码管轮流显示,由于速度很快,人眼的看起来是全部数码管都亮的。明白是这么一回事,事情就好办了,剩下的事情,无非是你安排让一只只数码管轮流显示出相应的数值。显示数字,然后延时一下,再下一只显示数字,延时,知道是这样,我们实际程序上只要做到这样就可以:往段口送段码,然后打开位选显示一只,延时一下,再关闭位选,再送出段码,再打开另一只位选..仅此而已。有了解决问题的思路,我们就能问题拆分开来,然后逐一的解决,如果动态扫描的原理都没懂,不知道如何做,那么这个程序是怎么也写不出来的。 6、开动脑筋,运用多种方法,不断优化自己的程序。想想用各种不同方法来实现同一功能。这是一个练习和提高的过程,一个问题,你解决了,那么你再想想,能不能换种写法,也可以实现同一功能,或者说,你写出来的代码,能不能再精简一点,让程序执行效率更高,这个过程,就是一个进步的过程。很多知识和经验的获得,并不是直接写在书让你看就可以得到的,需要自己去实践,开动脑筋,经验才能得到积累,编程水平才能有所提高。 7、看别人的代码,学习人家的思路。这个在学习初期是很有用,通过看别人的代码,特别是有多年编程经验的人写出的具有一定水平的代码,可以使自己编程水平得到迅速的提高,同时,也可以结合别人的编程手法,与自己的想法融合在一起,写出更高水平的代码,从中得到进步。但要注意,切忌将学习变成抄袭,更不是抄袭完了就认为自己学会了,这样做只会使你退步。 8、尝试编写一下综合应用的程序。从流水灯学起,到动态扫描,再到中断,那么,你可以试试写一下时钟这种综合性应用的程序,不要小看时钟,要写好它不是一件容易的事情,它包括了单片机大部分的知识,比如有按键(IO读取)、动态扫描(IO输出)、中断等,如何协调好各功能模块正常工作,才是编程者需要学习的地方,当你单独写一个功能的时候,比如按键读取,你可能感觉很容易,因为你的程序啥也不做,只是读按键。但把它和其它功能混合在一起,如何在整个程序运行中使每一部分都正常工作,这就不是写一个按键读取这么容易的事情,功能模块之间有可能会互相影响,比如你需要让数码管既能显示,又要去处理按键读取,怎么使这两部分都正常工作,这就是一个协调过程。当你有了这个处理协调能力,你就算是入门了。 9、着重于培养解决问题的能力,而不是具体看自己编写了多少代码或者做过什么。“学单片机重点在于学习解决问题的思路,而不是局限于具体的芯片类型和语言”这一直是我的座右铭,是我学单片机多年来感悟出来的。经常看到有人说“你会驱动XX芯片,真牛啊”“你搞过XX项目,真厉害”之类的话,其实这是非常片面的,搞过XX芯片,搞过XX项目,只能说明你做过这一项目,它只是你的业绩,并不是代表能力就一定高。真正的能力应该是:“遇到没有解决过的问题或器件,能利用自己已学的知识,迅速找到解决问题的方法。”这个才是能力。写程序的过程就是一个创造的过程,几乎没有完全一样的项目,每次你遇上的几乎都不相同,所以你拥有的必须是你面对新项目时的创造能力,而不是标榜着你以往做过多少项目。当然,业绩也能从另一侧面反映你的经验和水平。 10、如果有可能,多学习计算机专业的知识,比如数据结构等。这些是你解决问题的基础知识,你把这些知识应用得越好,就会发现越容易找到解决问题的方法,这就是为什么一个学计算机专业的人编的程序和一个非计算机专业的人编的程序有差异的原因。也是一个菜鸟进军到高手所要配备的知识。如果我们把编程分为宏观编程和微观编程,那么微观编程就是写具体的代码,比如控制某某器件的语句;而宏观编程就是如何对整个程序进行布局、安排,使功能模块以你想要的方式去运行,得出你想要的结果。如前所说“会控制XX器件”这些只能算是微观编程,能做到这一步还只能算是菜鸟级别,如果面对一个新的器件,你心里没底,没把握去写这个控制程序,那说明你还是一个初级的菜鸟。当你有了一定的编程经验,控制过相当数量的器件之后,你就会发现,控制器件这些工作都是相似的、重复的工作,体现不出编程的水平,最多也是写得好与不好的差别,只能算是一些小技巧的应用。而对整个程序进行布局、安排这些才是最头痛的事情,能达到宏观编程和微观编程都做好才是真正的高手。对于规模越大的程序,越能体现出这一点。 11、面对一个新项目时,多自己开动脑筋,不要急于找别人的程序。有不少人面对一个新项目时,第一步想到的就是网上找别人写过的代码,然后抄一段,自己再写几句,凑在一起就完成任务,这虽然可能是省时间,但绝对不利你的学习。当你接到一个新项目时,应该先自己构思一下整个程序的架构,想想如何来完成,有可能的话,画一个流程图,简单的可以画在脑子里,对程序中用到的数据、变量有一个初步的安排,然后自己动手去写,遇到实在没办法解决的地方,再去请教别人,或看别人是怎么处理的,这样首先起码你自己动过脑想过,自己有自己的思路,如果你一开始就看别人的程序,你的思维就会受限在别人的思维里,自己想再创新就更难了,这样你自己永远也没办法提高,因为你是走在别人的影子里。 12、多利用网络的搜索,学会提问题。一般来说,学习过程中,你遇上的问题,前人们多数也有遇上的,所以如果有什么不懂,在自己解决不了的时候,最好先到网上搜索一下,看能不能找到答案,找不到再到论坛里发问,发问也要有目的性,尽量简单明了的描述问题,让帮助你的人可以用最少的时间就看懂你说什么,毕竟人家帮助你是免费的,时间也是有限的。 以上就是我学习单片机的经历和心得体会,希望对大家会有帮助,说得有不好或不对的地方欢迎大家批评指正。 篇一:单片机学习心得 一直想写一个帖子,将自己学习单片机的经历、经验和方法总结一下,今天终于动手写了,呵呵,这是我学习单片机的经验、心得、方法。希望对大家学习单片机有所帮助。 经常在群、论坛里看到有人问:怎么学单片机?也常看到有人说学了好几个月可就是没有什么进展。当然,受限于每个人受到的教育水平不同和个人理解能力的差异,学习起来会有快慢之分,但我感觉最重的就是学习方法。一个好的学习方法,能让你事半功倍,这里说说我学习单片机的经历和方法。 05年的时候,因为制作FM发射电路采用了BH1415的芯片,需要用到单片机控制,所以开始接触使用单片机,虽然以前读书时作为一门功课学过,不过也快丢荒了10年了,基本上都忘光了,也算是从头学起了吧。我当时是买了一块实验板,很简单的功能,比论坛实验板还要少功能,还有一个仿真器,也是比较简单的,SST芯片的。然后开始从大家都知道的流水灯写起,万事开头难,第一个程序基本上就抄人家的,翻查了一份快速入门的学习资料,写下第一个程序。然后,在仿真机是单步的看运行结果,从每一步执行,都硬件上反应出来的效果,很快,对单片机的运作有了一个非常感性的认识,这跟只看书然后自己想象运行是完全两码事。然后,是进一步的其它程序学习,一个月时间,基本上已经熟悉了51的各种硬件资源。把流水灯,数码管动态扫描,中断等等的学习了,然后就是写综合性的程序,也就是我发在论坛里的时钟。通过这个程序的编写,使自己的编程水平有了很大的飞跃。之后,就是逐步学习编写更多的程序,各种外围器件的控制等等,通过编写程序使自己不断的提高。在学过汇编之后,我又转到了C语言学习,因为以前没有学习过C语言,一切都很陌生,所以自己沿用了学习汇编的方法,大约花了3天功夫基本就对C语言有了初步的了解,然后就是尝试写上面所说的时钟,以汇编程序的思路作为参考,以C语言来编写,花了几天功夫完成了这一程序,也实现了从汇编编程为主到C编程为主的转变。然后,就是以C语言编写外围器件的控制程序,以此来熟悉C的编程风格,一直到现在,基本上就是C语言编程,汇编已经是作为调试程序的辅助。 下面我概括了几点我的学习经验和心得体会: 1、万事开头难、要勇敢迈出第一步。开始的时候,不要老是给自己找借口,说KEIL不会建项目啦、没有实验板啦之类的。遇到困难要一件件攻克,不会建项目,就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少,总得建个项目,再配置一下项目,然后建个程序,加入项目中,再写代码、编译、生成HEX,刷进单片机中、运行。必须熟悉这一套工序。个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。单片机是注重理论和实践的,光看书不动手,是学不会的。 2、知识点用到才学,不用的暂时丢一边。厚厚的一本书,看着人头都晕了,学了后面的,前面的估计也快忘光了,所以,最好结合实际程序,用到的时候才去看,不必说非要把书从第一页看起,看完它才来写程序。比如你写流水灯,完全就没必要看中断的知识,专心把流水灯学好就是了,这是把整本书化整为零,一小点一小点的啃。 3、程序不要光看不写,一定要自己写一次。最开始的时候,啥都不懂,可以抄人家的程序过来,看看每一句是干什么用的,达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次,你会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距……当你自己能写出来的时候,说明你就真的懂了。 4、必须学会掌握调试程序的方法。不少人写程序,把代码写好了,然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:为什么我的程序不能正常运行?然后就等别人来给自己分析。这是一种很不好的行为,应该自己学会发现问题和学会如何解决问题。这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。这一个过程非常重要,通过程序的排错,你可以学到的知识是书上得不到的。 5、找到解决问题思路比找到代码更重要。我们用单片机来控制周边器件,达到我们想到的目的,这是一个题目,而如何写出一个程序,来控制器件按你想要的结果去运作,这个就是解题的思路。要写程序,就得先找到解决问题的思路,你学会找出这个解题思路,比你找到代码更为重要。不少人很喜欢找人家的代码,有的人甚至有了代码就直接复制到自己的程序中,可以说,这不是一种学习的态度,无助于你编程水平的提高。我几乎不怎么看人家的代码,多数时候是看别人的思路,有方框图最好,没有的话文字说明也可以,要从代码中看出别人处理问题的思路,是相当困难的,特别是大型的程序,看起来是非常的累人,所以现在我也明白了,以前读书时说的程序流程图很重要,现在算是知道了。当你知道一个问题怎么去解决了,那么剩下的只是你安排代码去完成,这就已经不是什么问题了。举个例子:数码管动态扫描,没写过的初学者可能搞不清是怎么回事,其实,就是分时让每一时间段时只控制一只数码管显示数字,几只数码管轮流显示,由于速度很快,人眼的看起来是全部数码管都亮的。明白是这么一回事,事情就好办了,剩下的事情,无非是你安排让一只只数码管轮流显示出相应的数值。显示数字,然后延时一下,再下一只显示数字,延时,知道是这样,我们实际程序上只要做到这样就可以:往段口送段码,然后打开位选显示一只,延时一下,再关闭位选,再送出段码,再打开另一只位选仅此而已。有了解决问题的思路,我们就能问题拆分开来,然后逐一的解决,如果动态扫描的原理都没懂,不知道如何做,那么这个程序是怎么也写不出来的。 6、开动脑筋,运用多种方法,不断优化自己的程序。想想用各种不同方法来实现同一功能。这是一个练习和提高的过程,一个问题,你解决了,那么你再想想,能不能换种写法,也可以实现同一功能,或者说,你写出来的代码,能不能再精简一点,让程序执行效率更高,这个过程,就是一个进步的过程。很多知识和经验的获得,并不是直接写在书让你看就可以得到的,需要自己去实践,开动脑筋,经验才能得到积累,编程水平才能有所提高。 7、看别人的代码,学习人家的思路。这个在学习初期是很有用,通过看别人的代码,特别是有多年编程经验的人写出的具有一定水平的代码,可以使自己编程水平得到迅速的提高,同时,也可以结合别人的编程手法,与自己的想法融合在一起,写出更高水平的代码,从中得到进步。但要注意,切忌将学习变成抄袭,更不是抄袭完了就认为自己学会了,这样做只会使你退步。 8、尝试编写一下综合应用的程序。从流水灯学起,到动态扫描,再到中断,那么,你可以试试写一下时钟这种综合性应用的程序,不要小看时钟,要写好它不是一件容易的事情,它包括了单片机大部分的知识,比如有按键(IO读取)、动态扫描(IO输出)、中断等,如何协调好各功能模块正常工作,才是编程者需要学习的地方,当你单独写一个功能的时候,比如按键读取,你可能感觉很容易,因为你的程序啥也不做,只是读按键。但把它和其它功能混合在一起,如何在整个程序运行中使每一部分都正常工作,这就不是写一个按键读取这么容易的事情,功能模块之间有可能会互相影响,比如你需要让数码管既能显示,又要去处理按键读取,怎么使这两部分都正常工作,这就是一个协调过程。当你有了这个处理协调能力,你就算是入门了。 9、着重于培养解决问题的能力,而不是具体看自己编写了多少代码或者做过什么。“学单片机重点在于学习解决问题的思路,而不是局限于具体的芯片类型和语言”这一直是我的座右铭,是我学单片机多年来感悟出来的。经常看到有人说“你会驱动XX芯片,真牛啊”“你搞过XX项目,真厉害”之类的话,其实这是非常片面的,搞过XX芯片,搞过XX项目,只能说明你做过这一项目,它只是你的业绩,并不是代表能力就一定高。真正的能力应该是:“遇到没有解决过的问题或器件,能利用自己已学的知识,迅速找到解决问题的方法。”这个才是能力。写程序的过程就是一个创造的过程,几乎没有完全一样的项目,每次你遇上的几乎都不相同,所以你拥有的必须是你面对新项目时的创造能力,而不是标榜着你以往做过多少项目。当然,业绩也能从另一侧面反映你的经验和水平。 10、如果有可能,多学习计算机专业的知识,比如数据结构等。这些是你解决问题的基础知识,你把这些知识应用得越好,就会发现越容易找到解决问题的方法,这就是为什么一个学计算机专业的人编的程序和一个非计算机专业的人编的程序有差异的原因。也是一个菜鸟进军到高手所要配备的知识。如果我们把编程分为宏观编程和微观编程,那么微观编程就是写具体的代码,比如控制某某器件的语句;而宏观编程就是如何对整个程序进行布局、安排,使功能模块以你想要的方式去运行,得出你想要的结果。如前所说“会控制XX器件”这些只能算是微观编程,能做到这一步还只能算是菜鸟级别,如果面对一个新的器件,你心里没底,没把握去写这个控制程序,那说明你还是一个初级的菜鸟。当你有了一定的编程经验,控制过相当数量的器件之后,你就会发现,控制器件这些工作都是相似的、重复的工作,体现不出编程的水平,最多也是写得好与不好的差别,只能算是一些小技巧的应用。而对整个程序进行布局、安排这些才是最头痛的事情,能达到宏观编程和微观编程都做好才是真正的高手。对于规模越大的程序,越能体现出这一点。 11、面对一个新项目时,多自己开动脑筋,不要急于找别人的程序。有不少人面对一个新项目时,第一步想到的就是网上找别人写过的代码,然后抄一段,自己再写几句,凑在一起就完成任务,这虽然可能是省时间,但绝对不利你的学习。当你接到一个新项目时,应该先自己构思一下整个程序的架构,想想如何来完成,有可能的话,画一个流程图,简单的可以画在脑子里,对程序中用到的数据、变量有一个初步的安排,然后自己动手去写,遇到实在没办法解决的地方,再去请教别人,或看别人是怎么处理的,这样首先起码你自己动过脑想过,自己有自己的思路,如果你一开始就看别人的程序,你的思维就会受限在别人的思维里,自己想再创新就更难了,这样你自己永远也没办法提高,因为你是走在别人的影子里。 12、多利用网络的搜索,学会提问题。一般来说,学习过程中,你遇上的问题,前人们多数也有遇上的,所以如果有什么不懂,在自己解决不了的时候,最好先到网上搜索一下,看能不能找到答案,找不到再到论坛里发问,发问也要有目的性,尽量简单明了的描述问题,让帮助你的人可以用最少的时间就看懂你说什么,毕竟人家帮助你是免费的,时间也是有限的。 以上就是我学习单片机的经历和心得体会,希望对大家会有帮助,说得有不好或不对的地方欢迎大家批评指正。 篇二:单片机学习心得 时光飞逝,一转眼,一个学期又进尾声了,本学期的单片机综合课程设计也在一周内完成了。 俗话说“好的开始是成功的一半”。说起课程设计,我认为最重要的就是做好设计的预习,认真的研究老师给的题目,选一个自己有兴趣的题目。其次,老师对实验的讲解要一丝不苟的去听去想,因为只有都明白了,做起设计就会事半功倍,如果没弄明白,就迷迷糊糊的去选题目做设计,到头来一点收获也没有。最后,要重视程序的模块化,修改的方便,也要注重程序的调试,掌握其方法。 虽然这次的课程设计算起来在实验室的时间只有三天,不过因为我们都有自己的实验板,所以在宿舍里做实验的时间一定不止三天。 硬件的设计跟焊接都要我们自己动手去焊,软件的编程也要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很高兴它能按着设计的思想与要求运动起来。 当然,这其中也有很多问题,第一、不够细心比如由于粗心大意焊错了线,由于对课本理论的不熟悉导致编程出现错误。第二,是在学习态度上,这次课设是对我的学习态度的一次检验。对于这次单片机综合课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次实习所遇到的多半问题多数都是由于我们不够严谨。第三,在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。 在这次难得的课程设计过程中我锻炼了自己的思考能力和动手能力。通过题目选择和设计电路的过程中,加强了我思考问题的完整性和实际生活联系的可行性。在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。并且我们熟练掌握了有关器件的性能及测试方法。 再次感谢老师的辅导以及同学的帮助,是他们让我有了一个更好的认识,无论是学习还是生活,生活是实在的,要踏实走路。课程设计时间虽然很短,但我学习了很多的东西,使我眼界打开,感受颇深。 单片机学习心得 计算机科学与技术 班 学号: 单片机是一门应用性和综合性很强的学科,它综合了电子技术中的模拟电路和数字电路方面的知识,特别是数字电路,因为数字电路在里面的应用很多。学习单片机最好先从汇编语言入手,虽然汇编语言是低级语言,编程效率低,但它比C语言占用内存小,执行速度快等优点,在刚接触单片机时更容易学习。由于单片机涉及的知识很多,所以我们只能循序渐进的学习,逐步的积累,没有什么捷径可循。 刚开始学习的时候,对单片机没有什么认识,不知道什么是单片机,更不知道它有什么作用。通过学习才大体知道了单片机的一些知识。由中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口、定时器/计数器以及串行通信接口等集成在一块芯片上,构成了一个单片微型计算机,简称为单片机。它的应用范围很广,在工业自动化中应用有数据采集、测控技术。在智能仪器仪表中应用有数字示波器、数字信号源、数字万用表、感应电流表,自动取款机等。在消费类电子产品中应用有洗衣机、电冰箱、空调机、电视机、微波炉、手机、IC卡、汽车电子设备等。在通讯方面应用有调制解调器、程控交换技术、手机、小灵通等。在武器装备方面应用有飞机、军舰、坦克、导弹、航天飞机、鱼雷制导、智能武器等。学习单片机要投入大量的时间,如果只想速成,几乎是不可能的。由于单片机涉及的知识面很广,不可能在朝夕间就学会,只能一点点的积累。不积跬步,无以至千里。只有当你一步步去学习、去积累之后,你的单片机水平才会提高。学习过程中还要注重理解,要逐渐养成自己的编程思路,在编程过程中还要注意细节问题,如果因为粗心大意将程序写错,将会无形间给自己带来更大的工作量,随着学习的深入,我们编写的程序将越来越长,如果出现很多错误,在 改错时将会很麻烦,出错越多你改的时间将会越长,就会无形间给自己带来更多麻烦。 单片机(micro control unit)是一种集CPU、RAM、ROM、I/O、中断、定时/计数等功能为一体的完整的计算机,只需外加主频振荡器和电源,灌入应用程序就可以实现一定的功能。单片机的的应用特点是“面向测控”。因此,它必须有强力的信息处理、检测、控制的功能。学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编指令系统或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。 一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各 器件之间的工作必须相互协调?所以就需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线线,则线的数量将多得惊人,所以在微处理机中引 入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线 上,即相当于各个器件并联起来,但仅这样还不行,如果有两?器件同时送出数据,一 个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是是不允许的,所以 要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有 多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称 控制 总线。 在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配 地址,才能 用,分配地址当?也是以电信号的形?给出的,由于存储单元比较多,所以,用于地址分的线也较多,这些线被称为地址总线。 二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的─数字,或者说都是?串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据。指令由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的 一一对应关,不可以由 单片机的开发者更改。地址:是寻找单片机内部、外部的存储 单元、输入输出口的依据,内 存单元的地址值 已由芯片设计者规定好,不可更改,外部的 单元可以由单片机开发者自行决,但有一些地址单元是一定要有的(详见程序的执行过 程)。数据:这是由微处理机处理的 象,在各种 不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况: 1地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。 2方式字或控制字(如MOV TMOD,#3),3即是控制字。 3常数(如MOV TH0,#10H)10H即定时常数。 4实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗,则执 兄 令:MOV P1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实 际?出的值。理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指 令来 行了。 三、P0口、P2口和P3的第二功能用法 初学时往往对P0口、P2口和P3口的第二功能用法迷惑不解,认为第二功能和原功能之间 要有个切换的过程,或者说要有一条指令,事实各端口的第二功能完全是自动,不需要指令来转换。如P3.6、P3.7分别是WR、RD信号,当微片理机外接RAM或有外部I/O口 时,它们挥作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有相应的信号从 P3.或P3.7送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用’也并不是‘不能而是(使用者)‘不会’将其作为通用I/O口使用。你完全可以在指令中按排一条S ETB P3.7的指令,并且当单片机执行到这条指令时,也会使P3.7变为高电平,但使用者不会 这么做,因为这通常这会导致系统当溃(即死机)。 四、程序的执行过程 单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000,所以程序总是从‘0000’单元开始执行,也就是说:在系统的ROM中一定要存在‘0000’个单元,并且在‘0000’单元中存放的一定是一条指令。 五、堆栈 堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的 一份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出’,并且 堆栈有特 的数据传输指令,即‘PUSH’和甈OP’,有一个特殊的专为其服务的单元,即堆栈指 针SP 每当执一次 PUSH 指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原 来值基础上)动减1。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP值,就可以把堆栈设置在规定的内存单元中,如在程序开始时?用一条MOV SP,#5FH指令,就时把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这么条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元 开始往后8H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的浑乱 六:中断 当单片机应用于测控系统时,实时性就显得特别重要了。而中断技术就是处理这种实时性要求高的场合。单片机的特点是一段程序反复执行,程序中的每个指令的执行都需要一定的执行时间,如果程序没有执行到某指令,则该指令的动作就不会发生,这样就会耽误很多快速发生的事情,例如,按钮按下时的下降沿。要使单片机在程序正常运行过程中,对快速动作做出反应,就必须使用单片机的中断功能,该功能就是在快速动作发生后,单片机中断正常运行的程序,处理快速发生的动作,处理完成后,在返回执行正常的程序。中断功能是需要合理控制的,在使用中的困难是需要精确地知道什么时候不允许中断发生(屏蔽中断)、什么时候允许中断发生(开中断),需要设置哪些寄存器才能使某种中断起作用,中断开始时,程序应该干什么,中断完成后,程序应该干什么等等。中断学会后,就可以编制更复杂结构的程序,这样的程序可以干着一件事,监视着一件事,一旦监视的事情发生,就中断正在干的事情,处理监视的事情。这就是中断功能的强大之处。 七:汇编语言与C语言 汇编指令有自己的一套繁琐的指令系统,不容易熟练掌握,编写程序不得不注意硬件细节。相对于C语言,汇编语言也有不可忽略的优势,就是在某些特殊场合需要高效的,占用存储空间小的地方。但随着技术的发展硬件的限制越来越小,C语言比较好理解,通用性和可移植性都很不错。也不用记专门的指令集合来,所以我还是比较倾向于用C编写程序的。 接触单片机已经有一段时间了,我感觉自己动手学习编写程序,调试然后在开发板上做学习的很快,看到自己看到的结果通过自己亲手做出来的感觉很有成功感。 有时候单片机的学习很单调,有些知识学起来很抽象,不容易理解,只能慢慢适应,一边学习理论知识,一边编写程序,将程序刷入单片机进行调试,通过这种方式才能更快速的学习单片机。同事也会从学习中体会成功的喜悦。 看门狗程序 看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就回给出一个复位信号到MCU,是MCU复位.防止MCU死机.看门狗的作用就是防止程序发生死循环,或者说程序跑飞。 工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。、本程序通过按键喂狗防止溢出复位 看门狗演示程序 在16383个机器周期内必须至少喂狗一次 标准AT89s52单片机试验通过。-----------------*/ #include sfr WDTRST = 0xA6; sbit K1 = P3^0;sbit K2 = P3^1;sbit LED1=P1^1;sbit LED2=P1^2; void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t);//ms级延时 /*----------------- 主函数 -----------------*/ main(){ LED1=0; DelayMs(100); LED1=1; DelayMs(100); TMOD=0x01; TH0=0xc6; //定时16ms TL0=0x66; EA=1; ET0=1; WDTRST=0x1e; //在程序初始化中激活看门狗。 WDTRST=0xe1; //先送1E,后送E1 if(K1==0) { TR0=1; } while(1) { if(K2==0) { TR0=0; } LED2=1; LED1=1; DelayMs(100); LED2=0; DelayMs(100); } } /*----------------- 定时器中断函数 -----------------*/ void Time0(void)interrupt 1 { TH0=0xc6; //定时16ms TL0=0x66; WDTRST=0x1e; //喂狗指令 WDTRST=0xe1;} /*-----------------uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS -----------------*/ void DelayUs2x(unsigned char t){ while(--t);} /*-----------------mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编-----------------*/ void DelayMs(unsigned char t){ while(t--){ //大致延时1mS DelayUs2x(245); DelayUs2x(245);} } 单片机学习心得 第一次听说单片机是在今年年初的时候,是在一段视频上,好像讲的是基于单片机控制的遥控小车,真正见到单片机是在我的第一本入门教材上,在此之前我只是模拟电子电路爱好者,当我第一次认识单片机以后就彻底爱上她了,当时对她很是好奇,一片小小的芯片竟然可以实现这么多功能,还可以编程。 从那时起就开始了我的单片机学习之路,到现在已有7个月了,这7个月学到了许多。下面是我学习单片机的一些心得体会,供大家参考一下: 学习单片机最重要的不是你有多深厚的基础知识(当然基础也是很重要的),而是你对她是否有兴趣,兴趣的魅力是巨大的,兴趣是最好的老师,是你坚持下去的动力源。 要对数电和模电有一定的了解,这对你学习单片机有很大帮助。 学习单片机光看书是不行的,还得要实践,所以还得要有经济投入(不会花很多钱的)。 先选一本好的入门教材,51系列单片机入门教材很多,很适合我们初学者。 大略了解一下单片机结构,一开始不要深入研究,要多增加感性认识,有利于学习。要学习一门编程语言 汇编或者是C语言,(汇编有利于内部结构的了解,C语言可移植性好,建议先学汇编,再深入学习C语言。) 熟练使用一种编译软件,推荐Keil C。 会用一种电路图和PCB设计工具,推荐protel。好好利用网络资源,尽可能自己解决问题,这也是提高自学能力的一种方法。 要实践理论相结合,多动手。最重要的是要保持兴趣,贵在坚持。第二篇:单片机学习心得
第三篇:单片机学习心得
第四篇:单片机学习心得
第五篇:单片机学习心得