5 STC15F2K60S2单片机的程序设计 例题

合集下载

4 STC15F2K60S2 单片机的指令系统例题

4 STC15F2K60S2 单片机的指令系统例题

第4 章STC15F2K60S2 单片机的指令系统例题例4.1 分析执行下列指令序列后各寄存器及存储单元的结果。

MOV A, #30HMOV 4FH, AMOV R0, #20HMOV @R0, 4FHMOV 21H, 20HMOV DPTR,#3456H解:分析如下:MOV A, #30H ;(A)=30HMOV 4FH, A ;(4FH)=30HMOV R0, #20H ;(R0)=20HMOV @R0, 4FH ;((R0)) =(20H)=(4FH)=30HMOV 21H, 20H ;(21H)=(20H)=30HMOV DPTR,#3456H ;(DPTR)=3456H所以执行程序段后:(A)=30H,(4FH)=30H,(R0)=20H,(20H)=30H,(21H)=30H,(DPTR)=3456H52例4.2 将扩展RAM 2010H 中内容送扩展RAM 2020 单元中,用Keil C 集成开发环境进行调试。

解:(1)编程如下:ORG 0MOV DPTR,#2010H ;将16 位地址2010H 赋给DPTRMOVX A,@DPTR ;读扩展RAM 2010H 中数据至累加器AMOV DPTR,#2020H ;将16 位地址2020H 赋给DPTRMOVX @DPTR,A ;将累加器A 中数据送入外RAM 2020H 中END(2)按第4 章所学知识,编辑文件与编译好上述指令,进入调试界面,设置好被传送地址单元的数据,如66H,如图4.6 所示。

图4.6 程序执行前,设置2010H 地址单元内容与2020H 地址单元的状态单步或全速执行这4 条指令,观察程序执行后2010H 地址单元内容的变化。

53图4.7 程序执行后,2010H 地址单元内容与2020H 地址单元内容的变化从图4.6 和图4.7 可知,传送指令执行后,传送目标单元的内容与被传送单元的内容一致,同时,被传送单元的内容也不会改变。

单片微机原理与接口技术(第2版)-基于STC15系列单片机(习题部分与答案)(3)

单片微机原理与接口技术(第2版)-基于STC15系列单片机(习题部分与答案)(3)

单片微机原理与接口技术-基于STC15系列单片机(第2版)习题部分第1章一、填空题1. 125= 01111101B= 7d H=( 0001 0010 0101)8421BCD码=(0110001 0110010 0110101)ASCII码。

2. 微型计算机由CPU、存储器、I/O 接口以及连接他们的总线组成。

3. 微型计算机的CPU是通过地址总线、数据总线、控制总线与外围电路进行连接与访问的,其中,地址总线用于CPU寻址,地址总线的数据量决定CPU的最大寻址能力;数据总线用于CPU与外围器件爱存储器、I/O接口)交换数据,数据总线的数量决定CPU一次交换数据能力;控制总线用于确定CPU与外围器件的交换数据的类型。

4. I/O 接口的作用是CPU与输入/输出设备的连接桥梁,相当于一个数据转换器。

5. 按存储性质分,微型计算机存储器分为_ _程序存储器______和数据存储器两种类型。

6. 16位CPU是指数据总线的位数为16位。

7 若CPU地址总线的位数为16,那么CPU的最大寻址能力为64K 。

8. 微型计算机执行指令的顺序是按照在程序存储中的存放顺序执行的。

在执行指令时包含取指、指令译码、执行指令三个工作过程。

9. 微型计算机系统由微型计算机和输入/输出设备组成。

10. 微型计算机软件的编程语言包括高级语言、汇编语言和机器语言三种类型。

二、选择题1.当CPU的数据总线位数为8位时,标志着CPU一次交换数据能力为D。

A. 1位B. 4 位C. 16位D. 8位2. 当CPU地址总线为8位时,标志着CPU的最大寻址能力为 C 。

A. 8个空间B. 16个空间C. 256个空间D. 64K个空间3. 微型计算机程序存储器空间一般由 A 构成。

A. 只读存储器B. 随机存取存储器4. 微型计算机数据存储器空间一般由 B 构成。

A. 只读存储器B. 随机存取存储器三、判断题1. 键盘是微型计算机的基本组成部分。

STC15F2K60S2单片机定时器编程

STC15F2K60S2单片机定时器编程

STC15F2K60S2单片机定时器编程一、STC15F2K60S2 单片机定时器概述STC15F2K60S2 单片机内部集成了 5 个定时器,分别是 2 个 16 位的定时器/计数器 T0 和 T1,2 个 8 位的定时器 T2 和 T3,以及 1 个独立波特率发生器定时器T4。

这些定时器都具有不同的特点和应用场景。

T0 和 T1 是传统的 16 位定时器/计数器,可以工作在定时模式和计数模式。

在定时模式下,通过设置定时器的初值和溢出周期,可以实现精确的定时功能;在计数模式下,可以对外部脉冲进行计数。

T2 和 T3 是 8 位定时器,具有自动重载功能,使用起来更加方便。

T4 是独立波特率发生器定时器,主要用于串行通信中的波特率设置。

二、定时器的工作模式1、定时模式在定时模式下,定时器对内部的系统时钟进行计数。

通过设置定时器的初值和溢出周期,可以实现不同时长的定时功能。

例如,如果系统时钟频率为 12MHz,要实现 1ms 的定时,我们可以计算出定时器的初值为 65536 1000,然后将初值写入定时器的寄存器中。

2、计数模式在计数模式下,定时器对外部引脚输入的脉冲进行计数。

当计数值达到设定的阈值时,产生溢出中断。

三、定时器的相关寄存器1、定时器控制寄存器(TCON)TCON 寄存器用于控制定时器的启动、停止、溢出标志等。

例如,TR0 和 TR1 位分别用于控制 T0 和 T1 的启动和停止,TF0 和 TF1 位则分别表示 T0 和 T1 的溢出标志。

2、定时器模式寄存器(TMOD)TMOD 寄存器用于设置定时器的工作模式和计数方式。

