目录:
一、硬件描述
1、简介
2、程序下载
3、定时器
二、程序描述
1、中断号
3、关于xdata、code
4、bit、sbit、bdata以及sfr特殊功能寄存器
1)bit和sbit都是C51扩展的变量类型 2)bit位标量 3)sfr特殊功能寄存器
4)sbit 可定义可位寻址对象 5)sbit可录址位 6)bdata
三、程序调试
1、通过串口查看内部变量
2、STC15F硬仿真
1)安装Keil版本的仿真驱动 2)在Keil中创建项目 3)项目设置,选择STC仿真驱动
4)创建仿真芯片 5)开始仿真 6)硬件仿真显示支持新增的寄存器SFR
-----------------------------------------------------------------------------------------------------------------
一、硬件描述
1、简介
STC单片机内部集成MAX810专用复位电路。4路PWM,8路高速10位A/D 转换,针对电机控制,强干扰场合。
-----------------------------------------------------------
2、程序下载
STC单片机的ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序。详细介绍移步“STC_ISP下载软件问题汇总与解决”。
-----------------------------------------------------------
3、定时器
PCA(可编程计数器阵列Programmable Counter Array)模块可再实现4个16位定时器,提供增强的定时器功能,与标准8051计数器/定时器相比,它需要较少的CPU干预。
-----------------------------------------------------------------------------------------------------------------
二、程序描述
1、中断号
中断查询次序号就是中断号,例如:
void Int0_Routine(void) interrupt 0;
void Timer0_Routine(void) interrupt 1;
void Int1_Routine(void) interrupt 2;
void Timer1_Routine(void) interrupt 3;
void UART_Routine(void) interrupt 4;
void ADC_SPI_Routine(void) interrupt 5;
void PCA_LVD_Routine(void) interrupt 6;
-----------------------------------------------------------
一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_;整数循环_irol_ _testbit测试并清零位(相当于8051 JBC 指令)等时使用。
-----------------------------------------------------------
3、关于xdata、code
Flash相对单片机里的RAM属于外部存取器,虽其结构位置装在单片机中,其实xdata是放在相对RAM的外面,而flash正是相对RAM外面。
int a 变量定义在内部RAM中,
xdata int a 定义在外部RAM或flash中,uchar code a 定义在flash中。
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
//共阴的数码管段选,P2口要取的数值
若定义 uchar aa[5],aa[5]中的内容是存放在数据存储区(RAM)中的,在程序运行工程中各个数组元素的值可以被修改,掉电后aa[5]中的数据无法保存。
若定义 uchar code bb[5]中的内容是存放在程序存储区(如flash)中的,只有在烧写程序时,才能改变bb[5]中的各元素的值,在程序运行工程中无法修改,并且掉电后bb[5]中的数据不消失。
-----------------------------------------------------------
4、bit、sbit、bdata以及sfr特殊功能寄存器
1)bit和sbit都是C51扩展的变量类型
bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
--------------------------------
2)bit位标量
bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。
--------------------------------
3)sfr特殊功能寄存器
sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
sfr P1 = 0x90; //定义P1 I/O 口,其地址90H
sfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH)。
sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,如8052 的T2 定时器,可以定义为:
sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH
用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定时器0和1 的定义。
sfr是KEIL中用来定义硬件寄存器地址的关键字,具有定义硬件特性。举个例子:
sfr P0 =0x80
(C语言,这样就定义了51系列MCU中0x80地址,在编程时可以用P0符号代替地址0x80,具有定义硬件特性)
--------------------------------
4)sbit 可定义可位寻址对象
如访问特殊功能寄存器中的某位.其实这样应用是经常要用的,如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义:
(1)sbit 位变量名=位地址
sbit P1_1 = Ox91;
这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于80H-FFH 之间.
(2)sbit 位变量名=特殊功能寄存器名^位位置
sft P1 = 0x90;
sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法
(3)sbit 位变量名=字节地址^位位置
sbit P1_1 = 0x90 ^ 1;
这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示. 在C51存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:
unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ib
int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象
sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位
sbit ab12=ab[1]^12;
操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31.sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:
sfrt 变量名=地址值。
符号P1_0 来表示P1.0 引脚。在C 语言里,如果直接写P1.0,C 编译器并不能识别,而且P1.0 也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0 是不是就是P1.0呢?你这么认为,C 编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit 来定义,sbit 的用法有三种:
第一种方法:sbit 位变量名=地址值
第二种方法:sbit 位变量名=SFR 名称^变量位地址值
第三种方法:sbit 位变量名=SFR 地址值^变量位地址值
如定义PSW 中的OV 可以用以下三种方法:
sbit OV=0xd2 1说明:0xd2 是OV 的位地址值
sbit OV=PSW^2 2说明:其中PSW 必须先用sfr 定义好
sbit OV=0xD0^2 3说明:0xD0 就是PSW 的地址值
因此这里用sfr P1_0=P1^0;就是定义用符号P1_0 来表示P1.0 引脚,如果你愿意也可以起P10 一类的名字,只要下面程序中也随之更改就行了。
--------------------------------
4)sfr16 16位特殊功能寄存器
sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T0和T1。
--------------------------------
5)sbit可录址位
sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了
sfr P1 = 0x90; //因P1端口的寄存器是可位寻址的,所以我们可以定义
sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚
//同样我们可以用P1.1的地址去写,如sbit P1_1 = 0x91;
这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,我自己是一直用的。当然您也可以自己写自己的定义文件,用您认为好记的名字。
--------------------------------
6)bdata
将变量定义在可位寻址片内数据存储区,允许位与字节混合访问。
-----------------------------------------------------------------------------------------------------------------
三、程序调试
1、通过串口查看内部变量
STC低档单片机没有硬仿真功能,查看内部变量的值,可以通过串口发送到电脑。
详见“通信-RS232、RS485、RS422之八、单片机通过串口与其调试类软件通讯之3、调试类软件数据接收错误解决”。
-----------------------------------------------------------
2、STC15F硬仿真
详细资料参看“STC仿真器使用指南(教程)”。
1)安装Keil版本的仿真驱动
如上图,首先选择“Keil仿真设置”页面,点击“添加MCU型号到Keil中”,在出现的如下的目录选择窗口中,定位到Keil的安装目录(一般可能为“C:\Keil\”),“确定”后出现下图中右边所示的提示信息,表示安装成功。添加头文件的同时也会安装STC的Monitor51仿真驱动STCMON51.DLL,驱动与头文件的的安装目录如上图所示。
--------------------------------
2)在Keil中创建项目
若第一步的驱动安装成功,则在Keil中新建项目时选择芯片型号时,便会有“STC MCU Database”的选择项,如下图
然后从列表中选择响应的MCU型号,此处我们在此选择“STC15F2K60S2”的型号(实际需使用IAP15F2K61S2或IAP15L2K61S2等),点击“确定”完成选择
添加源代码文件到项目中,如下图:
保存项目,若编译无误,则可以进行下面的项目设置了
附加说明一点:
当创建的是C语言项目,且有将启动文件“STARTUP.A51”添加到项目中时,里面有一个命名为“IDATALEN”的宏定义,它是用来定义IDATA大小的一个宏,默认值是128,即十六进制的80H,同时它也是启动文件中需要初始化为0的IDATA的大小。所以当IDATA定义为80H,那么STARTUP.A51里面的代码则会将IDATA的00-7F的RAM初始化为0;同样若将IDATA定义为0FFH,则会将IDATA的00-FF的RAM初始化为0。
虽然STC15F2K60S2系列的单片机的IDATA大小为256字节(00-7F的DATA和80H-FFH的IDATA),但由于STC15F2K60S2在RAM的最后17个字节有写入ID号以及相关的测试参数,若用户在程序中需要使用这一部分数据,则一定不要将IDATALEN定义为256。
--------------------------------
3)项目设置,选择STC仿真驱动
如上图,首先进入到项目的设置页面,选择“Debug”设置页,第2步选择右侧的硬件仿真“Use …”,第3步,在仿真驱动下拉列表中选择“STC Monitor-51 Driver”项,然后点击“Settings”按钮,进入下面的设置画面,对串口的端口号和波特率进行设置,波特率一般选择115200或者57600。到此设置便完成了。
--------------------------------
4)创建仿真芯片
准备一颗IAP15F2K61S2或者IAP15L2K61S2芯片,并通过下载板连接到电脑的串口,然后如上图,选择正确的芯片型号,然后进入到“Keil仿真设置”页面,点击“将IAP15F2K61S2设置为2.0版仿真芯片”按钮或者“将IAP15L2K61S2设置为2.0版仿真芯片”按钮,当程序下载完成后仿真器便制作完成了。
--------------------------------
5)开始仿真
将制作完成的仿真芯片通过串口与电脑相连接。
将前面我们所创建的项目编译至没有错误后,按“Ctrl+F5”开始调试。
若硬件连接无误的话,将会进入到类似于下面的调试界面,并在命令输出窗口显示当前的仿真驱动版本号和当前仿真监控代码固件的版本号
断点设置的个数目前最大允许20个(理论上可设置任意个,但是断点设置得过多会影响调试的速度)。
--------------------------------
6)硬件仿真显示支持新增的寄存器SFR
-----------------------------------------------------------------------------------------------------------------