是一个8位的二进位制码 他可以储存字元代表的ascii码也可以表示一个0-255的数字,一般变数的大小不超过255的话尽量用char,因为这样可以节省一些RAM
String定义可以是字元,也可以是字串,比如
String str =“asadsada”;
char[] c1 = str1.toCharArray();对应的字串可以转换成char阵列
你应该这样看:
char* a = "c++ language";
其实就是表示,定义一个字元指标a,并初始化指向一个"c++ language"的字串
由于"c++ language"是字串常量,所以a又预设转化为了字串常量指标。
a的确表示“c++ language”在记忆体中的首地址.
255以上的数字要分两个位元组传送才行,分高8 位和低8 位,
为了便于接收,小于256的资料也采用两个位元组
定义这种大的阵列,你首先得有这么大的RAM才可以,不然肯定不好用。内部地址空间就别想了,肯定是放在外部。
如果是常数阵列,可以定义到程式码里面,code char [1024][10],这种程式只能读,不能改,像字型档点阵一般用这种。
如果有足够的外部RAM,xdata char xx[1024][10]; 这是把阵列定义到外部RAM,需要用MOVX访问。
/*********************************************
ILONG编做
【注意P3口输出模拟和在{实验板}上不一样。实验板不用取反】
【目的】:用20次T0定时产生1s.进而形成 HH-mm-ss时间
【引数说明】:
40H~47H :显示管,每位暂存器,存放要显示的数码的地址。可根据地址加1,实现该位数加1;
并且低4位可以代表管子要显示的值(42H、45H除外)。
48H :要显示的位值(0~7,由译码器翻译出)
49H :每位每次刷出时要显示的时间0~256us
4A :20次定时,的次数计数器
4BH,4CH :小时十位进位刷0,时,小时两位数的暂存
4DH :除错时,要调整型别,每次INT0中断自增一次
50H~5FH :0~F 16个数的码值
60H :"-"的码值
61H :"空" 的码值
62H,63H :要闪的两位地址暂存 (好像没用着)
R0 :存放 每位暂存器 的地址,用于 重新整理位时 移位
00H(位) :是否有INT0(调整)中断
01H(位) :是闪亮,还是闪空,即:闪烁时的亮暗状态
【存在问题】:
1,调整时间时,分钟位开始乱码。
2,调整时间时,必须亮的时候才能调
3,时间差:慢于实际时间
2011.10.21 ilong(crazy night)
*********************************************/
SJMP 0x0030
ORG 0x0030
MAIN:
启动外部中断
SETB IT0
SETB IE0
SETB EX0
SETB PX0
SETB IT1
SETB IE1
SETB EX1
SETB PX1
SETB EA
CLR 00H 没有调整中断
CLR 01H 闪空
MOV 4DH,#04H 0xFC
MOV P3,#0FH
MOV 62H,46H 从分开始闪
MOV 63H,47H
十位数********************
MOV 50H,#3FH
MOV 51H,#06H
MOV 52H,#5BH
MOV 53H,#4FH
MOV 54H,#66H
MOV 55H,#6DH
MOV 56H,#7DH
MOV 57H,#07H
MOV 58H,#7FH
MOV 59H,#6FH
MOV 5AH,#77H
MOV 5BH,#7CH
MOV 5CH,#39H
MOV 5DH,#5EH
MOV 5EH,#79H
MOV 5FH,#71H
MOV 60H,#40H
MOV 61H,#00H
八位管的暂存 从左到右40-47
MOV 40H,#50H
MOV 41H,#50H
MOV 42H,#60H
MOV 43H,#50H
MOV 44H,#50H
MOV 45H,#60H
MOV 46H,#50H
MOV 47H,#50H
MOV 48H,#00H 扫描位暂存
MOV R0,#40H 扫描值地址
MOV 4AH,00H 20次定时 计数
LCALL TIMER_GO20 开启并初始定时器
主函式程序,就是扫描码管值并显示,其他为中断操作***************************************************
SCAN: 显示器扫描输出*************************************
MOV P2,48H 选择显示位(从左到右0-7)
MOV A,@R0 获取该位的数码值 地址
MOV R1,A
MOV A,@R1 获取该位码值
CPL A 根据数码管是共阴、共阳 是否取反
MOV P0,A 从P0输出每位的码值,注意:该埠时下面的“清屏”一起改
LCALL DELAY 进入每位延时
MOV P0,#0FFH 清屏
INC 48H 暂存器后移
INC R0 位后移
MOV A,48H 通过 (48H)的值+08H 判断是否到了 位尾
ADD A,#08H
JB 0D6H,RER D6H(位)为AC(辅助进位:半进位)。为1时说明(48H)的值+08H=F,即(48H)=8,此时跳向RER
SJMP SCAN
RER: 扫描重置
CLR 0D6H 重置 AC(辅助进位:半进位)
MOV 48H,#00H
MOV R0,#40H
SJMP SCAN
End 主函式*********************************************************************************************
DELAY: 延时,用于扫描7段管时,在每一位停留的时间.时间太短,回使不该亮的段也有些亮
MOV 49H,#25H 49H的值不可以等于FF,因为FF取反后49H为0,不会延迟了
MOV A,0FEH 用取反设定回圈次数,
CPL A
MOV 49H,A
ADD_1:
INC 49H
MOV R1,49H 因为DJNZ判断完后要把判断的地址减去1,所以为了DJNZ不对49H的内容造成影响,把49H的值装到R1中去判断
DJNZ R1,ADD_1
RET
20次定时*********************************************************************************************************
TIMER_GO20:
用4AH 设定回圈次数*********************************
MOV 4AH,#15H 20(=0x15)次定时
MOV A,4AH 用取反设定定时次数,
CPL A
MOV 4AH,A
SJMP TIMER_S
TIMER_GO5: 与TIMER_GO20类似,只是这里只让定时5次一回圈。用于调整闪烁
MOV 4AH,#05H 5(=0x05)次定时
MOV A,4AH 用取反设定定时次数,
CPL A
MOV 4AH,A
TIMER_S:未重置(4AH)的呼叫,
设定启动T0
MOV TMOD,#01H 设定模式:T0模式1
MOV TH0,#3CH T0初值高8位
MOV TL0,#0AH T0初值低8位
CLR TF0 未知问题
SETB ET0 T0允许中断
SETB EA CPU允许中断
SETB TR0 启动T0
RET
T0_INT: T0中断程式段
CPL P1.7 测试埠:T0重新定时一次发生一次跳转
LCALL TIMER_S T0重新定时,继续跑。但:不会初始化20次计数
INC 4AH T0定时次数加1
MOV A,4AH
JNZ CY_20 50H加到FF再加就到0了。不为0回去接着执行主程式;为0 则20次定时 溢位即:00H(位)为1
CPL P1.6 测试埠每秒发生一次跳转
JB 00H,GO_BLINK 如果00H(位)被置1,则不再执行时间系统加1。用于调整时显示闪烁
LCALL CLOCK_GO 时间系统加1秒
LCALL TIMER_GO20 20次重新开始
SJMP CY_20
GO_BLINK:
LCALL TIMER_GO5 5次重新开始,
LCALL BLINK
CY_20: RET
时间系统进位设定*******************************************************************************************
CLOCK_GO:
INC 47H 秒加1
个位秒 进位 十位
MOV A,#5AH 主要是看"#5A"中的“A”,
SUBB A,47H
JNZ SS_OUT 如果(47H)值 低4 与A中的低4不相同,跳到“SS_OUT”,不进位
MOV 47H,#50H
INC 46H
SS_OUT:
秒 进位 分
MOV A,#56H
SUBB A,46H
JNZ SM_OUT 如果(46H)值 低4 与A中的低4不相同,跳到“SS_OUT”,不进位
MOV 46H,#50H
CLOCK_GO_M:INC 44H
分调整用
SM_OUT:
分个位 进位 分
MOV A,#5AH
SUBB A,44H
JNZ MM_OUT 如果(44H)值 低4 与A中的低4不相同,跳到“SS_OUT”,不进位
MOV 44H,#50H
INC 43H
MM_OUT:
分 进位 时
MOV A,#56H
SUBB A,43H
JNZ MH_OUT 如果(43H)值 低4 与A中的低4不相同,跳到“SS_OUT”,不进位
MOV 43H,#50H
CLOCK_GO_H:INC 41H
时调整用
MH_OUT:
时个位 进位 时
MOV A,#5AH
CLR CY 排除借位影响
SUBB A,41H
JNZ HH_OUT 如果(41H)值 低4 与A中的低4不相同,跳到“SS_OUT”,不进位
MOV 41H,#50H
INC 40H
HH_OUT:
时十位置0
MOV 4BH,40H 为了不影响暂存器资料,把40H、41H转到4BH、4CH中进行 操作
MOV 4CH,41H
MOV A,4BH
SWAP A 获得小时十位数,并放到A的高4位上
ANL A,#0F0H 清0低4位
ANL 4CH,#0FH 小时个位 高4位清0
ADD A,4CH 小时的十位与个位相加(高4位来自小时的十位暂存器40H,低四位来自小时个位的暂存器41H)
SUBB A,#24H
JNZ HD_OUT 如果(46H)值 低4 与A中的低4不相同,跳到“SS_OUT”,不进位
MOV 41H,#50H 个位 清零
MOV 40H,#50H 十位清零
HD_OUT:
CG_OUT: RET
END 时间系统进位设定*******************************************************************************************
INTO中断程式段*********************************************************************************
INT0_INT:
SETB 00H
CPL P1.5
CPL P1.5
CLR 01H 使得在换位闪烁时不会把上位的数带给下一位,
HMS_BACK: 在每次换位时都要把,被放到暂存上的值那回去,使其显示出来
MOV A,4DH
CJNE A,#02H,BSH_S back second OR hour _select
LCALL LIGHT_M
SJMP B_END
BSH_S: 恢复秒小时选择
JB CY,B_H
SJMP B_S
B_S: LCALL LIGHT_S 把调好的资料装回暂存器
SJMP B_END
B_H: LCALL LIGHT_H
B_END:
CLR TR0 定时器0,停止计时
DEC 4DH 调整型别(时、分、秒)改变
MOV A,4DH
JNZ INT0_OUT 是否恢复时钟
CLR 00H 置0,调整中断(ilong 定义)
CLR 01H
MOV 4DH,#04H 初始化调整型别
INT0_OUT:
RET
闪烁*****************************************************************
BLINK:
CPL P1.1
CPL 01H
MOV A,4DH
CJNE A,#02H,SH_S
SJMP MM_SET
SH_S: 闪烁秒小时选择
JB CY,HH_SET
SJMP SS_SET
SS_SET: 秒钟设定****************
JB 01H,DACK_S
LIGHT_S:
MOV 46H,4EH
MOV 47H,4FH
SJMP BLINK_OUT
DACK_S:
MOV 4EH,46H
MOV 4FH,47H
MOV 46H,#61H
MOV 47H,#61H
RET
MM_SET: 分钟设定**************
JB 01H,DACK_M
LIGHT_M:
MOV 43H,4EH
MOV 44H,4FH
SJMP BLINK_OUT
DACK_M:
MOV 4EH,43H
MOV 4FH,44H
MOV 43H,#61H
MOV 44H,#61H
RET
HH_SET: 小时设定****************
JB 01H,DACK_H
LIGHT_H:
MOV 40H,4EH
MOV 41H,4FH
SJMP BLINK_OUT
DACK_H:
MOV 4EH,40H
MOV 4FH,41H
MOV 40H,#61H
MOV 41H,#61H
BLINK_OUT:RET
INT1中断程式段***************************************************************
INT1_INT:
lcall HMS_BACK
clr tr0
CPL P1.4
MOV A,4DH
CJNE A,#02H,ADDSH_S ADD Hour OR ADD second OR _select
SJMP ADD_M
ADDSH_S: 调整秒小时选择
JB CY,ADD_H
SJMP ADD_S
ADD_S: LCALL CLOCK_GO
SJMP ADD_END
ADD_M: LCALL CLOCK_GO_M
SJMP ADD_END
ADD_H: LCALL CLOCK_GO_H
ADD_END:
LCALL CLOCK_GO
RET
/*********************************************************************************
最后放中断保险些
*********************************************************************************/
T0中断程式***************
ORG 000BH
LCALL T0_INT
RETI
INT0中断*****************
ORG 0003H
LCALL INT0_INT
RETI
INT1中断*****************
ORG 0013H
LCALL INT1_INT
RETI
END
资料型别在资料结构中的定义是一个值的集合以及定义在这个值集上的一组操作。
变数是用来储存值的所在处;它们有名字和资料型别。变数的资料型别决定了如何将代表这些值的位储存到计算机的记忆体中。在宣告变数时也可指定它的资料型别。
所有变数都具有资料型别,以决定能够储存哪种资料。
变数位定义使用bit lock
IO口位定义使用 *** it lock=P1^0;
希望可以帮到你,谢谢!
void INT0()interrupt 0 using 1
{....
.....
}
interrupt 0 指明是外部中断0;
interrupt 1 指明是定时器中断0;
interrupt 2 指明是外部中断1;
interrupt 3 指明是定时器中断1;
interrupt 4 指明是序列口中断;
using 0 是第0组暂存器;
using 1 是第1组暂存器;
using 2 是第2组暂存器;
using 3 是第3组暂存器;
51微控制器内的暂存器是R0--R7(不是R0-R3)
R0-R7在资料储存器里的实际地址是由特殊功能暂存器PSW里的RS1、RS0位决定的。
using 0时设定 RS1=0,RS0 =0,用第0组暂存器,R0--R7的在资料储存区里的实际地址是00H-07H。R0(00H)....R7(07H)
using 1时设定 RS1=0,RS0 =1,用第1组暂存器,R0--R7的在资料储存区里的实际地址是00H-07H。R0(08H)....R7(0FH)
using 2时设定 RS1=1,RS0 =0,用第2组暂存器,R0--R7的在资料储存区里的实际地址是08H-0FH。R0(10H)....R7(17H)
using 3时设定 RS1=1,RS0 =1,用第3组暂存器,R0--R7的在资料储存区里的实际地址是00H-07H。R0(18H)....R7(1FH)
标号可以自由编写,方便自己认识就可以,但要注意不能用指令或伪指令及相关的保留字,如不能用ORG,MOV,EQU等等字元做为标号,标号内最好不要用加减号或等于号等标点,标号的格式是字元加冒号(:)
如:
ORG 0000H
AJMP START
ORG 0003H
LJMP INT_REV
ORG 0030H
START:
.....
ORG 01FFH
INT_REV:
...
RETI
51微控制器中unsigned char到底定义的是字元还是0--255的数字
是一个8位的二进位制码 他可以储存字元代表的ascii码也可以表示一个0-255的数字,一般变数的大小不超过255的话尽量用char,因为这样可以节省一些RAM string定义的是字元还是字串 String定义可以是字元,也可以是字串,比如 String str =“asadsada”; char[] c1 = str1.toCharArray();对应的字串可以转换成char阵...
51单片机“uchar”是什么意思?
1. uchar的定义:“uchar”是“unsigned char”的缩写,表示无符号字符型变量。在C语言中,char类型用于存储字符数据,可以是带符号的或无符号的。对于无符号字符型,其取值范围从0到255。2. 在51单片机中的应用:51单片机是一种常用的嵌入式系统微控制器,其内部存储空间有限。在编程时,需要使用各种...
51微控制器把资料存入指定的地址或在读指定地址的资料用C语言怎么写...
unsigned char *ptr = (unsigned char *)0x1000; \/\/ 定义指向地址0x1000的指针 ptr = 0xAA; \/\/ 将0xAA写入到地址0x1000 ```如何用C语言读取微控制器中指定地址的资料?读取指定地址的资料同样使用指针。例如:```c unsigned char *ptr = (unsigned char *)0x1000; \/\/ 定义指向地址0x1000的...
关于printf输出char阵列
51微控制器 printf unsigned char型阵列,输出格式写什么? 想以十六进位制输出就写%x或%X; 想以十进位制输出就写%u 关于输出阵列元素 printf("%d ",*(p+1)); 修改为 printf("%d ",*(p+i)); 是i 不是 1 关于char *的输出 楼主你好! 我执行如下: again a 0046F01C...
51微控制器访问片内资料储存器某单元的内容用c语言怎么写?
。 x = 0x12; 向0x30内写入立即数0x12 51微控制器访问片外资料储存器的用c怎么写? unsigned char xdata *p=0x0650; unsigned char mid; 读: mid=*p; 写:*p=mid;把变数宣告成xdata 型的就可以了。 如 unsigned char xdata ab[100]; 这些资料就存放在外部资料储存器了,但要求...
微控制器中程式中,LED=~LED是什么意思?
微控制器程式中void display(unsigned int)是什么意思? 一个函式而已,名字是自定义的,他写display肯定就是显示函数了 微控制器程式中unsigned char * pd是什么意思啊 微控制器中unsigned char 与 unsigned int的区别如下: unsigned char 是无符号字元,资料长度是8位,表示值范围从0~255 ...
在51微控制器中_nop_()延时多长时间?
51微控制器中 i=103;while(i>0)i--; 是延时了多长时间啊? 51的话晶振按12M算,一条指令一般是(1\/12us)*12,双周期指令除外,每次回圈执行1次减法和比较,共206次,大概206us吧 51微控制器定时器能精确定时多长时间 当你的晶振频率为11.0592hz时,执行一个指令的周期是1s,如果你级联...
关于pwm控制直流马达转速的问题。
“首先,需要一个PWM信号发生器来生成PWM信号。这个信号发生器可以是硬件电路,也可以是软件算法。硬件电路通常使用比较器和定时器来生成PWM信号,而软件算法则可以使用微控制器的定时器或PWM输出功能。”“接下来,需要将PWM信号连接到直流马达的控制器或驱动器上。这个控制器或驱动器通常具有PWM输入接口,...
求大神给写一个单片机的pwm程序,,,
typedef unsigned char BYTE; \/\/ 定义字节类型 typedef unsigned int WORD; \/\/ 定义字类型 \/\/ 定义并映射PCA相关寄存器 sfr P1M1 = 0x91;sfr P1M0 = 0x92;sfr P3M1 = 0xB1;sfr P3M0 = 0xB2;sfr P5M1 = 0xC9;sfr P5M0 = 0xCA;sfr P_SW1 = 0xA2; \/\/ 外设功能切换寄存器...
8031微控制器定时器T0的四种工作方式是什么?
简述MCS-51微控制器定时器\/计数器四种工作方式 有四种工作方式: 方式0,13位定时\/计数方式。 方式1,16位的定时\/计数方式。 方式2,自动重灌载8位工作方式 方式3,定时\/计数器0被拆成2个独立的定时\/计数器来用。其中,TL0可以构成8位的定时器或计数器的工作方式,而TH0则只能作为定时器...