例如,可以通过设置 TMOD 寄存器的某些位来选择定时器是工作在定时模式还是计数模式,以及是 8 位模式还是 16 位模式。

3、定时器初值寄存器(TH0、TL0、TH1、TL1、TH2、TL2、TH3、TL3)这些寄存器用于存储定时器的初值。

在定时模式下,通过设置初值可以控制定时器的溢出周期;在计数模式下,初值则决定了计数的阈值。

STC15F2K60S2单片机中断系统 例题

STC15F2K60S2单片机中断系统 例题

ORG 0100H MAIN:
MOV SP,#60H SETB IT0 SETB EX0 SETB EA LOOP: MOV A, P1 ANL A,#15H JNZ Trouble CLR P1.7 SJMP LOOP Trouble: SETB P1.7
;设定堆栈区域 ;设定外部中断 0 为下降沿触发方式 ;开放外部中断 0 ;开放总中断
void int0_isr( ) interrupt 0
{
Pl = i;
i <<= 1 ; if(i==0) i = 0xfe;
//移位 8 次后,i 将变为 0,需要重新赋值
} /*------------------------ 主函数------------------------*/
139
void main(void) {
汇编语言参考程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0_ISR
ORG 0l00H
MAIN:
MOV A,#0FEH ;设置 LED 灯起始驱动信号
SETB IT0
;设置外部中断 0 为下降沿触发方式
SETB EX0
;开放外部中断 0
SETB EA
;开放总中断
SJMP $
;读取 P1 口中断输入信号 ;截取中断输入信号 ;有中断请求,转 Trouble,熄灭正常工作指示灯 LED3 ;无中断请求,点亮 LED3 ;循环检查与判断
;熄灭 LED3
141
SJMP LOOP
;循环检查与判断
INT0_ISR:
JNB P1.0,No_Trouble_0 ;查询 0 号故障源,无故障转 No_Trouble_0,熄灭 LED0

亲手制作STC15F2K60S2单片机最小系统附图

亲手制作STC15F2K60S2单片机最小系统附图

亲手制作STC15F2K60S2单片机最小系统(文章中详细图片)STC15系列增强型8051单片机集成了上电复位电路与高精准R/C 振荡器,给单片机芯片加上电源就可跑程序;集成了大容量的程序存储器、数据存储器以及EEPRM ,集成了A/D 、PWM 、SPI 等高功能接口部件,可大大地简化单片机应用系统的外围电路,使单片机应用系统的设计更加简捷,系统性能更加高效、可靠。

STC12C5A60S2/AD/PWM 系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D 转换(250K/S ,即25万次/秒),针对电机控制,强干扰场合。

STC15系列中STC15F2K60S2单片机使用最为频繁,用户应用程序空间60K ,足以满足多数应用此芯片的用户编程,并且价格在中关村6.5左右。

下面自己亲手制用的STC15F2K60S2触到此芯片时能够快速上手。

下图中所有的引脚图已经全部引出。

的+5V两个30P电容后端接GNDSTC15F2K60S2引脚电路制作好,连接好以后,安装USB转串口PL2303的驱动做windows系统(windows xp或windows 7都可以,我使用的是windows7 64位),如果PL2303在windows 7 64位下下载时出现错误,请下载其它的此型号的驱动解决(实际中遇到过此问题,当然windows xp下试过没有出过错误,如果您的系统是windows xp的就不用担心了。

)使用下载时把PL2303的Rxd和单片机的Txd相连接,再把PL2303的Txd 和单片机的Rxd相连接,GND同接单片机GND, PL2303的+5V先不要同单片机连接,点上图中“下载/编程”后,再把PL2303的+5V先同单片机连接,此时就会看到程序下载到单片机了。

10 STC15F2K60S2系列单片机的AD转换器 例题

10 STC15F2K60S2系列单片机的AD转换器 例题
MOV R2,#249
DELAY_LOOP:
DJNZ R2,DELAY_LOOP
DJNZ R3,DELAY_LOOP1
DJNZ R4,DELAY_LOOP0
POP 04;恢复现场
CPL A
MOV P3, A;低8位送P2口LED灯显示
MOVADC_CONTR,#89H;重新启动A/D转换
RETI
DELAΥ:
PUSH 02;将寄存器组0的R2、R3、R4入栈
PUSH 03
PUSH 04
MOV R4,A;取最外循环的循环次数
DELAY_LOOP0:
MOV R3,#200
DELAY_LOOP1:
汇编语语言参考程序如下:
$INCLUDE(STC15F2K60S2.INC)
;包含STC15F2K60S2单片机寄存器定义文件,若无现成的STC15F2K60S2.INC文件,
;则可以用“EQU”和“DATA”直接对A/D转换用到的新增特殊功能寄存器进行定义
ADC_DATAEQU 30H;定义A D转换结果保存单元
ADC_CONTR=0x81;//清A/D转换结束标志位
adc_data=ADC_RES;//保存A/D转换结果
P2=~ADC_RES;//送P2口LED灯显示
}
}
例10.2编程实现利用STC15F2K60S2单片机ADC通道1采集外部模拟电压信号,10位精度,·采用中断方式进行转换,并将转换结果保存于30H和31H单元中,并送P3和P2口LED灯显示(低电平驱动),P3口LED灯显示最高2位,P2口LED灯显示低8位。设时钟频率为18.432MHz。
MOV ADC_DATA,A;保存A/D转换结果
CPL A

【2019年整理】基于STC15F2K60S2单片机开发板设计制作

【2019年整理】基于STC15F2K60S2单片机开发板设计制作

基于STC15F2K60S2单片机开发板设计制作摘要单片机开发板的介绍单片机开发板是一块电路板和诸多元器件组合在一起供平时的学习、实验、开发等使用;是正式批量生产产品前,对产品进行设计和开发时使用的板子。

我们学习单片机,开始是对理论知识的学习,学习了一些指令和相关单片机结构的知识,而单片机开发板就是我们实践的工具,通过开发板我们可以做一些实验,从而掌握所学的知识。

打个比较通俗的例子:我们编写的代码是“软件”,而开发板是“硬件”,两者结合才会有用,如果只有代码,只有模拟的实验结果而不经过板子实践是学不好的,也掌握不了单片机。

