📄 readme2.txt
字号:
/************************* C-51(128k)程序开发说明 *************************/
在阅读此文件之前, 请先看 readme1.txt
/* 目录和文件 */
\C51\BIN 可执行文件(*.EXE)
\C51\LIB 运行库文件(*.R03)
\C51\INCLUDE 头文件(*.H)
\C51\SOURCE C和汇编源文件(*.C,*.S03,*.XCL,*.DOC)
\c51\example 子目录下有抄表机的例程(包括电,气抄表), 其*.doc文件为使用说明.
开发或实验时,通讯程序请调用THJ32.EXE (38400波特率)
在WINDOWS环境下的DOS界面使用THJ32.EXE时若出现问题时,请在WINDOWS起动时进入
DOS界面再使用THJ32.EXE.
/* 开发步骤 */
1.安装:在机器硬盘上建立C51目录,把开发工具软盘的内容拷贝到该目录.
2.环境设置:运行C51目录下的AUTO.BAT,也可以将该文件中的设置加到根目录下的
AUTOEXEC.BAT文件里.设置后源程序就可以在自定义的工作目录下开发,以下默认
工作目录为C:\C51\SOURCE
3.编辑:可用任何不带排版格式的编辑器(如:EDIT)编写C51源程序,扩展名为*.C
4.编译:在工作目录下键入:
C97 程序名(不带扩展名) [Enter]
5.连接:若编译通过,则键入:
L97 程序名(不带扩展名) [Enter]
连接成功后生成扩展名*.HEX文件
6.转换:
HEXOBJ 程序名(不带扩展名) [Enter]
转换后生成*.OBJ文件,即是要下装到手持机里的目标程序.下装的方法请查询随机的
<<使用说明>>.
/* C-51编程的注意事项 */
1.在变量定义时,C-51新增了三个扩展语言关键字:
①code
ROM空间,用来存放常数表格等不需变化的数据.举例:
code char *d={"程序开发说明"};
②xdata
外部RAM空间,此种变量用来存放临时变量,数组等.举例:
xdata int i,j;
xdata char c,s[10];
xdata struct [结构名]{
...
...
}[变量名或数组名];
注意:程序中用xdata定义的所有变量存放在外部RAM地址00DAH开始的地方,该设置
在文件hncc.xcl中"-Z(XDATA)C_ARGX,X_UDATA,X_IDATA,ECSTR,RF_XDATA=DA"
③no_init
掉电保护RAM空间,用于存放掉电仍需保护的数据.在本机器中也是指外部RAM.开始
地址为C000H,该设置在文件hncc.xcl中"-Z(XDATA)NO_INIT=C000".用户可以根据需
要修改设置.
2.在定义数组的大小时应将字符串结束符'\0'考虑进去,否则若引起RAM地址冲突可能会
产生不可预料的结果.例如:取时间函数gettime(s),返回的是8个字符长的时间串,加
上结束符'\0'共9个字节长,故定义s的大小时至少是9个字节.
3.C51编译程序对微机常规内存的大小有一定要求,如果常规内存空间不够,编译时会出
现内存不够的提示:
" * * * C O M P I L E R O U T O F M E M O R Y * * * "
事实上当C源程序较大时,这种情况是经常发生的.解决办法有两个:
①.调整微机常规内存,使它尽可能大.
(在程序很大时,该方法并不是最终的解决办法.)
②.将C源程序分成两个或两个以上的源程序,分别编译,然后一起连接.具体过程为:
* 主程序文件用程序C97.BAT编译
* 其它源文件作为附加程序用C97LIB.BAT编译成库
* 将新库名加入L97.BAT的命令行中
xlink -f HNCC %1 [新库名] HNCCL cl8051l -o %1.hex -x -l %1.map
* 连接
* 转换
例如:源程序包括:主程序demo.c和附加程序demo1.c,demo2.c共三个文件.
* C97 demo
* C97LIB demo1
C97LIB demo2
* 将文件L97.BAT改为:
xlink -f HNCC %1 demo1 demo2 HNCCL cl8051l -o %1.hex -x -l %1.map
* L97 demo
* HEXOBJ demo
注意:在主程序和附加程序中,如果其中一个程序用到了另一个程序中定义的
变量,那么在该程序中应把该变量说明为外部引用.例如:
/*demo.c*/
int i,j;
/*demo1.c*/
extern i,j;
4.熟悉数据分配情况在许多时候是很有必要的。在这一版本的编译系统中,采用大
模式进行编译,所有的变量及数据都存放在外部RAM中,地址从0000H到FFFFH。变
量在该区域存放的首地址可以根据需要和可能由编程人员进行调整,即调整连接
配置文件HNCC.XCL。以下为该文件的说明:
-! 定义CPU类型 -!
-c8051
-! 设置各种由XDATA定义的变量的存储地址从0116H开始。-!
-Z(XDATA)C_ARGX,X_UDATA,X_IDATA,ECSTR,RF_XDATA=116
-! 设置由NO_INIT声明的变量的存储地址从C000H开始。 -!
-Z(XDATA)NO_INIT=C000
以上两个起始地址0116H和C000H都是可以根据实际需要进行调整的,但要注意的
是地址空间0000H-0116H在系统程序中已用到,所以在应用程序中不应再用。另外,
从上位机下装的数据库在外部RAM中固定从起始地址1000H开始存放,注意变量地
址不要与之冲突。在执行了L97.BAT连接程序后,除生成*.HEX目标程序外,还会生
成映象文件*.MAP。在该映象文件中可以看到最终的(变量)数据存储情况。
/* C-51自定义函数说明 */
一.键盘接口函数
1.char key(xdata char k)
功能:等待从键盘输入一个ASCII字符或汉字.
参数:k 为0,按键无回显;非0,按键带回显(显示位置为当前光标位置)
返回:字符的ASCII码或汉字内码的第一字节,内码的第二字节放系统变量NM2.
2.char keys(xdata char *s)
功能:从键盘接收一串字符或汉字,带回显.
参数:s 键值缓冲区指针
返回:输入字符串的实际长度
说明:①在按键输入字符串的过程中,如果输错可以按[清除]键删除上一输入,按[确认]
键后退出接收.且自动在串s的末尾加结束符0x00,故该函数接收的串可以直接
用"putstr(s);"显示出来.
②输入字符在换行时的行距以及回显可能会受显示状态(函数screen())的影响.
③该函数支持最大256个字符的输入.
3.char keysn(xdata char *s,xdata char n)
功能:从键盘接收一串字符或汉字,带回显.
参数:s 串值缓冲区指针
n 接收的有效字符长度
返回:输入字符串的实际长度
说明:与函数keys()的区别是,如果实际接收的字符数小于n,则在剩余位置补上空格
符0x20.该函数不支持长字符串输入,最多16个字符.
4.char keysm(xdata char *s,xdata char n)
功能:从键盘接收一串字符或汉字,输入长度不能超过n.
参数:s 串值缓冲区指针
n 接收串的最大长度
返回:输入字符串的实际长度
说明:输入时的回显受函数screen()的影响,若为字符状态(screen(0)),回显为半高
字符.若为汉字状态(screen(1)),回显为全高字符.
5.char keygo(void)
功能:查询键盘是否有键按下,不等待.
返回:有键按下返回键值,无按键返回0.
二.显示接口函数
1.void screen(xdata char bz);
功能:设置显示状态
参数:bz 0--字符状态
1--汉字状态
说明:在用函数putn()显示外RAM字符串时,如果字符串中有汉字,则应该在调用putn()
之前将显示状态设为汉字状态,即:screen(1);
2.void cls(void)
功能:清屏
3.void clsn(xdata char lin,xdata char n)
功能:清除屏幕上从lin行开始的n行显示.
参数:lin 要清除的起始行号(1--16)
n 清除的行数(1--16)
4.void moveto(xdata char x,xdata char y)
功能:移动光标
参数:x 行(1--16)
y 列(1--16)
5.char getx(void)
功能:返回当前光标的行号(1--16)
6.char gety(void);
功能:返回当前光标的列号(1--16)
7.void putch(char c)
功能:显示一个字符.
参数:c 字符ASCII码
8.void putstr(char *s)
功能:显示一串字符或汉字.
参数:s 字符串指针
说明:如果串中有汉字,应先将显示状态置为'汉字状态'(screen(1)),
参数s可以是指向CODE区的指针,或是指向XDATA区的指针.串中可以带'\n'参数
作为换行符.串应以\0结束.
举例: ①putstr("汉字显示");
②xdata char s[8];
gettime(s);
putstr(s);
9.void putn(xdata char n,xdata char *s)
功能:显示n个字符或汉字.
参数:n 字符数
s 指向XDATA区的指针
说明:如果串中有汉字,应先将显示状态置为'汉字状态'(screen(1)),
一个汉字算两个字符.
举例: xdata char s[9];
goto(1,1);
putstr("当前时间:");
gettime(s);
putn(8,s);
10.void putch_h(char c)
功能:显示一个字符.
参数:c 字符ASCII码
说明:该函数与putch()的唯一区别是显示的字符是全高字符.
11.void putstr_h(char *s)
功能:显示一串汉字或字符.
参数:s 字符串指针
说明:该函数与putstr()的唯一区别是显示的字符是全高字符.
12.void putn_h(xdata char,xdata char *)
功能:显示n个字符或汉字.
说明:该函数与putn()的唯一区别是显示的字符是全高字符.
13.void setdot(xdata char x,xdata char y)
功能:点亮屏幕上某一点.
参数:x 行坐标(1--128)
y 列坐标(1--128)
14.void clrdot(xdata char x,xdata char y)
功能:清除屏幕上某一点.
参数:x 行坐标(1--128)
y 列坐标(1--128)
15.void xscc(xdata char *)
功能:显示一个长字符或汉字串(超过一屏).
说明:该函数自带翻屏功能.按[↑].[↓]键翻屏,按[F2]键退出.
三.蜂鸣器与时钟接口函数
1.void bell(xdata char t)
功能:蜂鸣器响
参数:t 时长(1--16)
2.void gettime(xdata char *t)
功能:取时间
参数:*t hh.mm.ss(时.分.秒)形式的字符串,8个字符.
3.void getdate(xdata char *d)
功能:取日期
参数:*d yy.mm.dd(年.月.日)形式的字符串,8个字符.
4.void settime(xdata char *t)
功能:设置时间
参数:*t hh.mm.ss(时.分.秒)形式的字符串,8个字符.
举例:设置时间为12时5分5秒
settime("12.05.05");
或:xdata char s[10];
...
gets(s);
settime(s);
5.void setdate(xdata char *d)
功能:设置日期
参数:*d yy.mm.dd(年.月.日)形式的字符串,8个字符.
四.IC卡接口函数
1.void poweron(void)
功能:卡上电
说明:用于所有卡类型
2.void poweroff(void)
功能:卡下电
说明:用于所有卡类型
3.char cardtest(void)
功能:检测卡是否到位
返回:为0,已插卡;非0,未插卡.
说明:用于所有卡类型
4.void cardtype(xdata char t)
功能:设置卡类型
参数:t 卡类型,说明如下:
#define SIM441828 0
#define SIM443242 1
#define ATMEL16K 2
#define AT24C64 3
#define AT24C01 4
5.char cardcomp(xdata char l,xdata char *c)
功能:IC卡密码比较
参数:l 密码长度
c 密码串
返回:返回比较是否正确(0--密码正确;1--密码错误).
另外系统变量VIC中存放IC卡密码'错误计数器'的值.
说明:用于SIM441828,SIM443242卡.
密码串c可以是一个指针变量,也可以是一个确定的串.
举例:①xdata char s[10];
...
poweron();
cardtype(SIM441828);
keys(s);
cardcomp(4,s);
poweroff();
...
②...
poweron();
cardtype(SIM443242);
cardcomp(6,"372147");
poweroff();
...
6.void cardread(xdata char pag,xdata char adr,xdata char len,xdata char *s)
功能:读卡
参数:pag 页号
adr 地址偏移量(0-255)
len 读数据的长度(1-256)
*s 欲放数据的缓冲区指针
说明:用于SIM441828(4页),SIM443242(1页),ATMEL16K(8页),AT24C64(32页)卡.
7.void cardwrit(xdata char pag,xdata char adr,xdata char len,xdata char *s)
功能:写卡
参数:pag 页号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -