凌阳单片机端口位定义
- 格式:doc
- 大小:22.00 KB
- 文档页数:3
第1章 SPCE061A单片机简介 (1)1.1凌阳16位单片机 (1)1.2 SPCE061A简介 (2)1.2.1 总述 (2)1.2.2 性能 (2)1.2.3 结构概览 (3)1.2.4 芯片的引脚排列和说明 (4)1.2.5 特性 (6)1.2.6 SPCE061A最小系统 (7)1.2.7 SPCE061A开发方法 (8)1.2.8 应用领域 (10)北阳电子内部技术资料0第1章 SPCE061A单片机简介1.1 凌阳16位单片机随着单片机功能集成化的发展,其应用领域也逐渐地由传统的控制,扩展为控制处理、数据处理以及数字信号处理(DSP,Digital Signal Processing)等领域。
凌阳的16位单片机就是为适应这种发展而设计的。
它的CPU内核采用凌阳最新推出的µ’nSP™(Microcontroller and Signal Processor)16位微处理器芯片(以下简称µ’nSP™)。
围绕µ’nSP™所形成的16位µ’nSP™系列单片机(以下简称µ’nSP™家族)采用的是模块式集成结构,它以µ’nSP™内核为中心集成不同规模的ROM、RAM和功能丰富的各种外设接口部件,如图1.1所示。
图1.1µ’nSP™家族的模块式结构µ’nSP™内核是一个通用的核结构。
除此之外的其它功能模块均为可选结构,亦即这种结构可大可小或可有可无。
借助这种通用结构附加可选结构的积木式的构成,便可形成各种不同系列派生产品,以适合不同的应用场合。
这样做无疑会使每一种派生产品具有更强的功能和更低的成本。
µ’nSP™家族有以下特点:体积小、集成度高、可靠性好且易于扩展北阳电子内部技术资料1µ’nSP™家族把各功能部件模块化地集成在一个芯片里,内部采用总线结构,因而减少了各功能部件之间的连线,提高了其可靠性和抗干扰能力。
单片机引脚介绍单片机(Microcontroller)是一种集成了微处理器、存储器和输入输出设备的芯片,广泛应用于计算机控制、嵌入式系统以及各种电子设备中。
而单片机的引脚则是连接单片机与其他外部电路或设备的接口,承担着数据传输和控制信号的传送任务。
本文将介绍单片机引脚的分类及其功能,以及在实际应用中的重要性。
一、引脚分类及功能根据不同的单片机型号和芯片制造商,引脚的数量和布局会有所差异。
一种常见的单片机引脚布局如下:1. 电源引脚:电源引脚由Vcc(正电源)和GND(地)组成。
Vcc引脚连接正电源,GND引脚连接地,它们为单片机提供工作所需的电源和参考电平。
2. 输入输出引脚:输入输出引脚用于连接外部的传感器、执行器或其他外设。
它们可以分为数字输入输出引脚和模拟输入输出引脚两种类型。
a. 数字输入输出引脚:数字输入输出引脚主要用于连接开关、按钮等数字信号的输入和输出。
在输入模式下,它们可以读取外部开关状态,并将其转换为数字信号输入给单片机。
在输出模式下,则可以向外部设备发送控制信号。
b. 模拟输入输出引脚:模拟输入输出引脚用于连接模拟传感器、电压比较器等设备。
它们可以读取和输出连续变化的模拟信号。
3. 专用功能引脚:一些单片机可能会有一些专用功能引脚,用于特定的通信、计时、中断等功能。
例如,I2C总线引脚、串口引脚、定时器引脚等专用功能引脚。
二、引脚的作用和重要性单片机的引脚在系统设计中扮演着重要的角色,它们不仅仅是将单片机与外部设备连接的接口,还可以用来配置单片机的工作模式、控制信号的传输、和外部设备之间的通信。
首先,引脚可以用来配置单片机的工作模式。
通过将特定引脚设置为输入或输出模式,可以控制单片机的功能。
例如,将某个引脚配置为输入模式可以用来实现按键的检测,而将其配置为输出模式则可以用来驱动LED等外部设备。
其次,引脚可以传输控制信号。
单片机可以通过改变特定引脚的电平状态来发送控制信号给外部设备,从而实现对外部设备的控制。
单片机各个引脚功能概述单片机是一种集成电路,其中具有多个引脚,每个引脚都具有不同的功能。
下面是单片机各个引脚的功能概述:1.VCC:VCC引脚为单片机的电源引脚,通常连到电池或电源电压上。
它为单片机提供正向电源,电压通常为3.3V或5V。
2.GND:GND引脚为单片机的接地引脚,通常使用地线连接到电路板的地方。
该引脚为单片机提供回路的参考点。
3.XTAL1和XTAL2:XTAL1和XTAL2引脚是单片机的振荡器引脚,通常连接到晶体振荡器或陶瓷谐振器中的引脚。
这些引脚提供时钟脉冲,以控制单片机的时序和计时。
4.RESET:RESET引脚是单片机的复位引脚,通常使用它来将单片机恢复到初始状态。
当RESET引脚被拉低时,单片机将重新启动。
5.P0.0-P0.7:P0.0-P0.7是单片机的I/O端口0引脚,用于连接外部设备。
这些引脚可以被配置为输入或输出端口,以与外部设备通信。
6.P1.0-P1.7:P1.0-P1.7是单片机的I/O端口1引脚,用于连接外部设备。
这些引脚也可以被配置为输入或输出端口,以与外部设备通信。
7.P2.0-P2.7:P2.0-P2.7是单片机的I/O端口2引脚,用于连接外部设备。
这些引脚可以被配置为输入或输出端口,以与外部设备通信。
8.P3.0-P3.7:P3.0-P3.7是单片机的I/O端口3引脚,用于连接外部设备。
这些引脚也可以被配置为输入或输出端口,以与外部设备通信。
9.INT0和INT1:INT0和INT1引脚是单片机的外部中断引脚,用于检测外部中断事件。
这些引脚通常用于响应外部事件,例如按下按钮或检测外部信号。
10.TXD和RXD:TXD引脚是单片机的串行传输引脚,用于发送串行数据。
RXD引脚是单片机的串行接收引脚,用于接收串行数据。
这些引脚通常用于单片机与其他设备(例如计算机或传感器)之间的通信。
11.ADC0-ADC7:ADC0-ADC7引脚是单片机的模拟输入引脚,用于连接模拟传感器或外部设备。
单片机I/O口定义I/O端口又称为I/O接口,也叫做I/O通道或I/O通道。
I/O端口是MCS-51单片机对外部实现控制和信息交换的必经之路,是一个过渡的集成电路,用于信息传送过程中的速度匹配和增强它的负载能力。
I/O端口右串行和并行之分,串行I/O端口一次只能传送一位二进制信息,并行I/O端口一次可以传送一组(8位)二进制信息。
并行I/O端口8051有四个并行I/O端口,分别命名为P0、P1、P2和P3,在这四个并行I/O端口中,每个端口都有双向I/O功能。
即CPU即可以从四个并行I/O端口中的任何一个输出数据,又可以从它们那里输入数据。
每个I/O端口内部都有一个8位数据输出锁存器和一个8位数据输入缓冲器,四个数据输出锁存器和端口号P0、P1、P2和P3同名,皆为特殊功能寄存器SFR中的一个。
因此,CPU数据从并行I/O端口输出时可以得到锁存,数据输入时可以得到缓冲。
四个并行I/O端口在结构上并不相同,因此它们在功能和用途上的差异较大。
P0口和P2口内部均有一个受控制器控制的二选一选择电路,故它们除可以用作通用I/O口外,还具有特殊的功能。
例如:P0可以输出片外存储器的低八位地址码和读写数据,P2口可以输出片外存储器的高八位地址码,等等。
P1口常作为通用I/O口使用,为CPU传送用户数据;P3口除可以作为通用I/O口使用外,还具有第二功能。
在四个并行I/O端口中,只有P0口是真正的双向I/O口,故它具有较大的负载能力,最多可以推动8个LSTTL门,其余3个I/O口是准双向I/O口,只能推动4个LSTTL门。
四个并行I/O端口作为通用I/O使用时,共有写端口、读端口和读引脚三种操作方式,写端口实际上是输出数据,是把累加器A或其他寄存器中的数据传送到端口锁存器中,然后由端口自动从端口引脚线上输出。
读端口不是真正的从外部输入数据,而是把端口锁存器中的输出数据读到CPU的累加器A中。
读引脚才是真正的输入外部数据的操作,是从端口引脚线上读入外部的输入数据。
凌阳61单片机使用指南凌阳61单片机使用指南第一章:简介1.1 概述本章介绍凌阳61单片机的基本信息,包括产品特点、硬件规格等。
第二章:硬件连接2.1 引脚定义本节介绍凌阳61单片机各个引脚的功能和使用方式。
2.2 电源接口本节介绍凌阳61单片机的电源接口及相关注意事项。
2.3 外部设备连接本节介绍凌阳61单片机与外部设备的连接方式和通信协议。
第三章:软件开发3.1 开发环境搭建本节详细介绍凌阳61单片机软件开发所需的开发环境搭建步骤。
3.2 编程语言选择本节介绍凌阳61单片机支持的编程语言,并分析其特点和适用场景。
3.3 开发工具使用本节介绍凌阳61单片机的开发工具的使用方法和常用功能。
3.4 编程实例本节提供凌阳61单片机的编程实例,帮助读者快速上手开发。
第四章:调试与测试4.1 调试工具本节介绍凌阳61单片机调试工具的选择和使用方法。
4.2 常见问题解答本节了一些常见问题,并提供解决方案和调试方法。
第五章:附件本文档涉及的附件包括:- 凌阳61单片机引脚定义图- 凌阳61单片机外部设备连接示意图- 凌阳61单片机开发环境搭建视频教程附件可以通过邮件(exampl)向我们索取。
法律名词及注释:1.单片机:是一种集成电路中的集成块,由一个处理器核心、存储器和各种周边设备组成的微型计算机。
2.编程语言:用于编写计算机程序的一种形式化语言,用来精确地描述计算机操作的步骤。
3.通信协议:设备之间进行数据交换和通信时所约定的规则和格式,包括物理层传输、数据之间的转换和通信协议的解释等。
单片机脚位定义单片机是一种集成电路,由微型计算机、存储器和输入输出接口等功能模块组成。
它常用于电子设备中,能够完成控制和处理各种数据的任务。
在单片机的设计和应用中,了解各个脚位的定义及其功能十分重要。
1. 供电脚位:供电脚位为单片机提供电源电压,保证其正常运行。
一般情况下,单片机需要3.3V或5V的电源。
供电脚位通常称为VCC(或VDD)和GND,分别用于连接电源正极和负极。
2. 输入输出脚位:输入输出脚位用于与外部设备进行数据交换。
单片机可以通过这些脚位接收外部信号,并发送处理后的数据。
这些脚位通常被标记为I/O,用于连接按钮、开关、传感器等外围设备。
3. 模拟输入脚位:模拟输入脚位可以接收模拟信号,常用于测量温度、压力、光线等物理量。
这些脚位通常被标记为ADC(模数转换器)或AIN(模拟输入)。
4. 时钟源脚位:时钟源脚位用于提供单片机内部的时钟信号,控制其运行速度。
根据不同的单片机型号,时钟源脚位可以是晶振输入脚位(XTAL)或者外部时钟输入脚位(CLKIN)。
5. 复位脚位:复位脚位用于重启或初始化单片机。
当复位脚位被置高电平时,单片机将重新启动并执行初始化操作。
一般来说,复位脚位被标记为RESET或RST。
6. 中断脚位:中断脚位用于连接外部中断源,如按钮按下、定时器溢出等。
当中断源发生时,单片机可以立即执行中断服务程序,处理相关事件。
不同型号的单片机,其中断脚位的标记可能有所不同。
7. 程序存储器脚位:程序存储器脚位用于连接单片机的存储器芯片,存储程序指令。
这些脚位通常称为ROM或Flash,用于存储程序的读取。
8. 数据存储器脚位:数据存储器脚位用于连接单片机的存储器芯片,用于存储数据。
这些脚位通常称为RAM,用于临时存储运行时的数据。
除了上述常见的脚位定义,不同型号的单片机还可能存在其他功能脚位,如串口通信脚位(UART)、定时器脚位、PWM输出脚位等。
在实际应用中,根据需要选择合适的脚位并正确连接,以满足特定的功能要求。
第二章MCS-51系列单片机结构2.1MCS-51单片机基本结构在学习单片机的内部结构之前,先了解下现在正在使用的计算机的几大组成部,计算机有五个组成部份:运算器:用于实现算术和逻辑运算。
计算机的运算和处理都在这里进行;控制器:是计算机的控制指挥部件,使计算机各部份能自动协调的工作;存储器:用于存放程序和数据,又分为内存储器和外存储器;输入设备:用于将程序和数据输入到计算机;输出设备:用于把计算机数据,计算或加工的结果以用户需要的形式显示或保存;通常把运算器和控制器合在一起称为中央处理器(Central Processing Unit),简称CPU。
而把外存储器、输入设备和输出设备合在一起称之为计算机的外部设备。
2.1.1MCS-51单片机结构简介单片机(Microcontroller,又称微控制器)是在一块硅片上集成了各种部件的微型计算机。
这些部件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时器/计数器和多种I/O接口电路。
典型的MCS-51系列单片机由下图2.1所示的器件组成:图2.1 MCS-51单片机结构框图●中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
●数据存储器(RAM):8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
●程序存储器(ROM):8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
●定时/计数器:8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
●并行输入输出(I/O)口:8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。
单⽚机各引脚的介绍单⽚机各引脚的功能:①电源引脚:8051单⽚机的右上⾓即40脚接VCC,左下⾓即20脚接GND。
②输⼊/输出⼝(I/O):从39 脚起,为Port 0的开始引脚,即第39⾄32脚蹬8只脚为Port 0;Port 0的对⾯是Port 1,也就是第1脚到第8脚。
Port 1从第1脚开始,所以Port 2从其斜对脚第21脚开始,也就是在右下⽅,第21脚到第28脚就是Port 2.同样的,Port 2的对⾯就是Port 3,第10脚到第17脚就是Port 3.39,1,21,10就是这4个Port的开始引脚。
③复位引脚对于8051⽽⾔,只要复位引脚接⾼电平超过2个机器周期(约2µs),即可产⽣复位操作。
⽽8051的复位引脚在Port 1和Port 3之间,即第9脚。
辅助记忆的⽅法“系统久久不动就要按⼀下Reset钮以复位系统”,这久久就是第9脚的谐⾳。
④频率引脚微控制器都需要时钟脉冲,⽽在引脚上⽅的两只引脚,即19,18脚,就是时钟引脚,分别是XTAL1,XTAL2.⑤存储器引脚8051内部有存储器,外部也可接存储器。
使⽤内部存储器还是外部存储器,则须视31脚(Port 0下⾯那只脚)⽽定。
31脚就是EA'引脚,即访问外部存储器使能引脚。
当EA'=1时,系统使⽤内部存储器;当EA'=0时,系统使⽤外部存储器。
⑥外部存储器控制引脚现在就剩下EA'引脚下⾯的两个引脚了,这两只引脚与EA'引脚有点类似,都是控制存储器的,说明如下。
30脚为地址锁存允许信号ALE(Address Latch Enable),其功能是在访问外部存储器时,送出⼀个将原本在Port 0中的地址(A0-A7地址)锁存在外部锁存器IC的信号,让Port 0空出来,以传输数据。
29脚为程序存储器允许输出端PSEN'(Program Storess ENable),其功能也是访问外部存储器。
下面按其引脚功能分为四部分叙述这40条引脚的功能。
1、主电源引脚VCC和VSSVCC——(40脚)接+5V电压;VSS——(20脚)接地。
2、外接晶体引脚XTAL1和XTAL2XTAL1(19脚)接外部晶体的一个引脚。
在单片机部,它是一个反相放大器的输入端,这个放大器构成了片振荡器。
当采用外部振荡器时,对HMOS单片机,此引脚应接地;对CHMOS 单片机,此引脚作为驱动端。
XTAL2(18脚)接外晶体的另一端。
在单片机部,接至上述振荡器的反相放大器的输出端。
采用外部振荡器时,对HMOS单片机,该引脚接外部振荡器的信号,即把外部振荡器的信号直接接到部时钟发生器的输入端;对XHMOS,此引脚应悬浮。
3、控制或与其它电源复用引脚RST/VPD、ALE/PROG、PSEN和EA/VPP①RST/VPD(9脚)当振荡器运行时,在此脚上出现两个机器周期的高电平将使单片机复位。
推荐在此引脚与VSS引脚之间连接一个约8.2k的下拉电阻,与VCC引脚之间连接一个约10μF的电容,以保证可靠地复位。
VCC掉电期间,此引脚可接上备用电源,以保证部RAM的数据不丢失。
当VCC主电源下掉到低于规定的电平,而VPD在其规定的电压围(5±0.5V),VPD就向部RAM提供备用电源。
②ALE/PROG(30脚):当访问外部存贮器时,ALE(允许地址锁存)的输出用于锁存地址的低位字节。
即使不访问外部存储器,ALE端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6。
因此,它可用作对外输出的时钟,或用于定时目的。
然而要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。
ALE端可以驱动(吸收或输出电流)8个LS型的TTL输入电路。
对于EPROM单片机(如8751),在EPROM编程期间,此引脚用于输入编程脉冲(PROG)。
③PSEN(29脚):此脚的输出是外部程序存储器的读选通信号。
在从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN有效。
本实验程序是凌阳SPCE61A单片机的程序代码!希望大家能够把单片机学好,部分程序有C语言版本的,有一部分没有,我认为C语言版本的其实是按照汇编版的改编的,都是大同小异,所以后面一部分中断程序就没有写C语言版本的!望理解^_^//使用汇编语言实现A 口的输出.RAM.CODE.public _main.define P_IOA_Dir 0X7002.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_watchdog_clear 0X7012 _main:R1=0x00FF //初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1 = 0x0000[P_IOA_Data] = R1LP1: [P_IOA_Data] = R1R1 += 1CALL delayR2 = 0X0001 //清狗[P_watchdog_clear] = R2JMP LP1delay: .PROCBP = 0LPN: BP += 1CMP BP,0X9000JNZ LPNRETF.ENDP//使用C语言实现A 口的输出#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_watchdog_clear (volatile unsigned int *)0X7012 int main (void){unsigned int i = 0 ,j = 0;*P_IOA_Dir = 0xffff;*P_IOA_Attrib = 0xffff;*P_IOA_Data = 0x0000;while (1){for (i = 0;i <= 255;++i){for (j = 0 ; j <= 2222; ++j) //延时,可以更改*P_IOA_Data = i ;*P_watchdog_clear = 0x0001;}}}//使用汇编语言实现A 口作为输入口、B 口作为输出口.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012_main:R1=0x0000 //A口初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1[P_IOA_Data] = R1R1=0x00FF //B口初始化[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1LPP:R1 = [P_IOA_Data] //键盘程序调用取键值CMP R1,0JZ LP2CALL delayR2 = [P_IOA_Data]CMP R1,R2JZ LP2[P_IOB_Data] = R1delay: .PROCBP = 0LPN: BP += 1CMP BP,0X9000JNZ LPNRETF.ENDPLP2: R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP LPP//使用C 语言实现A 口作为输入口、B 口作为输出口#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_IOB_Data (volatile unsigned int *)0X7005 #define P_IOB_Dir (volatile unsigned int *)0X7007 #define P_IOB_Attrib (volatile unsigned int *)0X7008 #define P_watchdog_clear (volatile unsigned int *)0X7012 int f (unsigned int t){unsigned int s;t = *P_IOA_Data;if (t == 0 )return t;else{delay();s = *P_IOA_Data;if (t ==s)return t;elsereturn 0;}}void delay (void){unsigned int m;for(m = 0;m<100; ++m){*P_watchdog_clear = 0x0001;}}int main (void){unsigned int i,t;*P_IOA_Dir = 0x0000; // //A口初始化*P_IOA_Attrib = 0x0000;*P_IOA_Data = 0x0000;*P_IOB_Dir = 0x00FF; //B口初始化*P_IOB_Attrib = 0x00FF;*P_IOB_Data = 0x0000;while (1){t = *P_IOA_Data; //取键值i = f(t); //返回键值if (i == 0)*P_IOB_Data = i;else{*P_IOB_Data = i;}*P_watchdog_clear = 0x0001;}}//使用汇编语言实现A 口的输出//系统时钟.RAM.CODE.public _main.define P_IOA_Dir 0X7002 .define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000 .define P_SystemClock 0X7013 .define P_watchdog_clear 0X7012_main:R1 = 0X0000 //24.576MHZ[P_SystemClock] = R1R1=0x00FF //初始化[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1 = 0x0000[P_IOA_Data] = R1LP1: [P_IOA_Data] = R1CALL delayCALL delayR1 = 0XFFFF[P_IOA_Data] = R1CALL delayCALL delaydelay: .PROCBP = 0xFFFFLPN: BP -= 1JNZ LPNRETF.ENDPR2 = 0X0001 //清狗[P_watchdog_clear] = R2JMP LP1//系统时钟//使用C语言实现A 口的输出#define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 #define P_SystemClock (volatile unsigned int *)0X7013 #define P_watchdog_clear (volatile unsigned int *)0X7012 int main (void){unsigned int i,j;*P_IOA_Dir = 0x00FF;*P_IOA_Attrib = 0x00FF;*P_IOA_Data = 0x0000;*P_SystemClock = 0x0000;while (1){for (i = 0;i < 2222;++i)for (j = 0;j < 22;++j){*P_IOA_Data = 0x0000 ;*P_watchdog_clear = 0x0001;}for (i = 0;i < 2222;++i)for (j = 0;j < 22;++j){*P_IOA_Data = 0xFFFF ;*P_watchdog_clear = 0x0001;}}}//使用汇编语言定时器TimerA.RAM.CODE.public _main.define P_IOB_Dir 0x7007.define P_IOB_Attrib 0x7008.define P_IOB_Data 0x7005.define P_watchdog_clear 0x7012.define P_TimerA_Data 0x700A.define P_TimerA_ctrl 0x700B_main:R1=0x0FFF //B口初始化同相低电平输出[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1R1 = 0x0215 // 输入256HZ 输出1秒占空比8/16[P_TimerA_ctrl] = R1R1 = 0xFFEF //计数初值[P_TimerA_Data] = R1LP1:R2 = 0x0001 //清狗[P_watchdog_clear] = R2 JMP LP1//使用C语言定时器TimerA#define P_IOB_Data (volatile unsigned int *)0X7005 #define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_TimerA_Data (volatile unsigned int *)0X700A #define P_TimerA_ctrl (volatile unsigned int *)0X700Bint main (void){*P_IOB_Dir = 0x0F00; //B口初始化同相低电平输出*P_IOB_Attrib = 0x0F00;*P_IOB_Data = 0x0000;*P_TimerA_ctrl = 0x0215; // 输入256HZ 输出1秒占空比8/16*P_TimerA_Data = 0xFFEF; //计数初值while (1){*P_watchdog_clear = 0x0001;}}// 使用汇编语言A/D转换.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012.define P_ADC_MUX_Ctrl 0X702B.define P_ADC_Ctrl 0X7015.define P_ADC_MUX_Data 0X702C_main:R1=0x0000 //A口初始化悬浮输入口[P_IOA_Dir] = R1[P_IOA_Data] = R1R1=0x00FF[P_IOA_Attrib] = R1[P_IOB_Dir] = R1 //B口初始化同相低电平输出口[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1R1=0x0001 //选择通道LINE_IN为IOA0[P_ADC_MUX_Ctrl] = R1R1=0x0001 //允许A/D转换[P_ADC_Ctrl] = R1ZH:R1 = [P_ADC_MUX_Data] //判断是否转换完成? 读取P_ADC_MUX_Data的值TEST R1,0x8000JZ ZHR1 = [P_ADC_MUX_Data]R1 = R1 LSR 4R1 = R1 LSR 2[P_IOB_Data] = R1R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP ZH// 使用C语言A/D转换#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0X7005#define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_ADC_MUX_Ctrl (volatile unsigned int *)0X702B#define P_ADC_Ctrl (volatile unsigned int *)0X7015#define P_ADC_MUX_Data (volatile unsigned int *)0X702Cint main (void){unsigned int i ;unsigned int j ;*P_IOA_Dir = 0x0000 ; //A口初始化悬浮输入口*P_IOA_Data = 0x0000 ;*P_IOA_Attrib = 0x00FF ;*P_IOB_Dir = 0x00FF ; //B口初始化同相低电平输出口*P_IOB_Attrib = 0x00FF ;*P_IOB_Data = 0x0000 ;*P_ADC_MUX_Ctrl = 0x0001; //选择通道LINE_IN为IOA0*P_ADC_Ctrl = 0x0001 ; //允许A/D转换for(i = 0;i < 5;++i) ; //等待while(1){i = *P_ADC_MUX_Data ; //判断是否转换完成? 读取P_ADC_MUX_Data的值i = i & 0x8000 ;if(i == 0);else{j = *P_ADC_MUX_Data;j >>= 6 ; //右移6位*P_IOB_Data = j ;}*P_watchdog_clear = 0X0001 ; //清狗}}//使用汇编语言实现A 口作为输入口、B 口作为输出口触键唤醒.RAM.CODE.public _main.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_watchdog_clear 0X7012.define P_INT_Ctrl 0X7010.define P_IOA_Latch 0X7004.define P_SystemClock 0X7013.define P_INT_Clear 0X7011_main:R1=0x00FD //设置IOA1为带下拉电阻的输入口,其他IOA口都设置为输出口[P_IOA_Dir] = R1[P_IOA_Attrib] = R1R1=0x0000[P_IOA_Data] = R1R1=0x00FF //B口初始化初始化IOB口为同相低电平输出口[P_IOB_Dir] = R1[P_IOB_Attrib] = R1R1=0x0000[P_IOB_Data] = R1INT OFFR1 = 0X0080 //开启唤醒中断[P_INT_Ctrl] = R1R1 = 0X0000 //熄灭灯[P_IOB_Data] = R1R1 = [P_IOA_Latch] //锁存IOA数据[P_IOA_Data]INT IRQR1 = 0X0007 //睡眠[P_SystemClock] = R1LP2: R1 = 0X0001 //清狗[P_watchdog_clear] = R1JMP LP2.TEXT.PUBLIC _IRQ3_IRQ3:INT OFFPUSH R1,R4 TO [SP]R1 = 0X0080 //是否是触键唤醒TEST R1,[P_INT_Ctrl]JZ EXITR1 = 0XFFFF //点亮8颗灯[P_IOB_Data] = R1EXIT:R1 = 0X0080 //清中断[P_INT_Clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.END//使用C 语言实现A 口作为输入口、B 口作为输出口#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0X7005#define P_IOB_Dir (volatile unsigned int *)0X7007#define P_IOB_Attrib (volatile unsigned int *)0X7008#define P_watchdog_clear (volatile unsigned int *)0X7012#define P_INT_Ctrl (volatile unsigned int *)0X7010#define P_IOA_Latch (volatile unsigned int *)0X7004#define P_SystemClock (volatile unsigned int *)0X7013#define P_INT_Clear (volatile unsigned int *)0X7011int main(void){unsigned int i ;ASM (" INT OFF ") ;*P_IOA_Dir = 0x00FD ; //设置IOA1为带下拉电阻的输入口,其他IOA口都设置为输出口*P_IOA_Attrib = 0x00FD;*P_IOA_Data = 0x0000;*P_IOB_Dir = 0x00FF ; //B口初始化初始化IOB口为同相低电平输出口*P_IOB_Attrib = 0x00FF;*P_IOB_Data = 0x0000;*P_INT_Ctrl = 0X0080; //开启唤醒中断*P_IOB_Data = 0X0000; //熄灭灯i = *P_IOA_Latch ; //锁存IOA数据ASM (" INT IRQ ") ; //开中断*P_SystemClock = 0X0007; //睡眠while(1){*P_watchdog_clear = 0X0001 ; //清狗}}unsigned int t;void IRQ3(void)__attribute__((ISR));void IRQ3(void){t = *P_INT_Ctrl ;if (t == 0X0080 ){*P_IOA_Data = 0XFFFF ;*P_INT_Clear = 0X0080;}else*P_INT_Clear = 0X0080;}//使用汇编语言:IRQ6 中断.DEFINE P_IOA_DATA 0x7000.DEFINE P_IOA_DIR 0x7002.DEFINE P_IOA_ATTRI 0x7003.DEFINE P_IOB_DATA 0x7005.DEFINE P_IOB_DIR 0x7007.DEFINE P_IOB_ATTRI 0x7008.DEFINE P_INT_CTRL 0x7010.DEFINE P_INT_CLEAR 0x7011.DEFINE P_WatchDog_Clear 0x7012.DEFINE P_Timebase_setup 0x700e.RAM.VAR G_Time1.VAR G_Time2.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //设置IOA口为同相高电平输出口[P_IOA_ATTRI] = R1[P_IOA_DIR] = R1[P_IOA_DATA] = R1R1 = 0xFFFF //设置IOB口为同相高电平输出口[P_IOB_ATTRI] = R1[P_IOB_DIR] = R1[P_IOB_DATA] = R1R1 = 0x0003[P_Timebase_setup] =R1R1 = 0x0003 //开中断IRQ6_C_Tmb1和IRQ6_C_Tmb2 [P_INT_CTRL] = R1R1 = 0x0000[G_Time1] = R1[G_Time2] = R1INT I RQL_Loop:R1 = 0x0001[P_WatchDog_Clear] = R1JMP L_Loop.TEXT.PUBLIC _IRQ6_IRQ6:PUSH R1,R5 to [sp] //压栈保护R1 = 0x0001TEST R1,[P_INT_CTRL] //比较是否为IRQ6_C_Tmb2的中断源JNZ L_IRQ6_C_Tmb2 //是,则转至对应程序段L_IRQ6_C_Tmb1: //否,则进入IRQ6_C_Tmb1程序段;R2 = [G_Time1]R2 += 0x0001[G_Time1] = R2CMP R2,64 //比较是否为1秒;JBE L_LED1_OFF //小于等于则LED灭;R1 = 0xfff0 //大于则LED亮;[P_IOA_DATA] = R1CMP R2,128 //比较是否为两秒;JBE L_LED1_RET //小于等于则LED继续亮;R2 = 0x000 //否则,G_Time1单元清零,返回中断;[G_Time1] =R2JMP L_LED1_RETL_LED1_OFF:R1 = 0xFFFF[P_IOA_DATA] = R1L_LED1_RET:R1 = 0x0002[P_INT_CLEAR] = R1R1 = 0x0001[P_WatchDog_Clear] = R1POP R1,R5 FROM [sp]RETIL_IRQ6_C_Tmb2:R2 = [G_Time2]R2 += 0x0001[G_Time2] = R2CMP R2,64 //比较是否为0.5秒;JBE L_LED2_OFF //小于等于则LED灭;R1 = 0xfff0 //大于则LED亮;[P_IOB_DATA] = R1CMP R2,128 //比较是否为1秒;JBE L_LED2_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time2单元清零,返回中断;[G_Time2] = R2JMP L_LED2_RETL_LED2_OFF:R1 = 0xFFFF[P_IOB_DATA] = R1L_LED2_RET:R1 = 0x0001[P_INT_CLEAR] = R1POP R1,R5 from [sp] RETI//使用汇编语言IRQ4.define P_IOA_DATA 0x7000.define P_IOA_DIR 0x7002.define P_IOA_ATTRI 0x7003.define P_IOB_DATA 0x7005.define P_IOB_DIR 0x7007.define P_IOB_ATTRI 0x7008.define P_INT_CTRL 0x7010.define P_INT_CLEAR 0x7011.define P_watchdog_clear 0x7012.RAM.VAR G_Time1.VAR G_Time2,G_Time4.CODE.public _main_main:INT OFFR1 = 0xFFFF //IOA口为同相高电平输出口;[P_IOA_ATTRI] = R1[P_IOA_DIR] = R1R1 = 0x0000[P_IOA_DATA] = R1R1 = 0x0070 //开中断IRQ4_4KHz、IRQ4_2KHz和IRQ4_1KHz[P_INT_CTRL] = R1R1 = 0x0000[G_Time1] = R1[G_Time2] = R1[G_Time4] = R1INT IRQL_Loop:R1 = 0x0001 //清狗等待中断[P_watchdog_clear] = R1JMP L_Loop.TEXT.PUBLIC _IRQ4_IRQ4:PUSH R1,R5 to [sp] //压栈保护;R1 = 0x0010TEST R1,[P_INT_CTRL] //比较是否为1KHz的中断源;JNZ LED2kHZ_OFF //是,则转至对应程序段;R1 = 0x0020TEST R1,[P_INT_CTRL] //否,则比较是否为2KHz的中断源;JNZ IRQ4_2k //是,则转至对应程序段;L_IRQ4_4k: //否,则进入4KHz程序段;R2 = [G_Time4]R2 += 0x0001[G_Time4] = R2CMP R2,1024 //比较JBE LED4kHZ_OFF //小于等于则LED灭;R1 = 0x00f0 //大于则LED亮;[P_IOA_DATA] = R1CMP R2,2048 //比较JBE LED2kHZ_OFF //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time4单元清零,返回中断;[G_Time4] = R2JMP LED2kHZ_OFFLED4kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED2kHZ_OFF:R1 = 0x0040POP R1,R5 from [sp]RETIIRQ4_2k:R2 = [G_Time2]R2 += 0x0001[G_Time2] = R2CMP R2,1024 //比较JBE LED2kHZ_OFF //小于等于则LED灭;R1 ^= 0x000C //大于则LED亮;[P_IOA_DATA] = R1CMP R2,2048 //比较;JBE LED2kHz_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time2单元清零,返回中断;[G_Time2] = R2JMP LED2kHz_RETLED2kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED2kHz_RET:R1 = 0x0020POP R1,R5 from [sp]RETILED2kHZ_OFF:R2 = [G_Time1]R2+ = 0x0001[G_Time1] = R2CMP R2,1024 //比较;JBE LED1kHZ_OFF //小于等于则LED灭;R1 = 0x0003 //大于则LED亮;[P_IOA_DATA] = R1CMP R2, 2048 //比较;JBE LED1kHz_RET //小于等于则LED继续亮;R2 = 0x0000 //否则,G_Time1单元清零,返回中断;[G_Time1] = R2JMP LED1kHz_RETLED1kHZ_OFF:R1 = 0x0000[P_IOA_DATA] = R1LED1kHz_RET:R1 = 0x0010POP R1,R5 from[sp] RETI//使用汇编语言外部中断EXT1、EXT2.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_FeedBack 0X7009.define P_INT_Ctrl 0x7010.define P_INT_clear 0x7011.define P_Timebase_setup 0x700E.define P_watchdog_clear 0X7012.RAM.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //IOA口为同相低电平输出[P_IOA_Attrib] = R1[P_IOA_Dir] = R1R1 = 0x0000[P_IOA_Data] = R1R1 = 0x0000 //IOB2 、IOB3 口为上拉电阻输入[P_IOB_Attrib] = R1[P_IOB_Dir] = R1R1 = 0x0001[P_IOB_Data] = R1R1 = 0X000C //设置IOB 口为特殊功能[P_FeedBack] = R1R1 = 0X0300 //开启IRQ3_EXT1,IRQ3_EXT2 中断[P_INT_Ctrl] = R1INT IRQLP1:R1 = 0X0001[P_watchdog_clear] = R1JMP LP1//外部中断.TEXT.PUBLIC _IRQ3_IRQ3:INT OFFPUSH R1,R4 TO [SP]R1 = 0X0200 //是否是EXT2 中断TEST R1,[P_INT_Ctrl]JNZ IRQ3_EXT2 // 是否是EXT2,是则跳转到EXT2R1 = 0X0100TEST R1,[P_INT_Ctrl]JNZ IRQ3_EXT1 // 是否是EXT1,是则跳转到EXT1R1 = 0X0380[P_INT_clear] = R1POP R1,R4 FROM [SP]RETIIRQ3_EXT1:R1 = 0X00F0[P_IOA_Data] = R1R1 = 0X0100[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETIIRQ3_EXT2:R1 = 0X000F[P_IOA_Data] = R1R1 = 0X0200[P_INT_clear] = R1 POP R1,R4 FROM [SP] INT IRQRETI//使用汇编语言外部中断IRQ0 1 2.define P_IOA_Dir 0X7002 //定义地址.define P_IOA_Attrib 0X7003.define P_IOA_Data 0X7000.define P_IOB_Dir 0X7007.define P_IOB_Attrib 0X7008.define P_IOB_Data 0X7005.define P_FeedBack 0X7009.define P_INT_Ctrl 0x7010.define P_INT_clear 0x7011.define P_watchdog_clear 0X7012.define P_TimerA_Data 0x700A.define P_TimerA_ctrl 0x700B.define P_TimerB_Data 0x700C.define P_TimerB_ctrl 0x700D.RAM.CODE.PUBLIC _main_main:INT OFFR1 = 0xFFFF //IOA口为同相低电平输出[P_IOA_Attrib] = R1[P_IOA_Dir] = R1R1 = 0x0000[P_IOA_Data] = R1R1 = 0xFFFF //IOB口为同相低电平输出[P_IOB_Attrib] = R1[P_IOB_Dir] = R1R1 = 0x0000[P_IOB_Data] = R1R1 =0x0034 //4096hz[P_TimerA_ctrl] = R1R1 = 0xDFFF[P_TimerA_Data] = R1R1 =0x0004 //4096hz[P_TimerB_ctrl] = R1R1 = 0xEFFF[P_TimerB_Data] = R1R1 = 0x5400 //开启IRQ3_EXT1,IRQ3_EXT2 中断[P_INT_Ctrl] = R1INT IRQLP1:R1 = 0X0001[P_watchdog_clear] = R1JMP LP1//外部中断.TEXT.PUBLIC _IRQ0_IRQ0:INT OFFPUSH R1,R4 TO [SP]R1 = 0x4000 // 中断[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.TEXT.PUBLIC _IRQ1_IRQ1:INT OFFPUSH R1,R4 TO [SP]R1 = [P_IOA_Data]R1 ^= 0x000F[P_IOA_Data] = R1R1 = 0x1000[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI.TEXT.PUBLIC _IRQ2_IRQ2:INT OFFPUSH R1,R4 TO [SP]R1 = [P_IOB_Data]R1 ^= 0x000F[P_IOB_Data] = R1R1 = 0x0400[P_INT_clear] = R1POP R1,R4 FROM [SP]INT IRQRETI目前做了这么多实验,实验程序共享给大家!希望大家能够把单片机学好!^_^ ^_^ ^_^ ^_^ ^_^。
单片机引脚的定义与功能详解单片机引脚的定义与功能详解1 产品简介还有我发现一个很特别的地方,这是以前我玩32/51都没有的,那就是上拉电阻阻值大小是可以选择的,可编程选择,芯圣的产品又一次让我惊讶GPIO_Init(GPIOT0,GPIO_PIN_2,GPIO_MODE_IN_PU); //将P02端口设置为上拉电阻模式GPIO_P02ExternalPullConfig(R100K); //将P02端口上拉电阻设置为100Kwhile(1);}就可以将P02端口上拉电阻设置为100K然后介绍一下HC89f003的重映射功能:Datasheet介绍:让我们看看怎么重映射吧,我尽量简单明了讲一下。
什么是重映射:一般的单片机上有很多I/O口,也有很多的内置外设如I2C、ADC、ISP、USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。
很多复用内置的外设的I/O 引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。
读到这里相信大家都应该了解了端口重映射的一些概念了。
原理上的东西不细说了。
大家可以看手册或者网上查,这方面的资料还是很多的。
从芯圣的datasheet我们可以知道,基本上所有的io口,都是可以实现重映射的,那我们看看pwm输出能映射到哪个io口呢,PWM3_OUTPin_P00 = (u8)0x00, //PWM3输出端口为P00PWM3_OUTPin_P01 = (u8)0x01, //PWM3输出端口为P01PWM3_OUTPin_P02 = (u8)0x02, //PWM3输出端口为P02PWM3_OUTPin_P03 = (u8)0x03, //PWM3输出端口为P03PWM3_OUTPin_P04 = (u8)0x04, //PWM3输出端口为P04。
一、P0端口的结构及工作原理P0端口8位中的一位结构图见下图:由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。
再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。
下面,我们先就组成P0口的每个单元部份跟大家介绍一下:先看输入缓冲器:在P0口中,有两个三态的缓冲器,在学数字电路时,我们已知道,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态),大家看上图,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为‘读锁存器’端)有效。
下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为‘读引脚’的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的内部数据总线上。
D锁存器:构成一个锁存器,通常要用一个时序电路,时序的单元电路在学数字电路时我们已知道,一个触发器可以保存一位的二进制数(即具有保持功能),在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。
大家看上图中的D锁存器,D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,Q非是反向输出端。
对于D触发器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(也就是时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端Q非的。
如果时序控制端CP的时序脉冲一旦到了,这时D 端输入的数据就会传输到Q及Q非端。
数据传送过来后,当CP时序控制端的时序信号消失了,这时,输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来了)。
如果下一个时序控制脉冲信号来了,这时D端的数据才再次传送到Q端,从而改变Q端的状态。
多路开关:在51单片机中,当内部的存储器够用(也就是不需要外扩展存储器时,这里讲的存储器包括数据存储器及程序存储器)时,P0口可以作为通用的输入输出端口(即I/O)使用,对于8031(内部没有ROM)的单片机或者编写的程序超过了单片机内部的存储器容量,需要外扩存储器时,P0口就作为‘地址/数据’总线使用。
单片机引脚,单片机引脚是什么意思8051单片机引脚功能介绍首先我们来连接一下单片机的引脚图,如果,具体功能在下面都有介绍。
单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O弓I脚。
1.电源:⑴VCC-芯片电源,接+5V;⑵VSS-接地端;2.时钟:XTAL1、XTAL2-晶体振荡电路反相输入端和输出端。
3.控制线:控制线共有4根,⑴ALE/PROGfe址锁存允许/片内EPRO褊程脉冲①ALE功能:用来锁存P0口送出的低8位地址②PRO创能:片内有EPRO附芯片,在EPROltt程期间,此引脚输入编程脉冲。
(2)PSEN:外ROMS选通信号。
⑶RST/VPD复位/备用电源。
①RST(Reset)功能:复位信号输入端。
②VPD功能:在Vcc掉电情况下,接备用电源。
⑷EA/Vpp:内外ROMfe择/片内EPRO编程电源。
①EA功能:内外RO忧择端。
②Vpp功能:片内有EPROM1芯片,在EPRO编程期间,施加编程电源Vppo4.I/O线80C51共有4个8位并行I/O端口:PRP1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
〈51单片机引脚图及引脚功能〉拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。
1、电源:这当然是必不可少的了。
单片机使用的是5V 电源,其中正极接40 管脚,负极(地)接20管脚。
2、振源电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
只要买来晶体震荡器,电容,连上就能了,按图1接上即可。
3、复位管脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。
4、EA 管脚:EA 管脚接到正电源端。
至此,一个单片机就接好,通上电,单片机就开始工作了。
我们的第一个任务是要用单片机点亮一只发光二极管LER 显然,这个LED 必须要和单片机的某个管脚相连,不然单片机就没法控制它了,那么和哪个管脚相连呢?单片机上除了刚才用掉的5个管脚,还有35个,我们将这个LED 和1脚相连。
89S51学习开发用户板演示软件使用说明89S51学习开发用户板资源:89S51 40脚IC一片:用于插入CPU芯片。
CPU周围共有4 X 8=32个跳线器,分别对应P0,P2,P1,P3口线选择:89S系列单片机在线可编程接口及程序下载保护开关SW1。
跳线器位于上方则:焊盘P0.(00—07)与CPU的P0.0—P0.7口一一对应焊盘P2.(20—27)与CPU的P2.0—P2.7口一一对应焊盘P3.(30—37)与CPU的P3.0—P3.7口一一对应同时:P3.0口对应RS232的RX端P3.1口对应RS232的TX端焊盘P1.(10—17)与CPU的P1.0—P1.7口一一对应。
跳线器位于下方则:数码管L1(笔段A—G)与CPU的P0.0—P0.6口一一对应数码管L2(笔段A--G)与CPU的P2.0—P2.6口一一对应此时如蜂鸣器旁跳线器位于BP端则P2.7与蜂鸣器连接如蜂鸣器旁跳线器位于L2端则P2.7与L2的小数点端连接指示灯(D10—D17)与CPU的P1.0—P1.7口一一对应。
按钮S0—S3与CPU的P3.0—P3.3口一一对应地址开关SW1-4与CPU的P3.4—P3.7口一一对应注意:LED1-2及D10-D17均为共阳接法,因此低电平点亮LED及指示灯。
按钮S0-S3按下时接地,地址开关SW1-SW4位于ON位置时接地RESET为RESET开关。
OSC为晶体焊盘区。
小LED为电源指示灯。
P4口的ALE,PSN,RST与CPU 的ALE,PSTN,RESET端直接相连,用于系统扩展。
电源输入为:+5V。
本用户板可完成16个功能各异的小模块组成的实验,由红色的地址开关选择程序入口,即将地址开关SW2拨至0-15 (SW21-SW24对应20------23,且位于ON位置有效),按RESET 按键即可!适合单片机爱好者学习单片机编程用,只需通过下载线将编译软件编译生成的BIN或HEX文件下载到单片机内,也可配上仿真器联机运行。
#define IOA4 (*(volatile BIT *)(P_IOA_Data)).bit4
#define DATA IOA4
////////////////////////////////////////////////////////////////////
//BitOpt.h比特操作
//作者:DreagonWoo
//时间:2010年
/********************************************************************
对数据类型为8比特和16比特的数据进行位读写0、1操作,
这样凌阳编译环境就能像51编译环境那样类似bit name = P1.1的语法
全局变量
BIT16 *bitPort = (BIT16*)P_IOA_Data;
xxProject.h文件
#define DIO WRB0(bitPort)//读写
#define DIO_0 B0(bitPort,0)//写0
xxProject.c文件
DIO = 1;
DIO_0;
********************************************************************/
#ifndef _BITOPT_H
#define _BITOPT_H
typedef struct {
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}BIT8,*PBIT8;
typedef struct {
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
unsigned b8:1;
unsigned b9:1;
unsigned b10:1;
unsigned b11:1;
unsigned b12:1;
unsigned b13:1;
unsigned b14:1;
unsigned b15:1;
}BIT16,*PBIT16;
//Write
#define B0(ptr,bit) (ptr->b0 = bit) #define B1(ptr,bit) (ptr->b1 = bit) #define B2(ptr,bit) (ptr->b2 = bit) #define B3(ptr,bit) (ptr->b3 = bit) #define B4(ptr,bit) (ptr->b4 = bit) #define B5(ptr,bit) (ptr->b5 = bit) #define B6(ptr,bit) (ptr->b6 = bit) #define B7(ptr,bit) (ptr->b7 = bit) #define B8(ptr,bit) (ptr->b8 = bit) #define B9(ptr,bit) (ptr->b9 = bit) #define B10(ptr,bit) (ptr->b10 = bit) #define B11(ptr,bit) (ptr->b11 = bit) #define B12(ptr,bit) (ptr->b12 = bit) #define B13(ptr,bit) (ptr->b13 = bit) #define B14(ptr,bit) (ptr->b14 = bit) #define B15(ptr,bit) (ptr->b15 = bit)
//Write and Read
#define WRB0(ptr) (ptr->b0)
#define WRB1(ptr) (ptr->b1)
#define WRB2(ptr) (ptr->b2)
#define WRB3(ptr) (ptr->b3)
#define WRB4(ptr) (ptr->b4)
#define WRB5(ptr) (ptr->b5)
#define WRB6(ptr) (ptr->b6)
#define WRB7(ptr) (ptr->b7)
#define WRB8(ptr) (ptr->b8) #define WRB9(ptr) (ptr->b9) #define WRB10(ptr) (ptr->b10) #define WRB11(ptr) (ptr->b11) #define WRB12(ptr) (ptr->b12) #define WRB13(ptr) (ptr->b13) #define WRB14(ptr) (ptr->b14) #define WRB15(ptr) (ptr->b15)
#endif。