简单概括说开发板实际上就是个多功的实验板,是学习单片机和开发单片机产品的好帮手。

上面集成了好多单片的的外围器件,如LED灯、数码管、按键、行列式按键、步进电机、伺服电机、液晶显示等等,利用一个开发板就可以编制不同的程序实现各种各样的功能,不用为了一个实验焊一块电路板了。

在开发板上设计、调试好程序,就能方便地移植到产品上,只是有时要作适当的修改,比如端口的设置等,因为毕竟开发板和产品的电路板不可能完全一致的。

这样我们就可以通过开发板的使用节省大量的资源,提高我们的学习效率。

为我们更好的学习单片机提供一个良好的平台。

国内外发展趋势现在可以说是单片机的战国时期,世界上各大芯片制造公司都推出了自己的单片机,从8位、16位到32位,数不胜数,应有尽有,有与主流C51系列兼容的,也有不兼容的,但它们各具特色,互成互补,为单片机的应用提供广阔的天地。

纵观单片机的发展过程,可以预示单片机的发展趋势,大致有:1、低功耗CMOS化MCS-51系列的8031推出时的功耗达630mW,而现在的单片机普遍都在100mW左右,随着对单片机功耗要求越来越低,现在的各个单片机制造商基本都采用了CMOS(互补金属氧化物半导体工艺)。

像80C51就采用了HMOS(即高密度金属氧化物半导体工艺)和CHMOS(互补高密度金属氧化物半导体工艺)。

6 STC15F2K60S2单片机的存储器与应用编程 例题

6 STC15F2K60S2单片机的存储器与应用编程 例题

第6章STC15F2K60S2单片机存储器的应用6.1STC15F2K60S2单片机的程序存储器例6.1 设P1口驱动8只LED灯,低电平有效。

从P1口顺序输出“E7H、DBH、BDH、7EH、3EH、18H、00H、FFH”等8组数据,周而复始。

解:首先将这8组数据要存放程序存储器中,在汇编编程时,采用“DB”伪指令对这8组数据进行存储定义;在C51编程时,采用数组并定义为“code”存储类型。

(1)汇编语言参考程序ORG 0000HLJMP MAINORG 0100HMAIN:MOV DPTR, #ADDR ;DPTR指向数据存放首址MOV R3, #08H ;顺序输出显示数据次数,分8次传送LOOP:CLR A ;A清零,DPTR直接指向读取数据所在地址处MOVC A, @A+DPTR ;取数MOV P1, A ;送P1口显示INC DPTR ;DPTR指向下一个数据LCALL DELAY ;调延时子程序DJNZ R3,LOOP ;判断一个循环是否结束,若没有,取、送下一个数据; SJMP MAIN ;若结束,重新开始DELAY:…;延时子程序,由读者自己完成。

…RET ;子程序必须由RET指令结束ADDR:DB 0E7H,0DBH,0BDH,7EH,3EH,18H,00H,0FFH ;定义存储字节数据END122(2)C51参考程序#include <REG51.H>unsigned char code dis[8] = {0xe7,0xdb,0xbd,0x7e,0x3e,0x18,0x00,0xff}; // 定义显示数据/*――――――――延时子函数――――――――――*/void delay(unsigned int k) /*定义延时子函数*/{unsigned int i, j;for(i = 0; i<k; i++){for(j=0; j<121; j++){;}}}/*――――――――主函数――――――――――*/void main(void){unsigned char i;while(1) // 无限循环{for(i = 0; i<8; i++) //顺序输出8此{P1 = dis[i]; // 取存在程序存储器中的数据delay(50); //设置显示间隔,晶振频率不同时,时间可能不一样,自行调整}}}1236.2STC15F2K60S2单片机的基本RAM例6.2 采用不同的寻址方式,将数据00H写入低128字节00H单元。

单片机ADC例题

单片机ADC例题

;包含IAP15F2K60S2单片机寄存器定义文件 ;A/D转换结果
;设置堆栈 ;开A/D转换电源 ;开电源后加适当延时,1ms以内即可 ;设置P1.2的模拟量功能 ;选择 P1.2作为A/D转换通道 ;如果切换 A/D 转换通道,则需要加延时
WAIT AD:
ORL ADC_CONTR,#00001000B
;ADC 中断服务程序入口
ORG 0050H
MAIN:
MOV SP,#70H ORL ADC _ CONTR,#80H LCALL DELAY MOV P1ASF,#04H
;设置堆栈 ;开 A/D 转换电源 ;开电源后要加适当延时,1 ms 以内即可 ;设置 P1.2 的模拟量功能
MOV ADC_CONTR,#11000010B ;选择 P1.2 作为 A/D转换通道
MOV A,#00010000B
ANL A, ADC_CONTR
JZ
WAIT_AD
ANL ADC_CONTR,#11100111B
MOV A,ADC_RES
MOV ADC_ DAT,A
LJMP WAIT _ AD
DELAY:
MOV R2,#2
MOV R3,#0
MOV R4,#0
DELAY _ LOOP:
;保存A/D转换结果低2位
ORL ADC_CONTR,#00001000B ;重新启动 A/D转换
RETI
DELAY:
;延时子程序
MOV R2,#2
MOV R3,#0
MOV R4,#0
DELAY _ LOOP:
DJNZ R3,DELAY_LOOP
DJNZ R4,DELAY_LOOP
DJNZ R2,DELAY LOOP

STC15F2K60S2定时器2测试。C

STC15F2K60S2定时器2测试。C

STC15F2K60S2定时器2测试。

