第一篇:NXP LPC900系列单片机ISP编程技术总结
NXP LPC900系列单片机ISP编程技术总结
1、将编译好的用户应用程序下载(编程)到LPC900系列单片机(MCU)内部Flash的方法有三种:
(1)在系统编程ISP(In-System Programming)。
(2)在电路编程ICP(In-Circuit Programming)。(3)通用或专用编程器编程。
编程器编程是一种传统的并行编程方法,特别适合于DIP封装(如果是表贴的需专用适配器)或量产阶段(批量)的MCU编程,其特点是速度快、可靠性高。其缺点是无法对已焊接的表贴MCU编程,而且成本较高,一台稍好一点的通用编程器至少在千元以上。目前大部分品牌通用编程器(如Xeltek 3000U等)和周立功LPC PRO专用编程器均支持LPC900编程,而且有些编程器借助专用下载线(如Xeltek ISP-Header01、周立功ICP900-ADP)还可完成ICP编程。
ICP和ISP均采用串行编程方法。其中ICP是一种通用标准(规范)编程,硬件连接采用PCL(P0.5)、PDA(P0.4)、RST、VDD和GND 五线制,但要求编程时PCL、PDA、RST和VDD与系统其它电路断开。ICP的加载(启动)是由MCU内部硬件电路完成的,并调用MCU内部IAP(在应用编程,In-Application Programming)实现Flash编程。上位机(PC机)通过专用ICP下载器(如周立功MiniPRO和涛行TX-MiniICP)与目标系统相连,编程软件使用FlashMagic或SmartPRO。
注意:仅老款的LPC932不支持ICP编程,其它LPC900系列的均支持。
关于ICP编程更多的内容可参阅周立功公司的“LPC900系列单片机ICP解决方案”和“LPC900 在电路编程(ICP)规范”。
2、与ICP不同,ISP是一种通用非标准串行在线编程,尽管不同IC厂家内部实现ISP编程技术(算法)不同,但外部硬件连接均采用串口(或USB转串口)的RXD、TXD。根据ISP的加载启动(Bootloader)方式不同(LPC900的ISP加载机制可参阅NXP的AN10221-“In-System Programming with the P89LPC932”图2),LPC900的ISP编程方法又可分为三种:(1)RST 3脉冲法。(2)帧间隔法。(3)直接跳入法。
“3脉冲法”有点类似ICP,硬件连接也是采用5线制:RXD、TXD、DTR、RTS和GND,其中DTR控制MCU的VDD,RTS控制RST,且要求ISP编程时MCU的VDD和RST应与系统其它I电路断开,具体电路可参阅周立功的“LPC900系列单片机ICP及ISP使用指南”图1.16。该方法的ISP加载是在MCU加电复位后有内部硬件完成的,因此适用于刚出厂的全新空片编程和已下载运行应用程序的升级编程。就是因编程时要断开VDD和RST板上连接比较麻烦。
“帧间隔法”硬件连接只需RXD、TXD和GND,简称“3线制”,“3线制”是目前大多数IC厂家ISP编程采用的连接方式,如STC51单片机等。简单方便,成本低(仅需20元左右的RS232转TTL电路或用户自己用1片MAX232即可)。其原理是MCU检测到RXD上帧间隔码(连续的低电平,即串口“Break”脉冲)就进入ISP模式。虽然这种检测是由MCU硬件完成的,但应用程序一开始必须对串口进行初始化,其C代码参见上述“使用指南”程序清单1.2。由此可见,原则上“帧间隔法”只适合于应用程序的升级编程。不过,对于刚出厂的全新空片,由于其“引导状态位”=1,加电复位后就自动进入ISP模式,因此上述三种方法都适用的。“直接跳入法”就是应用程序判断某个开关,如接通(为0),则进入ISP模式,否则状态不变运行用户程序。显然该方法也必须在应用程序中嵌入“开关判断”代码(参见上述“使用指南”程序清单1.4)。一般都用于应用程序的升级编程。ISP编程的上位机程序可使用FlashMagic或ZlgISP900,其中ZlgISP900上述三种方法都可以,但不支持ICP编程。而FlashMagic支持方法(1)和(2)以及ICP编程,对于“3脉冲法”,编程前必须将其“Advanced Option”中“Hardware Config”的“Use DTR and RTS to enter ISP”勾选上,而“帧间隔法”则不能勾选,此外,除非MCU是全新空片或者确定其引导状态位(Status Bit)为1,否则进行ISP编程之前必须通过ISP菜单中“Start Bootloader”的“Send Break Condition”发送“3脉冲”或“帧间隔”才能使MCU进入ISP模式,而且要求:“Interface”选“None(ISP)”;“Baud Rate”选“7200”(内部RC振晶)。
注意:由于FlashMagic每次发ISP命令前要发2个同步码(大写字符U,原理后面阐述),因此其成功率比ZlgISP900。
3、LPC900出厂全新原装空片,其引导状态位(Boot Status Bit)=1,加电复位后MCU自动进入ISP模式,不必再通过“3脉冲法”和“帧间隔法”进入ISP,在MCU接收上位机ISP命令前,上位机必须通过发同步字符“U”让MCU自动跟踪串口通信波特率,上位机收到MCU回送的“U”表示跟踪成功,然后就可进行各种ISP操作了,如读ID,读配置信息,擦除、编程、加密Flash等。
(1)由于全新空片MCU加电复位后已自动进入ISP模式,因此ZlgISP900上述三种方法均可进行ISP编程。FlashMagic也不需“Send Break Condition”。(2)FlashMagic每次发ISP命令前要发2个同步字符“U”,而ZlgISP900只在执行“进入ISP模式”命令时发同步字符“U”。
(3)同步字符“U”的十六进制代码是0x55,在MCU的RXD上(加上“起始位”)实际上就是一串方波,便于MCU自动跟踪测算波特率。由于MCU是自动跟踪上位机串口通信波特率的,因此FlashMagic 或 ZlgISP900的波特率选择不是很重要的,不过一般建议选择7200或9600。
4、下载用户应用程序到MCU时要注意,必须先将配置参数中引导状态位设置为0,否则即使成功下载应用程序,复位后也无法正常运行,因状态位=1,加电复位后MCU会自动进入ISP模式的。
ZlgISP900开始运行后或在读入加载文件(*.hex)后总是自动将引导状态位置为1(也许是个小Bug?),因此必须在读入文件后,先将“安全级别”改为“弱级”,再进入“查看配置信息”,去掉“引导向量=0x1”前的“√”去掉,并点击“设置配置信息至缓冲区”,然后才能将应用程序和配置信息下载到MCU。FlashMagic在下载应用程序时会自动将引导状态位置为0的。
如果使用ZlgISP900在下载应用程序时将状态位置为1了,唯一的办法就是将状态位设置为0后重新下载一次配置信息。
5、虽然ISP编程方法(“3脉冲法”除外)简单方便,而且成本很低,但许多LP900的用户发现其成功率很低,特别是对刚买来焊上的新片,成功率更低。归纳起来有如下三大类故障:
(1)第一次编程成功了,但用户程序没有正常运行。
(2)已下载用户程序并正常运行,但无法再进行ISP编程。
(3)使用ZlgISP900时,点击“进入ISP”后显示“成功进入ISP状态”,但无法进行ISP操作,如读ID显示出错;使用FlashMagic进行ISP操作时显示通信失败,并显示“Failed Autobaud”。这种情况对于刚焊上的空片出现最多。对于这三种情况,首先要解决的是所使用的MCU是不是买的全新原装产品,现在市面上有很多“翻新片”,性能很差,工作不稳定。其次是尽量使用物理串口,因为USB转串口工作不稳定,其驱动程序也容易出问题。
第一类故障一般都是下载应用程序时没有将状态位置为0。解决办法很简单,只要重新将状态位置为0写入MCU即可。
第二类故障稍复杂些,如果是使用“帧间隔法”,最有可能的原因是没有将“帧间隔法”初始化代码嵌入到应用程序中,另一种可能性是编程时不小心把MCU的ISP程序所占扇区(LPC933是扇区3,其它是扇区7)给擦除掉了,如果出现这种情况,唯一的办法就是将ISP程序源码(可从网上下载到)嵌入到用户程序工程中重新编译,并使用ICP或编程器下载到MCU中。
第三类故障出现最多,情况也最复杂,这也是国内很多用户不愿意使用LPC900的原因之一,特别是以前使用过其它MCU的(如STC的51系列单片机),ISP下载很方便,很可靠。尽管NXP和FlashMagic官方网站或论坛上指出出现这种故障的原因大部分是用户使用不当引起的(参见“http://forum.flashmagictool.com/index.php?topic=3628.0”),但据笔者多年开发经验来看,还是NXP LPC900的ISP程序(或者是FlashMagic、ZlgISP900?)在设计上不够完善引起的,特别是ISP程序中的“自动跟踪波特率”(Autobaud)在设计上可能有点小Bug,经常失败!(Failed Autobaud),导致串口无法正常通信。
对于这种故障,笔者有点小经验:就是先运行FlashMagic或ZlgISP900使MCU进入ISP模式(如果是全新空片已进入ISP模式就不必运行了!),退出程序后再运行“串口调试助手”,自动重复发送同步字符“U”(0x55),当正确接收到字符“U”时表示MCU波特率跟踪成功,然后再运行FlashMagic或ZlgISP900便可进行ISP操作了,注意波特率要选择与“串口调试助手”一致(一般是9600)。
第二篇:单片机总结系列-1
单片机,通过片内总线连接而成:中央处理器(CPU由运算器、控制器和若干特殊功能寄存器组成)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行输入/输出口(P0口-P3口)、串行口、定时/计数器、中断系统及特殊功能寄存器。主要部件集成在一块集成电路芯片上的微型计算机称为单片机。三总线结构:⑴ 地址总线AB,16位,P2口提供高8位地址,P0口经地址锁存器提供低8位。片外存储器可寻址范围达64KB(即=65536个字节)。⑵ 数据总线DB,D0-D7共8位,由P0口提供,分时输送低8位地址(通过地址锁存器锁存)和8位数据信息。⑶ 控制总线CB。时钟电路与时序:单片机芯片内部有一个高增益反向放大器,其输入引脚为XTAL1,输出引脚为XTAL2,芯片外部通过这两个引脚接晶体振荡器CYS和微调电容器C1、C2形成反馈电路(通常取值在20~30pF),构成稳定的自激振荡器,振荡频率范围通常是1.2MHz~12MHz。振荡脉冲经分频后再为系统所用。时序单位共4个:节拍、状态、机器周期和指令周期。CPU执行一条指令的时间称为指令周期。一般由若干个机器周期组成。机器周期=6状态=12晶振周期(拍节)。单片机的存储器单片机分为程序存储器(用于存放编好的程序、表格和常数。内部有4K ROM,片外最多可扩展64K ROM,两者统一编址。)和数据存储器(内部有128B RAM;片外最多可扩展64 K RAM。内、外RAM地址有重叠,可通过不同的指令来区分:“MOV”是对内部RAM进行读写的操作指令;“MOVX”是对外部RAM进行读写的操作指令),在物理空间上是相互独立哈佛结构。物理结构上可以分为片内程序存储器、片外程序存储器、片内数据存储器、片外数据存储器。片内数据存储器工作寄存器区、可位寻址区、通用RAM区、特殊功能寄存器区。工作方式程序执行方式、掉电保护方式、低功耗方式(空闲方式、掉电方式)最小系统对于内部带有程序存储器的51单片机,若上电工作时所需要的电源、复位电路和晶体振荡电路齐全,即可构成完整的单片机最小系统。致单片机不工作的原因EA没有接高电平、晶振电容使用不当、晶振不起振ALE控制信号端无信、复位电路设计不当。【并行输入/输出口有4个8位的双向并行输入/输出(I/O)端口,P0口、P1口、P2口和P3口。P0口是一个双功能的8位并行I/O口(地址/数据分时复用口和通用I/O口),字节地址为80H,位地址为80H~87H。可作输入/输出端口使用,又可作地址/数据总线分时传输低8位地址和8位数据。P1口是单一功能的并行I/O口,字节地址为90H,位地址为90H~97H。它只用作通用的数据输入/输出口。P2口是一个双功能的8位并行I/O口,字节地址为80H,位地址为A0H~A7H。可作通用的输入/输出口用,又可用作高8位地址总线。P3口是一个双功能的8位并行I/O口,字节地址为B0H,位地址为B0H~B7H,它的第一功能是通用输入/输出口,作第二功能用时,各引脚定义如下:读引脚和读锁存器的区别读引脚:由传送指令(MOV)实现;读锁存器:读锁存器是先从锁存器中读取数据,进行处理后,将处理后的数据重新写入锁存器中,这类指令成为“读-修改-写”指令。“读锁存器”可以避免因引脚外部电路的原因而使引脚的状态发生改变造成误读。】【中断系统功能实现中断与返回、能实现优先权排队、高级中断能中断低级中断。优点分时操作、实时处理、故障处理。5个中断源(优先级高→低)外部中断0(IE0,0003H)、定时/计数器中断0(TF0,000BH)、外部中断1(IE1,0013H)、定时/计数器中断1(TF1,001BH)、串行口发送/接收中断(TI/RI,002BH)CPU中断响应的条件中断源有中断请求,此中断的中断允许位为1,CPU开总中断。中断响应过程将相应的优先级状态触发器臵1(以阻断后来的同级或低级的中断请求);执行一条硬件LCALL指令,即把程序计数器PC的内容压入堆栈保存,再将相应的中断服务程序的入口地址送入PC;执行中断服务程序。外部中断请求有2种触发方式:电平触发和边沿脉冲触发。】【定时/计数器的工作原理T0和T1的实质是加1计数器,即每输入一个脉冲,计数器加1,当加到计数器全为1时,再输入一个脉冲,就使计数器归零,且计数器的溢出使TCON中的标志位TF0或TF1臵1,向CPU发出中断请求。只是输入的计数脉冲来源不同,把它们分成定时与计数两种功能。当为定时工作方式时,计数器对内部机器周期计数,每过一个机器周期,计数器增1,直至计满溢出。定时器的定时时间与系统的振荡频率紧密相关,因MCS-51单片机的一个机器周期由12个振荡脉冲组成,如果单片机系统采用12 MHz晶振,则计数周期为1us,这是最短的定时周期。当为计数工作方式时,计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外部信号计数,若前一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。所以检测一个从1到0的跳变需要两个机器周期,即外部输入信号的周期应大于或等于两个机器周期,也就是说外部输入信号的频率必须小于晶振频率的1/24,若频率超过晶振频率的1/24,则无法准确计数脉冲个数。虽然对外部输入信号的占空比无特殊要求,但是为了确保输入信号电平在变化之前至少被采样一次,要求电平保持时间至少是一个完整的机器周期。由定时器0、定时器
1、定时器方式寄存器TMOD(只能进行字节操作,不能位寻址)和定时器控制寄存器TCON组成(既能进行字节操作,又能位寻址)。定时器0,定时器1是16位加法计数器,分别由两个8位专用寄存器组成;定时器0由TH0和TL0组成,定时器1由TH1和TL1组成。(一般当T1作为串行通信接口的波特率发生器时T0才工作在方式3,此时TL0可作为8位的定时/计数器;而TH0只能作为8位定时器。)GATE—门控位。GATE=0,只要用软件使TR0(或TR1)臵1就可以启动定时器,而不管INT0(或INT1)的电平是高还是低。GATE=1,只有INT0(或INT1)引脚为高电平且由软件使TR0(或TR1)臵1时,才能启动定时器工作。定时/计数器的初始化1确定工作方式——对TMOD赋值。2预臵定时或计数的初值——直接将初值写入TH0、TL0或TH1、TL1。3根据需要开启定时/计数器中断——直接对IE寄存器赋值。4启动定时/计数器工作——将TR0或TR1臵“1”初值X = M-计数值,计数值与定时器的工作方式有关。若是定时工作模式,计数脉冲由内部供给,对机器周期进行计数,因此计数脉冲频率为f=fosc/12,计数周期T=1/f=12/fosc,若定时时间为t,则定时工作方式的计数初值:X= M-计数值=2n-t/T=2n-t ∙ fosc/12(例如主频为6MHZ,要求产生1ms的定时,试计算计数初值X。若设臵定时器工作于工作方式1,定时1ms,则计数初值X=216-(6MHZ×1ms)/12=65536-500=65036=FE0CH为定时方式1,在臵TR0=1以后,定时立即开始,但在定时时间到后,还必须用软件再次装入初值、重新启动才能开始新的定时。T1为计数方式2,在臵TR1=1以后,以计数开始,在计数次数到以后,自动装入初值并重新计数,因此软件设计不必再考虑装入初值。)】【通信方式 并行(多个数据各位同时传送,速度快效率高,但占用的数据线较多,成本高,仅适用于短距离)和串行(每个数据是一位一位按顺序传送,数据传送的速度有限制,但成本低,一根数据线就可以传送)。串行通讯分类 异步通信方式是按字符传送的,字符的前面有一个起始位(0),后面有一个停止位(1),这是一种起止式的通讯方式,字符之间没有固定的间隔长度,有点事数据传送的可靠性较高、能及时发现错误,缺点是通信效率较低。同步通信方式按数据块传送的,把传送的字符按顺序连接起来,组成数据块,在数据块前面加上特殊的同步字符,作为数据块的起止符号,在数据块后面加上校验字符,用于校验通信中的错误。同步通信中字符之间是没有间隔的,通讯效率比较高。串行通讯传输方式单工,半双工,全双工。串行口的结构 串行接口控制电路、发送电路(发送缓冲器SBUF,发送控制电路)、接收电路(接受缓冲器SBUF,接收控制电路)。特殊功能寄存器SCON存放串行口的控制和状态信息,串行口用定时器T1作为波特率发生器(发送接受时钟),电源控制寄存器PCON的最高位SMOD为串行口波特率的倍率控制位,中断允许控制寄存器IE控制串行通信中断是否允许。数据缓冲器SBUF 两个数据缓冲器在物理上是相互独立的,逻辑上却占用一个字节地址(99H)。发送时,就是CPU写入SBUF;接受时,就是CPU读取SBUF的过程。可以同时发送和接收数据,对于发送缓冲器,由于发送时CPU是主动的,不会产生重叠错误。波特率的计算方式0、方式2是固定的。方式1,方式3可变。波特率 = 2SMOD / 32 ×(T1的溢出率);T1溢出率 = 单位时间内溢出次数 = 1 /(T1的定时时间);而T1的定时时间t就是T1溢出一次所用的时间。此情况下,一般设T1工作在模式2(8位自动重装初值)。N = 256- t / T,t =(256-N)T =(256-N)×12 / fosc,所以,T1溢出率 = 1/t = fosc / 12(256-N),故,波特率 = 2SMOD / 32 × fosc / 12(256-N)。
若已知波特率,则可求出T1的计数初值: y = 256-2SMOD×fosc /(波特率×32×12)串行口初始化确定T1的工作方式(编程TMOD寄存器);计算T1的初值,装载TH1、TL1;启动T1(编程TCON中的TR1位);确定串行口控制(编程SCON寄存器)。串行口在中断方式工作时,还要进行中断设臵(编程IE、IP寄存器)。方式01、同步8位数据,波特率为F0SC/12;
2、低位在前,高位在后;
3、TI,再发送数据,软件清0,CLRTI;
4、RI,再接收数据,软件清0,CLRRI;
5、同步通信,无起始位和停止位。方式1
1、一帧为10位信息,1位起始(0),8位数据,1位停止(1);
2、波特率可变;
3、异步通信;
4、接收时,RB8里是停止位,数据位在SBUF(SM2=0)方式2,3是异步11位(以方式2接收数据时,REN必须臵1)RS-232C采用负逻辑电平,规定DC(-3~-5)为逻辑1,规定DC(+3~+5)为逻辑0,通常RS-232C的信号传输最大距离为30m,最高传输速率为20kbit/s
如果按键较多,则常用软件方法去抖动。为了保证CPU对键的一次闭合仅作一次键输入处理,必须去除抖动影响。即检测出键闭合后执行一个延时程序产生5ms~10ms的延时,等前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序,从而去除了抖动影响。
第三篇:单片机总结
单片机总结
——20120921030黄国林 我所在的专业生物医学工程专业,是一个理工医相结合的专业,但是侧重的方向还是工程学,对于计算机,单片机的要求比较高,虽然我们在大三的时候会有单片机的专业课,但是我们院也成立的相关的创新实验室,进行单片机的学习,组建自己的相关团队,做创新研发。但自己的只是还是有限,因此但是选修了这门课来扩宽自己的视野,对以后的单片机的学习打一定得基础。
51单片机的运用涉及到我们生活中的方方面面,为我们的生活提供了诸多便利,小到我们平时调动车流的交通信号灯,再到我们平时使用的形形色色的数码管,液晶显示屏等等,下面介绍一个我学习过的单片机的报警装置与旋转灯的应用./* 名称:报警与旋转灯
*/
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit SPK=P3^7;
uchar FRQ=0x00;
//延时
void DelayMS(uint ms)
{
}
//INT0中断函数 uchar i;while(ms--)for(i=0;i<120;i++);说明:定时器控制报警灯旋转显示,并发出仿真警报声。
void EX0_INT()interrupt 0
{
}
//定时器0中断
void T0_INT()interrupt
1{
}
//定时器1中断
void T1_INT()interrupt
3{
}
//主程序
void main()
{
P2=0x00;SPK=0x00;TMOD=0x11;TH0=0x00;//T0、T1方式1 TH1=-45000/256;TL1=-45000%256;P2=_crol_(P2,1);TH0=0xfe;TL0=FRQ;SPK=~SPK;TR0=~TR0;//开启或停止两定时器,分别控制报警器的声音和LED旋转 TR1=~TR1;if(P2==0x00)P2=0xe0;//开3个旋转灯 elseP2=0x00;//关闭所有LED
}
TL0=0xff;IT0=1;IE=0x8b;IP=0x01;TR0=0;TR1=0;while(1){} FRQ++;DelayMS(1);//定时器启停由INT0控制,初始关闭//开启0,1,3号中断 //INT0设为最高优先
同时,51单片机只是单片机的一类,单片机的应用十份广泛,以后我会更加努力的学习相关的内容。
20120921030黄国林
第四篇:SAS编程技术课后习题总结
第一章
1.缺省情况下,快捷键F1, F3, F4, F5, F6, F7, F8, F9和Ctrl+E的作用是什么?
F1帮助,F3 end,F4 recall调回提交的代码,F5 激活编辑器窗口,F6激活日志窗口,F7键激活输出窗口,F8 提交,F9键查看所有功能键功能,Ctrl+E键清除窗口内容。
2.缺省情况下SAS系统的五个功能窗口及各自的作用是什么?怎样定义激活这些窗口的快捷键?
1)资源管理器窗口。作用:访问数据的中心位置。2)结果窗口。作用:对程序的输出结果进行浏览和管理。3)增强型编辑器窗口。作用:比普通编辑窗口增加了一些功能,如定义缩写,显示行号,对程序段实现展开和收缩等。4)日志窗口。作用:查看程序运行信息。5)输出窗口。查看SAS程序的输出结果。3.怎样增加和删除SAS工具?
使用菜单栏中的工具=>定制=>“定制”标签实现工具的增加和删除。4.SAS日志窗口的信息构成。
提交的程序语句;系统消息和错误;程序运行速度和时间。
5.在显示管理系统下,切换窗口和完成各种特定的功能等,有四种发布命令的方式:即,在命令框直接键入命令;使用下拉菜单;使用工具栏;按功能键。试举例说明这些用法。
如提交运行的命令。程序写完后,按F3键或F8键提交程序,或单击工具条中的提交按纽,或在命令框中输入submit命令,或使用菜单栏中的运行下的提交,这样所提交的程序就会被运行。6.用菜单方式新建一个SAS逻辑库。
在菜单栏选择工具—》新建逻辑库出现如图所示界面。
在名称中输入新的逻辑库名称。在引擎中根据数据来源选择不同的引擎,如果只是想建立本机地址上的一个普通的SAS数据集数据库,可以选择默认。然后选中“启动时启用”复选框,在逻辑库信息中,单击路径后的“浏览”按钮,选择窗口可以不填,单击确定产生一个新的逻辑库。
7.说明下面SAS命令的用途并举例: keys,dlglib,libname,dir,var,options,submit,recall.Keys激活功能键的设定窗口。libname 建立SAS逻辑库。Submit提交。Options设定一个或多个系统选项,任何系统选项都有一个默认设置。8.用菜单方式导入(Import)和导出SAS数据集(Export)。
文件->导入数据
出现上图对话框,选择要导入数据类型,然后NEXT。
浏览要导入数据的地址。点击OK。
出现上图对话框,然后点击NEXT。
选择数据库存放的地址并命名。
第二次作业
1.构成SAS程序的语句分别分为哪两大类?什么是SAS语句?举例说明SAS语句的信息构成。
数据步、过程步
SAS语句就是一系列关键词、SAS名称、算符以及特殊字符的组合。2.简述SAS名的种类及命名规则。什么是SAS关键词?
SAS名的类型:1逻辑库名; 2数据集名;3变量名;4格式名;5过程名;6数组名;7语句标号名;8特殊文件名;9其它名。
SAS名称必须以字母或下划线开头;SAS名称可以包括字母、数字和下划线; SAS名称依据其使用的场合有一定长度限制。
3.SAS变量的类型和属性。举例说明SAS自动变量。数值变量
数值变量是SAS系统以浮点(floating-point)方式存储的数据变量,数 值变量包括日期和时间。数值变量的值只能是数值。字符变量
字符变量可以由阿拉伯字母、数字0-9以及其它一些特殊字符组成。字符变量的值可以是字符、字母、特殊字符和数值。字符变量名后跟 一个美元号($)表示该变量是字符型而不是数值型。
2)变量属性
SAS变量的属性包括:长度、输入输出格式和标签。未设定属性的变量在它们第一次出现时由系统给出。
4.给一个简单的SAS程序的例子,适当应用SAS的注释语句。data a;
/*data为关键词,a为SAS名*/ x=12345.1234;informat x 12.4;/*输入语句,保留12字节和4位小数*/ format x 8.2;
/*输出语句,保留8字节和2位小数*/ put x=;run;
5.SAS数据集中变量链表时,X1~Xn表示什么?特殊SAS变量列表_numerie_,_character_和_all_的含义。
X1~Xn 从X1到Xn的所有变量 _numerie_ 所有数值变量 _character_ 所有字符变量 _all_ 所有变量
6.怎样提交SAS程序?简述程序执行过程中,LOG窗口显示的信息结构。
8.简述SAS表达式定义及其结构构成元素。
表达式由一系列操作符和操作对象构成,产生一个目标值。使用表达式可以对变量作变换和赋值,创建新变量,计算新数值以及控制条件语句的运行等。包括操作对象和操作符
9.构成SAS表达式的操作对象和操作符有哪些? 操作对象有:变量;常数
操作符包括:算术算符;比较算符;逻辑算符;SAS函数;括号
11.举例说明数值常常数、字符常数和日期时间常数的表达方法。引用数值格式 例:
标准格式:1,01,+1,-1,1.1;科学计数法:1.1e11,1.2e-12;十六进制格式:1cx,12x,9x
字符常数通常由单引号括起来的1~32767个字符组成。如果字符常数内含有引号,引用时,要么它的引号用两个连续的单引号,要么用一个双引号。例:name=”TOM’S”
引用日期时间常数,格式值带引号,后面跟一个D(日期)、T(时间)、或DT(日期时间)例:’ljan2000’d 16.简述数据步的功能。
1)创建SAS数据集(SAS数据文件或SAS数据视图); 2)读取外部数据文件创建SAS数据集;
3)通过对现有SAS数据集取子集、合并、修改和更新创建新的SAS数据集; 4)分析、操作或展示数据; 5)创建新变量;
6)产生报告、或将文件存储到硬盘或磁带上; 7)提取信息; 8)文件管理。
第三次作业
data A;infile cards;input Fee @@;cards;35 78 99 36 79 21 23 90 87 90 33 55 66 12 98 1100;run;
第四次作业
1、data a;input x;y=y*x;retain y 1;cards;1 2 3 4 8 16;proc print;run;
2、data b;input stkcd $ rdate yymmdd10.lstknm $ var1 var2 var3;cards;;run;data c;format stkcd lstknm rdate var3 var2 var1;set b;run;
3、data a;input date price;cards;12 23 23 52 11 21;data b;input date price;cards;12 55 55 21 68 9;proc sort data=a;/*排序*/ by date;run;proc sort data=b;by date;run;data c;set a b;by date;proc print noobs;run;
4、data a;input logdate $10.;cards;2011-12-2 2012-8-6 2012-8-10;run;data b;set a(rename=(logdate=date));date=input(date,yymmdd10.);label date='日期';run;
5、自动变量是由数据步语句自动创建的,这些自动变量不输出到数据集中,在重复过程中被保留。
6、创建组标识变量GROUP,将数据集A中的观测等分为10组,观测值不能整除10时,前余数组各多加一个观测值
data a;set resdat.treat nobs=nobs;x=(nobs-mod(nobs,10))/10;call symput('nobs',nobs);call symput('groupn',x);Call symput('mod',mod(nobs,10));Drop x;run;%put &nobs &groupn;data b;do i=1 to &mod do _n_=1 to &groupn+1;group=i;output;end;end;do i=&mod+1 to 10;do _n_=1 to &groupn;group=i;output;end;end;Drop i;run;data c;merge a b;proc sort data=c;by group;run;
7、现有一个数据流:a 2 b 3 c d 4 6,按下面要求创建SAS数据集。用语句input id $ no;变 量id取值上面数据流里的a,b,c,d,变量no取值2,3,4,6。但是这个数据流存在问题:如有的id没有no,有的no没有id。创建SAS数据集,删除只有id没有no或者只有no没有id的观测,即把上面的c和6去掉,最后得到三个观测,a 2, b 3与d 4。
data a;input t$@@;cards;a 2 b 3 c d 4 6;run;data b;set a;id=lag(t);no=t;if 'a'<=id<='z' and '0'<=no<='9';drop t;run;
8、现有一个数据流:a23 223 bc4 36 3c5 11d 400 620,按下面要求创建SAS数据集。用语句input id $ no;变量id取值上面数据流里的a23, bc4, 11d,变量no取值233,36,400。但是这个数据流存在问题:如有的id没有no,有的no没有id。创建SAS数据集,删除只有id没有no或者只有no没有id的观测,即把上面的3c5和620去掉,最后得到三个观测:
a23 223 bc4 36 11d 400
data a(keep=id no);input x $ @@;id=lag(x);no=input(x,8.);y=lag(no);if y='.' and id^=' ' and no^='.';cards;a23 223 bc4 36 3c5 11d 400 620;run;
第五次作业
1.创建一包含10000个变量(X1-X10000),100个观测值的SAS数据集。分别用DATA 步,DATA步数组语句和IML过程实现。data test1a;informat x1-x10000 9.2;do i=1 to 100;output;drop i;end;run;2.多种方法创建包含变量X的10000个观测值的SAS数据集。
3.数据集A中日期变量DATE包含有缺失值,创建包含日期变量DATE的数据集B,并填
充开始到结束日之间的所有日期值。
proc iml;x= {'date' price};t= {1111 2,2341 2,2132 3,1234 5,12345 6,3456 6,6753 4,2345 7,2134 9};print t;t[1,1]=.;t[2,1]=.;t[5,1]=.;t[9,1]=.;create a from t[colname=x];/ append from t;show datasets;show contents;close a;run;quit;data a;set a;format date yymmdd8.2;run;data a1;set a n=_n_;format date yymmdd8.2;retain temp;if date^=.then temp=date;else date=temp;run;data a2;n=_n_;set a1;run;proc sort data=a2;by descending n;set a2 drop n temp;run;data a4 set a3;retain temp;if date^=.then temp=date;else date=temp;run;data a4;n=_n_;set a4;run;proc sort data=a4 out=b(drop=n temp);by descending n;run;
4.利用随机数函数RANUNI对某数据集设计返回抽样方案。data sample(drop =samplesize n);samplesize=5;do n=1 to samplesize;readit=ceil(ranuni(0)*totobs);put readit=;set bb.class point=readit nobs=totobs;output;end;stop;run;
5.利用随机数函数RANUNI对某数据集设计不返回抽样方案。
data a;set bb.class;keep name;run;data b;set a nobs=nobs;ran=ceil(nobs*ranuni(1));put ran=;run;proc sort data=b;by ran;data c;set b;if _n_<=15;run;
6.给下段程序的主要语句加注释。STOP语句能否删除?为什么?
不能删除。
强制结束数据步,因为set语句在数据步程序中会反复执行数据步的程序直到遇到文件结束(最后一跳观测)的标志,这里使用了指针选项可能碰不到这种标志,所以要用stop,否则就有可能无休止地执行下去。
7.SAS系统显示表达式、函数、数据集、数组或矩阵的具体值时,常需要哪些语句和过程? put;proc print print show list;
第六次作业
2.SAS函数的自变量有几类?
自变量类型:变量名、常数、函数、表达式。3.举例说明自变量的表示方法和缩写规则。当函数有多个自变量时,必须用逗号分隔开。
自变量名缩写方法:函数名(OF变量名1-变量名n);函数名(OF变量名1…变量名n)。7.SAS系统是怎样存贮日期时间的?SAS日期时间存贮标准是什么?
SAS日期和时间存储标准是以1960年1月1号0时0分0秒为起点,然后以相应的间隔记时。如1960年1月1日9时0分,按日记的数值就是0,按小时记的数值就是9。1960年1月2日0时0分,按日记的数值就是1,按小时记的数值就是24。
9.分别说明日期时间函数datdif, yrdif, date(), datetime, mdy, dhms有哪些实际用途。
DATADIF(sdate,edate,basis)返回两个日期之间的天数。YRDIF(sdate,edate,basis)返回两个日期之间的年数。DATA()返回当前日期的SAS日期值。DATETIME()返回当前日期和时间。
MDY(month,day,year)返回由年、月和日定义的SAS日期值。
DHMS(date,hour,minute,second)返回由日期、小时、分钟和秒构成的SAS日期时间值。
第五篇:关于51系列单片机中断嵌套
说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。
中断的优先级有两个:查询优先级和执行优先级。
什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断 或 int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART 或 PX0>PT0>PX1>PT1>PS>......其实都是查询优级。首先查询优先级是不可以更改和设置的。这是一个中断优先权排队的问题。是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。而这与是否发生中断服务程序的嵌套毫不相干。当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。
例如:当计数器0中断和外部中断1(按查询优先级,计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
而中断的执行优先级就是你对IP寄存器的设置了。在2个优先级的情况下,某位为1,则相应的中断源为高优先级;为0,则为低优先级。
关于中断的优先级有三条原则:
1、CPU同时接收到几个中断时,首先响应优先级最高的中断请求;
2、正在进行的中断过程不能被新的同级或低行优优先级的中断请求所中断;
3、正在进行的低行优优先级中断服务,能被高行优优先级中断请求中断;
若:同一执行优先级中的中断申请不止一个时,则有一个中断优先权排队问题。同一执行优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,优先权自高到低的顺序即: 外部中断0>定时/计数0>外部中断1>定时/计数1>串行接口
例如:设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。若串口中断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。
关于中断嵌套。可以这样说,当一个中断正在执行的时候,如果事先设置了中断优先级寄存器IP,那么当一个更高优先级的中断到来的时候会发生中断嵌套,如果没有设置则不会发
生任何嵌套;如果有同一个优先级的中断触发,它并不是在“不断的申请”,而是将它相应的中断标志位置即IE寄存器的某位置位,当CPU执行完当前中断之后,按照查询优先级重新去查询各个中断标志位,进入相应中断。
要记住,没有设置IP时,单片机会按照查询优先级(或都说逻辑优先级)来排队进入服务。如果要想让某个中断优先响应,则要设置IP,更改执行优先级(或者说物理优先级)。要注意的是,当设置了IP后,当低执行优先级中断在运行时,如果有高执行优先级的中断产生,则会嵌套调用进入高执行优先级的中断。如果你是用C语言写的程序,并在中断服务时 using 了寄存组,要注意,两个不同执行优先级的中断服务程序不要 using 同一组寄存器。
看两个问题,如下: 在各个中断都是低优先级的时候,如果定时器0的溢出进入中断。在这个中断处理的过程中,外部中断0也被触发了,那么是不是要发生中断嵌套? 如果定时器0发生中断的时候,进入中断处理程序,这个时候外部中断1条件触发条件满足了。因为定时器0自然优先级比外部中断1高,那么定时器0的中断处理程序继续执行。假设定时器中断处理程序执行的过程中,外部中断1的触发。条件消失了,那么等定时器0的中断处理完后,程序还是会进入外部中断1处理程序吗?
答案1:在IP事先设置了外部中断0的优先级的情况下,CUP会中止定时器0的中断服务,进入外部中断0服务程序,执行完以后再回到定时器0中断服务程序。否则不会。
答案2:肯定会进入中断的;外部中断1的触发条件满足后会置位外部1的中断标志,即使后来外部中断1的触发条件消失了,也不会清除已置位的中断标志,所以等定时器0的中断处理完后,程序判断外部中断的中断标志为1后依然会进入外部中断1处理程序的,只有在外部中断1处理程序中执行reti指令才会硬件清除外部中断1的中断标志(这也正是为什么中断返回使用reti指令而不可以用ret替换的原因)...