C51单片机编程
- 格式:doc
- 大小:35.00 KB
- 文档页数:2
c51 rrc 汇编写法
C51是一种常见的8位单片机系列,而RRC是C51汇编语言中的一个指令。
RRC指令是将一个寄存器中的数据循环右移一位,最高位的数据移动到最低位,同时将最低位的数据移动到最高位。
在C51汇编语言中,RRC指令的写法如下:
RRC A ; 将A寄存器中的数据循环右移一位。
这条指令表示将A寄存器中的数据进行循环右移一位。
在C51汇编语言中,A寄存器是一个累加器,用于存储运算结果或临时数据。
RRC指令可以用于对数据进行位操作,常用于加密算法、数据压缩等场景。
除了RRC指令外,C51汇编语言还包括了丰富的指令集,可以进行各种数据操作、逻辑运算、跳转等操作。
在编写C51汇编程序时,需要深入了解指令集的功能和使用方法,以及掌握寄存器的作用和特性,才能正确高效地编写程序。
总的来说,C51汇编语言中的RRC指令可以通过指定寄存器来对数据进行循环右移一位,是C51单片机编程中常用的指令之一。
在实际编写程序时,需要根据具体的需求和逻辑来合理使用RRC指令,以实现所需的功能。
c51单片机的循环左移函数 _crol_ 源码1. 背景介绍c51单片机是一种广泛应用于嵌入式系统的微控制器,它采用的是哈佛结构的指令集架构,因此在开发过程中需要编写大量的汇编语言代码。
在c51单片机中,循环左移函数_crol_是一个非常常用的函数,它可以实现对一个字节或字的循环左移操作,是嵌入式系统开发中的基础函数之一。
2. 循环左移函数_crol_的功能循环左移函数_crol_的功能是将一个字节或字进行左移操作,并且在移动的过程中将最高位移到最低位,其他位依次向高位移动。
对于一个8位的二进制数xxx,经过一次循环左移后,变成xxx。
3. _crol_函数的源码在c51单片机中,_crol_函数的源码通常以汇编语言的形式编写,下面是一个常见的_crol_函数源码示例:```assembly_crol:mov a, r0 ; 将需要左移的字节或字存入累加器arlc a ; 累加器a的内容左移一位,并将最高位的值存入CY(进位标志位)mov r0, a ; 将左移后的结果存入r0ret ; 函数返回```4. _crol_函数源码解析以上是一个简单的_crol_函数的源码示例,下面对其进行解析:- 将需要左移的字节或字存入累加器a中;- 使用指令rlc a将累加器a的内容左移一位,并且最高位的值存入CY (进位标志位)中;- 将左移后的结果存入r0中;- 函数返回。
5. _crol_函数源码的优化上述的_crol_函数源码虽然可以实现循环左移的功能,但是在性能和效率上并不是最优的。
下面是对_crol_函数源码的一些优化建议:- 如果在c51单片机的开发中需要频繁使用循环左移操作,可以考虑将_crol_函数的源码嵌入到其他函数中,以减少函数调用的开销;- 通过使用位操作指令,可以进一步提高_crol_函数的执行效率,例如使用指令“rl a”来代替“rlc a”。
6. 总结在c51单片机的开发中,循环左移函数_crol_是一个非常基础且常用的函数,它可以帮助开发者实现对字节或字的循环左移操作。
单片机c51汇编语言51单片机汇编语言单片机C51汇编语言单片机(C51)是指一种集成电路上只包含一个集中式控制器的微处理器,具有完整的CPU指令集、RAM、ROM、I/O接口等功能。
汇编语言是一种低级语言,是用于编写单片机指令的一种语言。
汇编语言能够直接操作单片机的寄存器和输入/输出端口,因此在嵌入式系统的开发中非常重要。
本文将介绍单片机C51的汇编语言编程。
一、了解单片机C51单片机C51是目前应用最广泛的一种单片机系列,广泛用于各种电子设备和嵌入式系统的开发。
C51指的是Intel公司推出的一种基于MCS-51架构的单片机。
该系列单片机具有较高的性能和低功耗的特点,可用于各种控制和通信应用。
二、汇编语言的基本概念汇编语言是一种低级语言,与机器语言紧密相关。
它使用助记符来代替机器指令的二进制表示,使程序的编写更加易读。
在单片机C51汇编语言中,每一条汇编指令都对应着特定的机器指令,可以直接在单片机上执行。
三、汇编语言的基本指令在单片机C51汇编语言中,有一些基本的指令用于控制程序的执行和操作寄存器。
以下是一些常用的指令:1. MOV指令:用于将数据从一个寄存器或内存单元复制到另一个寄存器或内存单元。
2. ADD指令:用于将两个操作数相加,并将结果存储到目的寄存器中。
3. SUB指令:用于将第一个操作数减去第二个操作数,并将结果存储到目的寄存器中。
4. JMP指令:用于无条件跳转到指定的地址。
5. JZ指令:用于在条件为零时跳转到指定的地址。
6. DJNZ指令:用于将指定寄存器的值减一,并根据结果进行跳转。
四、编写单片机C51汇编程序的步骤编写单片机C51汇编程序需要按照以下步骤进行:1. 确定程序的功能和目标。
2. 分析程序的控制流程和数据流程。
3. 设计算法和数据结构。
4. 编写汇编指令,实现程序的功能。
5. 调试程序,并进行测试。
六、实例演示以下是一个简单的单片机C51汇编程序的示例,用于实现两个数的相加,并将结果输出到LED灯上:org 0H ; 程序的起始地址为0mov a, 05H ; 将05H赋值给累加器mov b, 07H ; 将07H赋值给B寄存器add a, b ; 将A寄存器和B寄存器的值相加mov P1, a ; 将相加结果输出到P1口end ; 程序结束在这个例子中,首先将05H赋值给累加器A,然后将07H赋值给B寄存器,接着使用ADD指令将A和B的值相加,将结果存储到累加器A中,最后将累加器A的值输出到P1口。
Keil C51实验项目Keil C51实验项目 (1)一、单片机的IO编程 (4)实验1 IO开关量输入实验 (4)实验2 IO输出驱动继电器(或光电隔离器)实验 (4)实验3 IO输入/输出---半导体温度传感器DS18B20实验 (5)二、单片机的中断系统 (7)实验1 外部中断----脉冲计数实验 (7)实验2 外部中断----故障报警实验 (8)三、单片机的定时器/计数器 (10)实验1 计数器实验 (10)实验2 秒时钟发生器实验 (11)四、单片机的串口特点和编程 (12)实验1 PC机串口通讯实验 (12)实验2 RS485通讯实验 (14)五、存储器 (15)实验1 RAM存储器读写实验 (15)六、PWM发生器 (16)实验1 PWM发生器(模拟)实验 (16)实验2 蜂鸣器实验 (18)七、WDG看门狗 (19)实验1 外扩WDG(MAX705)实验 (19)实验2 WDG(内部)实验 (19)八、SPI总线 (20)实验1 SPI(模拟)实验-----TLC2543 AD转换实验 (20)实验2 SPI(模拟)实验-----TLV5616 DA转换实验 (21)九、I2C总线 (23)实验1 I2C(模拟)实验-----IC卡(AT24C01)读写实验 (23)十、综合实验 (24)实验1 HD7279LED数码管显示实验 (24)实验2 HD7279键盘实验 (25)实验3 电机转速实验 (26)十一、步进电机实验 (27)实验1 步进电机正反转实验 (27)十二、TFT液晶显示实验 (28)实验1 TFT液晶显示彩色条纹实验 (28)十三、16X16LED点阵显示汉字实验 (29)实验1 16X16LED点阵显示汉字实验 (29)一、单片机的IO编程实验1 IO开关量输入实验目的:学习单片机读取IO引脚状态的的方法。
内容:编程读取IO引脚状态。
设备:EL-EMCU-I试验箱、EXP-89S51/52/53 CPU板。
单片机C51语言及程序设计单片机是一种微型计算机芯片,通常用于控制和执行各种电子设备中的任务。
单片机C51语言是一种基于C语言的编程语言,它在单片机开发中被广泛应用。
本文将对单片机C51语言及程序设计进行介绍。
一、单片机C51语言简介单片机C51语言是一种基于C语言的嵌入式编程语言,它是Intel公司为其8051系列单片机提供的编程语言。
C51语言与C语言的语法相似,但是在一些底层操作和特殊功能上有所区别。
使用C51语言编写的程序可以在8051系列单片机上直接运行,实现各种控制和功能。
C51语言的特点包括高效的编译器、丰富的库函数、快速的速度和较小的存储空间占用。
它可以利用C语言的各种高级特性进行程序设计,同时也支持直接对单片机的硬件进行底层操作。
二、单片机C51语言程序编写1.编译与烧录环境2.基本语法和数据类型C51语言的基本语法与C语言相似。
它支持各种数据类型,包括整数、浮点数、字符等。
同时,C51语言还定义了一些特殊的数据类型和关键字,如sfr(特殊功能寄存器)、xdata(扩展数据存储器)等。
3.控制语句和函数C51语言支持各种控制语句和函数,如条件语句(if-else、switch-case)、循环语句(for、while)、函数定义等。
通过这些语句和函数,我们可以实现复杂的控制逻辑和算法。
4.寄存器和端口操作单片机的核心是CPU和各种寄存器。
C51语言提供了一些特殊的语法和关键字,可以直接访问和操作寄存器。
通过这些操作,我们可以实现对单片机硬件的底层控制。
例如,下面的代码演示了如何使用C51语言对LED灯进行控制:sfr P0 = 0x80; // 特殊功能寄存器,用于控制P0口#define LED_PIN P0_0 // 使用宏定义定义LED的引脚void maiLED_PIN=0;//将LED引脚电平设为低电平while(1)LED_PIN=1;//将LED引脚电平设为高电平delay(1000); // 延时1秒LED_PIN=0;//将LED引脚电平设为低电平delay(1000); // 延时1秒}在上面的代码中,我们通过特殊功能寄存器P0和宏定义LED_PIN,定义了与LED相关的引脚和寄存器。
C51单片机编程基本知识C51单片机编程是指使用C语言对C51系列单片机进行编程的过程。
这种编程方式广泛应用于嵌入式系统开发中,具有灵活性高、可靠性强的特点。
本文将介绍C51单片机编程的基本知识,包括单片机结构、编程语言、编译器以及编程流程等。
一、单片机结构C51单片机是由Intel公司开发的一种嵌入式微控制器,由中央处理器、存储器、输入输出接口和外设等部分组成。
其中,中央处理器用于执行程序指令,存储器用于存储程序和数据,输入输出接口用于与外部设备进行交互。
了解单片机的基本结构对于进行C51单片机编程至关重要。
二、编程语言C语言是一种高级编程语言,广泛应用于嵌入式系统开发中。
C语言具备结构化编程的特点,能够提高程序的可读性和可维护性。
在C51单片机编程中,使用C语言可以更加方便地编写程序,并且兼容性强,可以在不同的平台上使用。
三、编译器编译器是将C语言源代码转换为机器语言的工具。
在C51单片机编程中,常用的编译器有Keil C51、SDCC等。
不同的编译器具有不同的特点和使用方法,开发人员需要选择适合自己需求的编译器,并且熟悉其使用方法。
四、编程流程C51单片机编程的流程一般包括以下几个步骤:1. 确定需求:根据实际应用需求,明确单片机的功能和性能要求。
2. 掌握硬件特性:了解单片机的硬件特性,包括引脚功能、外设接口和中断等。
3. 编写代码:使用C语言编写单片机的程序代码,包括初始化设置、主程序和中断服务程序等。
4. 编译代码:使用编译器将C语言源代码编译为可执行的机器语言文件。
5. 烧录程序:将机器语言文件通过烧录工具烧录到单片机的存储器中。
6. 调试测试:连接单片机和外部设备,进行功能测试和调试,确保程序的正确性和稳定性。
7. 优化改进:根据实际运行情况,对程序进行优化和改进,提高性能和效率。
五、常见问题与解决方法在C51单片机编程的过程中,常常会遇到一些问题,下面介绍几个常见问题及其解决方法:1. 编译错误:根据编译器给出的错误提示信息,检查代码语法和逻辑错误,并进行相应的修正。
基础知识:C51单片机编程基础单片机的外部结构:1.DIP40双列直插;2.P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3.电源VCC(PIN40)和地线GND(PIN20);4.高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)5.内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)6.程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)7.P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)1.四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2.两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3.一个串行通信接口;(SCON,SBUF)4.一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。
C语言编程基础:1.十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
2.如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
3.++var表示对变量var先增一;var—表示对变量后减一。
4.x |= 0x0f;表示为x = x | 0x0f;5.TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
6.While( 1 ); 表示无限执行该语句,即死循环。
语句后的分号表示空循环体,也就是{;}在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)代码1.#include //该头文档中有单片机内部资源的符号化定义,其中包含P1.32.void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口3.{4. P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCC5. While( 1 ); //死循环,相当 LOOP: goto LOOP;6.}注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。
C51单片机编程基本知识全文选段:该控制指令将C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用A51进行编译。
第三节 Keil C51软件包中的通用文件在C51\LiB目录下有几个C源文件,这几个C源文件有非常重要的作用,对它们稍事修改,就可以用在自己的专用系统中。
1. 动态内存分配init_mem.C:此文件是初始化动态内存区的程序源代码。
它可以指定动态内存的位置及大小,只有使用了init_mem( )才可以调回其它函数,诸如malloc calloc,realloc等。
calloc.c:此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。
malloc.c:此文件是malloc的源代码,分配一段固定大小的内存。
realloc.c:此文件是realloc.c源代码,其功能是调整当前分配动态内存的大小。
全文内容:本章讨论以下内容:l 绝对地址访问l C与汇编的接口l C51软件包中的通用文件l 段名转换与程序优化第一节绝对地址访问C51提供了三种访问绝对地址的方法:1. 绝对宏:在程序中,用“#include〈absacc.h〉”即可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD具体使用可看一看absacc.h便知例如:rval=CBYTE[0x0002];指向程序存贮器的0002h地址rval=XWORD [0x0002];指向外RAM的0004h地址2. _at_关键字直接在数据定义后加上_at_ const即可,但是注意:(1)绝对变量不能被初使化;(2)bit型函数及变量不能用_at_指定。
例如:idata struct link list _at_ 0x40;指定list结构从40h开始。
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。
51单片机c语言教程在本教程中,我们将学习如何在51单片机上使用C语言进行编程。
无论您是初学者还是有一定经验的开发者,本教程都将对您有所帮助。
首先,我们需要了解一些基本概念。
51单片机是一种基于哈弗微电子公司的MCS-51架构的微控制器。
它采用了Harvard结构,即将程序存储器和数据存储器分开。
它具有各种功能和接口,可以满足不同的应用需求。
在使用C语言进行51单片机编程之前,必须安装相应的开发工具。
这里我们推荐使用Keil C51开发环境。
安装完成后,我们就可以开始编写第一个程序了。
#include <reg51.h>void main(){// 在这里编写您的代码}以上是一个简单的C语言程序模板。
我们使用了reg51.h头文件,该文件包含了与51单片机相关的寄存器定义和常量。
接下来,我们可以开始编写具体的功能代码了。
例如,如果我们想要在LED灯上闪烁一个简单的模式,可以使用以下代码:#include <reg51.h>sbit LED = P1^0;void main(){while(1){LED = 0; // 点亮LEDdelay(1000); // 延时1秒LED = 1; // 熄灭LEDdelay(1000); // 延时1秒}}在这个程序中,我们首先定义了一个LED的控制引脚,然后通过循环实现了闪烁的功能。
在每次循环中,我们先点亮LED,然后通过调用延时函数延时1秒,再将LED熄灭,再次延时1秒。
这样就形成了一个简单的LED闪烁效果。
除了控制IO口外,51单片机还可以实现其他各种功能,如定时器、串口通信等。
这些功能的实现也都可以通过C语言来完成。
希望通过本教程,您可以对51单片机的C语言编程有一个基本的了解。
在以后的学习中,您可以深入研究这些知识,并通过实践来提升自己的能力。
祝您学习愉快!。
C51编程的数值拼接1. 介绍C51编程是一种基于C语言的嵌入式系统编程语言,广泛应用于单片机领域。
数值拼接是C51编程中一个常见的操作,它将多个数值按照一定的规则进行拼接,生成一个新的数值。
本文将详细介绍C51编程中的数值拼接方法和相关技巧。
2. 数值拼接方法2.1 字符串拼接在C51编程中,可以使用字符串数组来进行数值的拼接。
首先定义一个足够长的字符串数组,然后将需要拼接的数值转换为字符串,并逐个添加到字符串数组中。
最后可以通过输出该字符串数组来查看拼接结果。
下面是一个示例代码:#include <reg52.h>#include <stdio.h>void main() {char str[20]; // 定义一个长度为20的字符串数组int num1 = 123;int num2 = 456;sprintf(str, "%d%d", num1, num2); // 将num1和num2按顺序转换为字符串并拼接到str中printf("拼接结果:%s", str);}上述代码将输出:拼接结果:123456。
2.2 数字位运算除了使用字符串拼接,还可以通过数字位运算来实现数值的拼接。
该方法适用于需要将多个数值拼接成一个大数值的情况。
下面是一个示例代码:#include <reg52.h>#include <stdio.h>void main() {int num1 = 123;int num2 = 456;int result;result = (num1 << 16) | num2; // 将num1左移16位后与num2进行按位或运算printf("拼接结果:%d", result);}上述代码将输出:拼接结果:123456。
3. 数值拼接技巧3.1 数字转字符串在进行数值拼接时,常常需要将数值转换为字符串。
单片机原理c51编程单片机原理是指在一个芯片上集成了微处理器、存储器、输入输出控制电路等功能模块的集成电路。
它是一种微型计算机系统,适用于控制领域,广泛应用于家电、工业自动化、通信等领域。
C51编程是指使用C语言进行对8051单片机进行编程,对其进行控制和操作。
首先,C51编程需要熟悉C语言的语法和掌握单片机的相关基础知识。
C语言是一种高级编程语言,它与单片机的硬件结构的联系是通过对单片机的寄存器的操作来实现的。
因此,熟悉单片机的寄存器和相应的寄存器操作指令是C51编程的基础。
在C51编程中,首先需要进行硬件的初始化设置。
这包括对单片机的时钟源、IO口、中断等进行配置,以及对需要使用的外设如串口、定时器等进行初始化。
这些初始化设置的目的是使单片机能够正常运行,并为后续的程序提供必要的硬件支持。
接下来是主程序的编写。
主程序是单片机中的“大脑”,负责控制和协调各个模块的工作。
在主程序中,需要实现对各个功能模块的调用和控制,包括对IO口的读写操作、对外设的配置和使用、对中断的处理等。
通过编写主程序,可以实现对单片机的灵活控制,使其按照设定的逻辑执行相应的任务。
在C51编程中,还需要处理中断。
中断是指在单片机运行过程中,根据外部事件的触发或者定时器的到达,触发单片机的响应。
中断的处理需要编写相应的中断服务函数,并将其与相应的中断源进行关联。
中断服务函数可以在主程序的执行过程中,插入自己的处理逻辑,以实现对特定事件的及时响应。
此外,在C51编程中,还需要进行调试和测试。
单片机的编程开发通常需要使用开发工具和调试器,通过在开发环境中进行仿真和调试,检测和修正程序的错误。
调试和测试是C51编程过程中不可或缺的环节,它能够帮助开发者发现和解决问题,确保程序的正确性和稳定性。
总的来说,C51编程是一种基于C语言的单片机程序设计方法。
它通过对单片机硬件的了解和对C语言的掌握,实现对单片机的控制和操作。
C51编程需要进行硬件初始化、主程序编写、中断处理、调试和测试等环节,以实现对单片机的灵活控制,满足各种实际应用需求。
单片机的c51语言编程及仿真方法一、C51语言的基本概念和编程方法C51语言是一种面向单片机的高级编程语言,广泛应用于嵌入式系统的开发。
C51语言具有结构化、模块化和可移植性等特点,使得程序的编写更加简便和灵活。
在C51语言中,程序由函数和变量组成。
函数是C51程序的基本执行单位,通过函数的调用和返回实现程序的流程控制。
变量是存储数据的单元,可以是整型、字符型或者数组等不同类型的数据。
C51语言的编程方法主要有以下几点:1. 硬件初始化:在C51程序中,首先需要进行硬件的初始化工作,包括IO口的配置、定时器的设置、中断的使能等。
这些初始化工作需要在程序的开头进行,并且只需要执行一次。
2. 主函数编写:主函数是C51程序的入口函数,程序从主函数开始执行。
在主函数中,可以定义局部变量、调用其他函数和执行各种操作。
主函数一般包含一个无限循环,以保持程序的持续运行。
3. 函数的定义:除了主函数外,C51程序还可以定义其他函数,用于实现特定的功能。
函数的定义包括函数名、返回值类型、参数列表和函数体。
函数可以被主函数或其他函数调用,以实现不同的功能模块。
4. 控制语句的使用:C51语言支持多种控制语句,包括顺序结构、条件结构和循环结构。
通过这些控制语句,可以实现程序的各种流程控制,例如条件判断、循环执行等。
5. 编译和下载:编写完C51程序后,需要使用编译器将程序转换为机器语言,并生成可执行文件。
然后,通过下载工具将可执行文件下载到单片机中,以使程序在单片机上运行。
二、C51的仿真方法C51的仿真是指在计算机上模拟单片机的运行环境,以便在不实际连接硬件的情况下进行程序的调试和验证。
C51的仿真方法主要有以下几种:1. Keil C51仿真器:Keil C51是一款常用的单片机开发工具,提供了强大的仿真功能。
通过Keil C51仿真器,可以在计算机上运行单片机程序,并通过仿真界面实时监测程序的执行情况。
Keil C51仿真器支持单步调试、断点调试等功能,方便程序的调试和验证。
目录目录................................................................................................ 错误!未定义书签。
************************************************************函数的使用和熟悉***************************************************************/ ...... 错误!未定义书签。
实例3:用单片机控制第一个灯亮 ............................................ 错误!未定义书签。
实例4:用单片机控制一个灯闪烁:认识单片机的工作频率错误!未定义书签。
实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能错误!未定义书签。
实例6:使用P3口流水点亮8位LED ....................................... 错误!未定义书签。
实例7:通过对P3口地址的操作流水点亮8位LED ............... 错误!未定义书签。
实例8:用不同数据类型控制灯闪烁时间 ................................ 错误!未定义书签。
实例9:用P0口、P1 口分别显示加法和减法运算结果 ........ 错误!未定义书签。
实例10:用P0、P1口显示乘法运算结果 ................................ 错误!未定义书签。
实例11:用P1、P0口显示除法运算结果 ................................ 错误!未定义书签。
实例12:用自增运算控制P0口8位LED流水花样 ................ 错误!未定义书签。
实例13:用P0口显示逻辑"与"运算结果 ................................. 错误!未定义书签。