C//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译//假定测试芯片的工作频率为18.432MHz#include "stc15f2k60s2.h"unsigned char int_sec;//-----------------------------------------------sbit LED = P0^0;sbit d4 =P2^3; //将d4位定义为压轮升降开sbit d5 =P2^2; //将d4位定义为压轮升降关//-----------------------------------------------void Delay2(unsigned int i) //1MS{unsigned int j;for(;i>0;i--)for(j=0;j<125;j++);}/* main program */void main(){AUXR &= 0xFB; //定时器2为12T模式T2L=0x00; //设置定时初值T2H=0x4C; //设置定时初值IE2 |= 0x04; //开定时器2中断AUXR |= 0x10; //定时器2开始计时int_sec=0;while (1){if(d4==0){Delay2(20); //延时一段时间再次检测if(d4==0) //按键K4的确被按下{EA=0;}}if(d5==0){Delay2(20); //延时一段时间再次检测if(d5==0) //按键K4的确被按下{EA = 1;}}}}//----------------------------------------------- //中断服务程序void t2int() interrupt 12 //中断入口{T2L=0x00; //设置定时初值T2H=0x4C; //设置定时初值int_sec++;if(int_sec==20){int_sec=0;LED = !LED; //将测试口取反}}//包含本头文件后,不用另外再包含"REG51.H" #ifndef __STC15F2K60S2_H__#define __STC15F2K60S2_H__//内核特殊功能寄存器// 复位值描述sfr ACC = 0xE0; //0000,0000 累加器Accumulator sfr B = 0xF0; //0000,0000 B寄存器sfr PSW = 0xD0; //0000,0000 程序状态字sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0;sfr SP = 0x81; //0000,0111 堆栈指针sfr DPL = 0x82; //0000,0000 数据指针低字节sfr DPH = 0x83; //0000,0000 数据指针高字节//I/O 口特殊功能寄存器sfr P0 = 0x80; //1111,1111 端口0sbit P00 = P0^0;sbit P01 = P0^1;sbit P02 = P0^2;sbit P03 = P0^3;sbit P04 = P0^4;sbit P05 = P0^5;sbit P06 = P0^6;sbit P07 = P0^7;sfr P1 = 0x90; //1111,1111 端口1sbit P10 = P1^0;sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;sbit P14 = P1^4;sbit P15 = P1^5;sbit P16 = P1^6;sbit P17 = P1^7;sfr P2 = 0xA0; //1111,1111 端口2 sbit P20 = P2^0;sbit P21 = P2^1;sbit P22 = P2^2;sbit P23 = P2^3;sbit P24 = P2^4;sbit P25 = P2^5;sbit P26 = P2^6;sbit P27 = P2^7;sfr P3 = 0xB0; //1111,1111 端口3 sbit P30 = P3^0;sbit P31 = P3^1;sbit P32 = P3^2;sbit P33 = P3^3;sbit P34 = P3^4;sbit P35 = P3^5;sbit P36 = P3^6;sbit P37 = P3^7;sfr P4 = 0xC0; //1111,1111 端口4 sbit P40 = P4^0;sbit P41 = P4^1;sbit P42 = P4^2;sbit P43 = P4^3;sbit P44 = P4^4;sbit P45 = P4^5;sbit P46 = P4^6;sbit P47 = P4^7;sfr P5 = 0xC8; //xxxx,1111 端口5sbit P50 = P5^0;sbit P51 = P5^1;sbit P52 = P5^2;sbit P53 = P5^3;sbit P54 = P5^4;sbit P55 = P5^5;sbit P56 = P5^6;sbit P57 = P5^7;sfr P6 = 0xE8; //0000,0000 端口6sbit P60 = P6^0;sbit P61 = P6^1;sbit P62 = P6^2;sbit P63 = P6^3;sbit P64 = P6^4;sbit P65 = P6^5;sbit P66 = P6^6;sbit P67 = P6^7;sfr P7 = 0xF8; //0000,0000 端口7sbit P70 = P7^0;sbit P71 = P7^1;sbit P72 = P7^2;sbit P73 = P7^3;sbit P74 = P7^4;sbit P75 = P7^5;sbit P76 = P7^6;sbit P77 = P7^7;sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器 1 sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1//系统管理特殊功能寄存器sfr PCON = 0x87; //0001,0000 电源控制寄存器sfr AUXR = 0x8E; //0000,0000 辅助寄存器sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器sfr P_SW2 = 0xBA; //xxxx,x000 外设端口切换寄存器//中断特殊功能寄存器sfr IE = 0xA8; //0000,0000 中断控制寄存器sbit EA = IE^7;sbit ELVD = IE^6;sbit EADC = IE^5;sbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;sfr IP = 0xB8; //0000,0000 中断优先级寄存器sbit PPCA = IP^7;sbit PLVD = IP^6;sbit PADC = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器//定时器特殊功能寄存器sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器sfr TL0 = 0x8A; //0000,0000 T0低字节sfr TL1 = 0x8B; //0000,0000 T1低字节sfr TH0 = 0x8C; //0000,0000 T0高字节sfr TH1 = 0x8D; //0000,0000 T1高字节sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器sfr T4H = 0xD2; //0000,0000 T4高字节sfr T4L = 0xD3; //0000,0000 T4低字节sfr T3H = 0xD4; //0000,0000 T3高字节sfr T3L = 0xD5; //0000,0000 T3低字节sfr T2H = 0xD6; //0000,0000 T2高字节sfr T2L = 0xD7; //0000,0000 T2低字节sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器//串行口特殊功能寄存器sfr SCON = 0x98; //0000,0000 串口1控制寄存器sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器sfr S4CON = 0x84; //0000,0000 串口4控制寄存器sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器sfr SADDR = 0xA9; //0000,0000 从机地址寄存器sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器//ADC 特殊功能寄存器sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位//SPI 特殊功能寄存器sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器//IAP/ISP 特殊功能寄存器sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器//PCA/PWM 特殊功能寄存器sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器sbit CF = CCON^7;sbit CR = CCON^6;sbit CCF2 = CCON^2;sbit CCF1 = CCON^1;sbit CCF0 = CCON^0;sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器sfr CL = 0xE9; //0000,0000 PCA计数器低字节sfr CH = 0xF9; //0000,0000 PCA计数器高字节sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节#endif。

STC15F2K60S2系列单片机的PCA与PWM 例题

STC15F2K60S2系列单片机的PCA与PWM 例题

;定义一个计数器,用来计数模块 0 5mS 中断的次数
ORG 0000H
LJMP MAIN
ORG 003BH
LJMP PCA_interrupt
MAIN:
ORG 0050H CLR LED_MCU_START MOV SP, #7FH MOV Counter,#0 LCALL PCA_Initiate
;设置 PCA 模块 0 为 16 位软件定时器
;开放 PCA 模块 0 中断
EA
;开放总中断
CR
;启动 PCA 计数器(CH,CL)计数
RET
PCA_interrupt∶ PUSH ACC PUSH PSW CPL LED_5mS_Flashing
4
;5mS 中断一次, 每次进中断将该灯状态取反
MOV A,#Channe0_5mS_L ;给[CCAP0H,CCAP0L]增加 5mS 所需计数值
;禁止 PCA 计数器溢出中断
CL,#00H
;设置 PCA 定时器计数的初始值
CH,#00H
CCAP0L,#Channe0_5mS_L ;给 PCA 模块 0 的 CCAP0L 赋定时初值
CCAP0H,#Channe0_5mS_H ;给 PCA 模块 0 的 CCAP0L 赋定时初值
CCAPM0,#49H
ADD A,CCAP0L
MOV CCAP0L,A
MOV A,#Channe0_5mS_H
ADDC A,CCAP0H
MOV CCAP0H, A
CLR CCF0
;清 0PCA 模块 0 的中断请求标志
INC Counter
;中断次数计数器+1
MOV A,Counter
CLR C

基于STCSTC15F2K60S2单片机的串口通讯

基于STCSTC15F2K60S2单片机的串口通讯

湖南科技大学信息与电气工程学院《单片机课程设计报告》题目:基于STCSTC15F2K60S2单片机的串口通讯专业:自动化班级:一班姓名:罗永恒学号: 1209010303指导教师:范小春2015年 6月 30日单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能〔可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路〕集成到一块硅片上构成的一个小而完善的电脑系统。

本文将具体介绍单片机与PC机进行串口通信的实现方法和编程方法,并且在最后给出一个实用的单片机与电脑通过串口通信的程序。

关键词:单片机串口通信第一章 STCSTC15F2K60S2的简介 01.1 STCSTC15F2K60S2的内部结构框图 01.2 STC15F2K60S的DIP封装图 01.3 STC15F2K60S的各引脚简介 (1)第二章单片机通过USB与PC机的通信设计 (3) (3)2.1.1 PC机同单片机通信存在的问题 (3)2.1.2 USB接口同RS-232(DB-9)串口的比较 (3)USB转接芯片的选择 (3)2.2 通信功能要求 (4)第三章硬件电路图的设计 (4) (4)3.2 USB与单片机连接主电路 (5)3.3 总电路图 (5)3.4 PCB图 (5)第四章程序设计 (6)4.1 串口初始化 (6)4.2 主程序 (6)4.3 中断服务程序 (7)4.4 总程序 (7)第五章总结与体会 (9)第六章参考文献 (10)第一章 STCSTC15F2K60S2的简介1.1 STCSTC15F2K60S2的内部结构框图1.2 STC15F2K60S的DIP封装图1.3 STC15F2K60S 的各引脚简介〔1〕电源引脚Vcc :一般接电源的+5V 。

具体的电压幅度应参考单片机的手册。

关于STC15F2K60S2的AD应用

关于STC15F2K60S2的AD应用

Mnemonic Add
Name
B7
B6 B5 B4 B3 B2
B1
B0
ADC_RE S
A/D 转换结 BDh 果寄存器

ADC_RE S
A/D 转换结 BDh 果寄存器

CLK_DIV 97H
时钟分频 寄存器
MCKO_ MCK S1 O_S0
ADRJ
Tx_R x
TX2_ Rx2
CLKS2
CLKS1
CLKS0
2.4.A/D 转换结果寄存器 ADC_RES、ADC_RESL
特殊功能寄存器 ADC_RES 和 ADC_RESL 寄存器用于保存 A/D 转换结果,其格式如下: AUXRI 寄存器的 ADRJ 位是 A/D 转换结果寄存器(ADC_RES、ADC_RESL)的数据 格式调整控制位。
当 ADRJ = 0 时,10 位 A/D 转换结果的高 8 位存放在 ADC_RES 中,低 2 位存放在 ADC_RESL 的低 2 位中。
2.与 A/D 转换相关的寄存器
与 STC15 系列单片机 A/D 转换相关的寄存器列于下表所示。
符号
描述
地址 MSB
位地址及其符号
复位值 LSB
P1AS F
P1 Analog Function Configure register
9DH
P17ASF
P16AS F
P15AS F
P14 AS F
P13 AS F
3.A/D 转换器的结构
4.程序 /****************************************************/ //利用 STC12C5A60S2AD 转换,实现温度计 //函数名:main.c /****************************************************/ #include<reg51.h> #include"10bit_adc.c" #define uchar unsigned char /*宏定义用 uchar 代替 unsigned char*/ #define uint unsigned int /*宏定义用 uint 代替 unsigned int*/

stc15串口范例程序

stc15串口范例程序

stc15串口范例程序STC15是一种常见的单片机型号,它具有丰富的外设和功能,其中包括串口通信功能。

下面是一个简单的STC15串口通信的范例程序,供你参考:c.#include <STC15F2K60S2.H>。

#define FOSC 11059200L.#define BAUD 9600。

void InitUART() {。

SCON = 0x50; // 8位数据,可变波特率。

TMOD = 0x20; // 设置定时器1为模式2。

TH1 = 256 FOSC/12/32/BAUD; // 波特率9600。

TL1 = TH1; // 初始化TL1。

TR1 = 1; // 启动定时器1。

ES = 1; // 使能串口中断。

EA = 1; // 打开总中断。

}。

void UARTInterrupt() interrupt 4 {。

if (RI) {。

P0 = SBUF; // 串口接收到的数据通过P0口输出。

RI = 0; // 清零接收中断标志位。

}。

if (TI) {。

TI = 0; // 清零发送中断标志位。

}。

}。

void main() {。

InitUART(); // 初始化串口。

while (1) {。

// 主循环。

}。

}。

以上是一个简单的STC15串口通信的范例程序。

在这个程序中,我们首先定义了晶振频率和波特率,然后编写了初始化串口的函数InitUART。

在主函数main中,我们调用InitUART进行串口的初始化,然后进入一个无限循环。

当有数据通过串口接收到时,会触发串口中断UARTInterrupt,并将接收到的数据通过P0口输出。

这个程序可以作为一个基础的串口通信范例,你可以根据自己的实际需求进行修改和扩展。

希望这个范例对你有所帮助。

11 STC15F2K60S2系列单片机的PCA与PWM 例题

11 STC15F2K60S2系列单片机的PCA与PWM 例题

第11章STC15F2K60S2单片机CCP/PCA/PWM模块例题例11.3 利用PCA模块扩展外部中断。

将PCA0(P1.1)引脚扩展为下降沿触发的外部中断,将PCA1(Pl.0)引脚扩展为上升沿/下降沿都可触发的外部中断。

当Pl.1出现下降沿产生中断时,对P1.5取反;当Pl.0出现下降沿或上升沿时都会产生中断,对P1.6取反。

P1.7输出驱动工作指示灯。

解:与定时器的使用方法类似,PCA模块的应用编程主要有两点:一是正确初始化,包括写入控制字、捕捉常数的设置等;二是中断服务程序的编写,在中断服务程序中编写需要完成的任务的程序代码。

PCA模块的初始化部分大致如下:①设置PCA模块的工作方式,将控制字写入CMOD、CCON和CCAPMn寄存器。

②设置捕捉寄存器CCAPnL(低位字节)和CCAPnH(高位字节)初值。

③根据需要,开放PCA中断,包括PCA定时器溢出中断(ECF)、PCA模块0中断(ECCF0)和PCA模块1中断(ECCF1),并将EA置l。

④置位CR,启动PCA定时器计数(CH,CL)计数。

汇编语言参考程序如下:∶定义单片机管脚$INCLUDE (STC15F2K60S2.INC) ;包含STC15F2K60S2寄存器定义文件LED_ START EQU P1.7 ;定义输出引脚LED_PCA0_INT0 EQU Pl.6LED_PCA1_INT1 EQU Pl.5ORG 0000HLJMP MAINORG 003BH ;PCA中断的中断矢量地址LJMP PCA_ISRORG 0050HMAIN∶MOV SP,#7FHCLR LED_ START ;点亮开始工作指示灯LCALL PCA_INITIATE ;调PCA模块初始化程序SJMP $ ;原地踏步PCA_INITIATE∶MOV CMOD,#80H ;设置PCA在空闲模式下停止PCA计数器工作;PCA模块的计数器时钟源源为f SYS/10;禁止PCA计数器溢出中断MOV CCON, #00H ;停止PCA计数器计数MOV CL,#00H ;清0 PCA计数器MOV CH,#00HMOV CCAPM0,#11H ;设置PCA模块0下降沿触发捕捉功能,;开放PCA 模块0中断MOV CCAPM1,#31H ;设置PCA模块1下降沿和上升沿触发捕捉功能;开放PCA 模块1中断SETB EASETB CRRETPCA_ISR∶PUSH ACCPUSH PSWJNB CCF0,NOT_PCA0 ;如果CCF0为1,执行PCA模块0中断服务程序;如果CCF0为0,转执行PCA模块1中断标志判断CPL LED_PCA0_INT0 ;Pl.6 LED变化一次,表示PCA模块0发生了一次中断CLR CCF0 ;清0 PCA模块0中断请求标志NOT_PCA0∶JNB CCF1,PCA_ISR_EXIT ;如果CCF1为0,则不是PCA模块1中断,立即推出;如果CCF1为1,执行PCA模块1中断服务程序CPL LED_PCA1_INT1 ;Pl.5 LED变化一次,表示PCA模块1发生了一次中断CLR CCF1 ;清0 PCA模块1中断请求标志PCA_ISR_ EXIT∶POP PSWPOP ACCRETIENDC51参考程序如下#include“STC15F2K60S2.h”//包含STC15F2K60S2寄存器定义文件sbit LED_PCA0_INT0=Pl^5;sbit LED_PCA1_INT1=Pl^6;sbit LED_START=Pl^7;void main(void){LED_START=0;CMOD=0x80;//空闲模式下停止PCA模块计数,时钟源为f SYS/10,//禁止PCA计数器溢出中断CCON=0;//禁止PCA计数器计数CL=0;CH=0;CCAPM0=0xll;//设置PCA模块0 下降沿触发捕捉功能,并开放中断CCAPM1=0x31;//设置PCA模块0下降沿和上升沿触发捕捉功能,并开放中断EA=1;//开放总中断CR=1;//启动PCA模块计数器计数while(1);}void PCA_ISR(void)interrupt 7 //PCA中断服务程序{if(CCF0){ //PCA模块0中断服务程序LED_PCA0_INT0=!LED_PCA0_INT0;//LED_PCA0取反输出,表示PCA模块0发生了中断CCF0=0;//清0 PCA模块0中断标志}else if(CCF1){ //PCA模块0中断服务程序LED_PCA1_INT1=!LED_PCA1_INT1;//LED_PCA1取反输出,表示PCA模块1发生了中断CCF1=0;//清0 PCA模块1中断标志}}例11.4 利用PCA模块的软件定时功能,在P1.5引脚输出周期为2S的方波。

STC15F2K60S2单片机在高频整流模块中的应用设计

STC15F2K60S2单片机在高频整流模块中的应用设计

234 •电子技术与软件工程 Electronic Technology & Software Engineering单片机技术 • SCM Technology【关键词】STC15F2K60S2单片机 整流模块智能化 PWM 当前,随着我国现代科学技术的发展以及生产水平的不断进步,各行各业的智能化程度也越来越高,需要用到的电力设备越来越复杂,对供电质量的要求也就越来越严格。

同时单片机技术的发展及广泛应用使操作电源的自动化程度大大提高,因此,智能化是电力供电模块发展的必然趋势。

而基于单片机控制的高频整流模块作为一种高品质的电力电源装置,为国民生产的供电可靠性提供了有力的保障,并可实现四遥、组网功能以满足无人值守的需要。

本文主要讨论的是STC15F2K60S2单片机在高频整流模块中的控制作用设计,通过硬件、软件设计,实现开关电源的整流模块智能化,是单片机技术在电力电源装置中的一种应用。

1 高频整流模块工作原理高频整流模块的主要作用是将三相交流电整定成为具有额定电压的直流电,向各种直流负载供电,是智能开关电源系统中最基本的组成部件。

其工作原理如图1所示,三相交流输入首先进行防雷处理和EMI 滤波,然后经整流转换成高压直流,再通过全桥PWM 电路逆变为高频交流,经高频变压器隔离降压后通过高频整流滤波成为直流电,最后经EMI 滤波和防反接保护输出。

2 STC15F2K60S2单片机在整流模块应用中的硬件设计在本设计中,根据图2结构框图,用STC15F2K60S2单片机控制系统的脉宽调制,通过采样EMI 滤波后的电压、电流值,给定整流模块的输出电压基准和输出限流基准;控制整流模块开关机;测量整流模块的输出电压和电流并利用数码管显示;并根据故障总线的信号上报故障。

该控制电路中,晶振频率为11.0592MHZ ,STC15F2K60S2单片机内部高可靠复位,8级可选复位门槛电压,彻底省掉外部复位电路。

第5章 STC15F2K60S2单片机中断系统

第5章 STC15F2K60S2单片机中断系统

TI:串行口1发送中断标志。串行口1以方式0发送时,每当 发送完8位数据,由硬件置1;若以方式1、方式2或方式3发 送时,在发送停止位的开始时置1。TI为1表示串行口已发送 一帧数据,串行口1正在向CPU申请中断(发送中断)。值得注 意的是,CPU响应发送中断请求,转向执行中断服务程序时 并不将TI清0,TI必须由用户在中断服务程序中清0。 SCON寄存器的其他位与中断无关,将在后续相关章节 介绍。
3. ADC_CONTR寄存器
ADC_CONTR为A/D转换控制寄存器,字节地址为BCH,
ADC_POWER:ADC电源控制位。当ADC_POWER为0时,关闭ADC电源; 当ADC_POWER为1时,打开ADC电源。 ADC_FLAG:ADC转换结束标志位,可用于请求A/D转换的中断。 当A/D转换完成后ADC_FLAG置1,要用软件清0。不管是A/D转换完 成后由该位申请产生中断,还是由软件查询该标志位A/D转换是 否结束,当A/D转换完成后,ADC_FLAG为1,一定要软件清0。 ADC_START:ADC转换启动控制位,设置为1时,开始转换,转换 结束后为0。 A/D转换控制寄ADC_CONTR中的其他位与中断无关,将在后续 相关章节介绍。
IT0:外部中断0中断触发方式选择位,功能与IT1类似。
2. SCON和S2CON寄存器
SCON为串行口1控制寄存器,包括了串行口发送和接收 中断的请求标志位TI和RI。SCON寄存器的字节地址为98H,可 位寻址,其格式如下:
RI:串行口1接收中断标志。若串行口1允许接收且以方式0 工作,则每当接收到第8位数据时置1;若以方式1、方式2或 方式3工作且SM2=0时,则每当接收到停止位的中间时置1; 当串行口以方式2或方式3工作且SM2=1时,则仅当接收到的 第9位数据RB8为1后,同时还要接收到停止位的中间时置1。 RI为1表示接收器已接收到一帧数据,串行口1正向CPU申请 中断(接收中断),RI必须由用户的中断服务程序清0。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MOV A, @R0
;取被传送数据
MOVX @DPTR, A
INC R0
;指向下一个被传送地址
INC DPTR
;指向下一个传送目标地址
CJNE A, #24H, LOOP0 ;判断是否为“$”字符(ASCII 码为 24H),若不是继续
SJMP $
;是“$”字符,停止传送
END
94
例 5.10 编程将扩展 RAM1000H 为起始地址的 16 个数据传送到片内基本 RAM20H 为起 始地址的单元中。
LCALL DELAY
;调用起始地址为 2200H 的子程序
END
解:经 EQU 定义后,AA 等效于 R1,DATA1 等效于 10H,DELAY 等效于 2200H,该程
序在汇编时,自动将程序中 AA 换成 R1、DATA1 换成 10H、DELAY 换成 2200H,再汇编为
机器代码程序。
使用赋值伪指令 EQU 的好处在于程序占用的资源数据符号或寄存器符号用占用源的英
2
1/6μs
DELAY2:
NOP
1
NOP
1
DJNZ R2,DELAY2
4
1/12μs 1/12μs 1/3μs






DJNZ R1,DELAY1
4
1/3μs
RET
4
1/3μs
96
例 5.12 编程实现 C=a2+b2。设 a、b 均小于 10 且分别存于扩展 RAM 的 1000H、1001H 单元,要求运算结果 C 存于外部 RAM1002H 单元。
JMP @A+DPTR
;转到分支表该分支的对应入口处
TABLE:
AJMP ROUT0
;分支表,采用短转移指令,每个分支占用 2 个字节
AJMP ROUT1
;各分支在分支表的入口地址=TAB+分支号×2
AJMP ROUT2 ……
ROUT0: ……
LJMP COMMON ROUT1:
……
LJMP COMMON ROUT2:
中的“LJMP COMMON”指令。
92
例 5.8 将内部 RAM 中起始地址为 DATA 的字符串数据传送扩展 RAM 中起始地址为 BUFFER 的存储区域内,并统计传送字符的个数,直到发现空格字符停止传送。
解:题目中已明确发现空格字符时就停止传送,因此,编程时应先对传送数据进行判断,
再决定是否传送。
COMMON: MOV Y,A SJMP $
;保存 A ;程序结束
END
91
例 5.7 设各分支的分支号码从 0 开始按递增自然数排列,执行分支号存放在 R3 中,编 写多分支处理程序。
解:首先,在程序存储器中建立一个分支表,分支表中按从 0 开始的分支顺序从起始地 址(表首地址,如 TABLE)开始存放各分支的一条转移指令(AJMP 或 LJMP,AJMP 占用 2 个字节,LJMP 占用 3 个字节),各转移指令的目标地址就是各分支程序的入口地址。
87
例 5.3 分析下列程序中 EQU 指令的作用
AA EQU R1
;给 AA 赋值 R1
DATA1 EQU 10H
;给 DATA1 赋值 10H
DELAY EQU 2200H
;给 DELAY 赋值 2200H
ORG 2000H
MOV R0,DATA1 ;R0←(10H)
MOV A, AA
;A←(R1)
解:本例中,数据传送的次数是固定的,为 16 次;因此,可用一个计数器来控制循环体 程序的执行次数。既可以用加 1 计数来实现控制(采用 CJNE 指令),也可以采用减 1 计数来 实现控制(采用 DJNZ 指令)。一般情况下,采用减 1 计数控制居多。
参考程序如下:
ORG 0000H MOV DPTR,#1000H MOV R0,#20H MOV R2,#10H LOOP: MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 DJNZ R2,LOOP
设 DATA 为 20H,BUFFER 为 0200H,参考程序如下:
ORG 00000H
DATA EQU 20H
BUFFER EQU 0200H
MOV R2, #00H
;统计传送字符个数计数器清零
MOV R0, #DATA
;设置源操作数指针
MOV DPTR, #BUFFER ;设置目标操作数指针
LOOP0:
ORG 0000H
MOV A,X ;取 X
JB ACC.7,BRANCH1 ;若 ACC.7 为 1 则转向 BRANCH1,否则顺序执行
MOV A,#64H
;X≥0,Y=100
SJMP COMMON
;转向 COMMON(分支公共处)
BRANCH1:
MOV A,#9CH
;X<0,Y= -100,把-100 的补码(9CH)送 A
INC R2
;传送字符个数计数器加 1
SJMP LOOP0
;继续下一个循环
STOP:
SJMP $
;程序结束
END
93
例 5.9 将内部 RAM 中起始地址为 DATA 的字符串数据传送扩展 RAM 中起始地址为
BUFFER 的存储区域内,字符串的结束字符是“$”。
解:程序功能与例 5.8 基本一致,但字符串的结束字符 “$”是字符串中的一员,也是
INC DPTR MOVX A,@DPTR ACALL SQUARE ADD A,R1
;取 b 的值 ;调用子程序求 b 的平方
;A←a2+b2
INC DPTR MOVX @DPTR,A
;存结果
SJMP $ ;子程序如下
ORG 2500H
SQUARE:
INC A
;表首地址与查表指令相隔 1 个字节,故加 1 调整
第 5 章 STC15F2K60S2 单片机的程序设计
例题
例 5.1 分析 ORG 在下面程序段中的控制作用 ORG 1000H
START: MOV R0, #60H MOV R1,#61H …… ORG 1200H
NEXT: MOV DPTR,#1000H MOV R2,#70H ……
解:以 START 开始的程序汇编后机器码从 1000H 单元开始连续存放,不能超过 1200H 单元;以 NEXT 开始程序汇编后机器码从 1200H 单元开始连续存放。
文或英文缩写字符名称来定义,后续编程中凡是出现该数据符号或寄存器符号就用该字符名
称代替,这样,采用有意义的字符名称进行编程,更容易记忆和不容易混淆,也便于阅读。
88
例 5.4 试将 8 位二进制数据转换为十进制(BCD 码)数据。 解:8 位二进制数据对应的最大十进制数是 255,说明一个 8 位二进制数据需要 3 位 BCD 码来表示,既百位数、十位数与个位数。如何求解呢?
(1)用 8 位二进制数据减 100,够减百位数加 1,直至不够减为止;再用剩下的数去减 10,够减十位数加 1,直至不够减为止;剩下的数即为个位数。
(2)用 8 位二进制数据除以 100,商为百位数,再用余数除以 10 ,商为十位数,余数 为个位数。
很显然,第(1)种方法更复杂,应选用第(2)种算法。设 8 位二进制数据存放在 20H 单元,转换后十位数、个位数存放在 30H 单元,百位数存放在 31H 单元。
解:软件延时程序是应用编程中的基本子程序,是通过反复执行空操作指令(NOP)和
循环控制指令(DJNZ)占用时间来达到延时目的的。因为执行一条指令的时间非常短,一般
都需要采用多重循环才能满足要求。
参考程序如下:
源程序
系统时钟数
占用时间
DELAY:
MOV R1,#100
2
1/6μs
DELAY1:
MOV R2,#200
……
LJMP COMMON ……
;分支 0 程序 ;分支程序结束后,转各个分支的汇总点
;分支 1 程序 ;分支程序结束后,转各个分支的汇总点
;分支 2 程序 ;分支程序结束后,转各个分支的汇总点
COMMON: SJMP COMMON
;各个分支的汇总点
END 注意:不管哪个分支程序执行完毕后,都必须回到所有分支公共回合处,如各分支程序
例 5.2 分析 END 在下面程序段中的控制作用。 START:
MOV A,#30H …… END START NEXT: …… RET 解:汇编程序对该程序进行汇编时,只将 END 伪指令前面的程序转换为对应的机器代码 程序,而以 NEXT 标号为起始地址的程序将予以忽略。因此,若 NEXT 标号为起始地址的子 程序是本程序的有效子程序的话,应将整个子程序段放到 END 伪指令的前面。
根据各分支程序的分支号,转移到分支表中对应分支的入口处,执行该分支的参考程序如下:
ORG 0000H
MOV A, R3
;取分支号
RL A
;分支号乘 2,若分支表中用 LJMP,则改分支号乘 3
MOV DPTR, #TABLE ;分支表表首地址送 DPTR
;余数除以 10,A 为十位数,B 为个位数 ;将十位数从低 4 位交换到高 4 位 ;十位数、个位数合并为压缩 BCD 码 ;十位数、个位数存放在 30H(高 4 位为十位数,低 4 位为个
SJMP $
END
89
例 5.5 求 8 位有符号数的补码。设 8 位二进制数存放在片内 RAM 30H 单元内。 解:对于负数的补码为除符号位以外取反加 1,而正数的补码就是原码,因此,关键的 地方是判断数据的正负,最高位为 0,表示为正数,最高位为 1,表示为负数。 参考程序如下:
相关文档
最新文档