打印

mc语言

[复制链接]
1711|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whcon|  楼主 | 2013-11-28 11:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MC语言
一、 前言
MC(MCU COMPILE)语言是针对计算机(最重要是单片机)在控制和检测领域开发的计算机语言,它最主要的是编程比较方便,读起来比较直接,方便校对,占用的空间(数据和程序空间)也比较小,等特点。还具有中英文编程的优点。
二、 编程
我们都知道单片机是什么,单片机是需要编写程序的,可怎么编程?怎么编程效率高哪?这可能有很多朋友回答不出来,因为很多朋友不知道什么是单片机的效率,我们都知道单片机有数据和程序空间,而且它们都不是很大的(这里是不扩充系统,也就是它的本身拥有的)。怎么利用好这个空间,这就是单片机效率的一个方面。
编写程序我们要注意这个方面(效率问题),编程语言没有好坏只有实用与不实用之分。不管您是使用汇编语言还是使用C语言,当然还有MC语言或更高级语言,能够完成任务是最终目的,这中间可能存在我们前面提到的“效率”问题。怎么能把这个“效率”放到最高,这就是我们要讨论的问题。我们都知道计算机语言分低级、中级、高级语言,这个级别不是语言的质量(好坏,语言级别高低)之分,而是用于适合人的表达之分。语言级别越高越适合人的表达,对机器来讲,语言越高级其效率就越低(就是占用的数据和程序空间就越大)。在单片机这个领域,一般都使用汇编语言和C语言,因为我们要符合这个领域的要求。汇编语言虽然版本比较低下,编写程序比较麻烦,但它比较直接,占用的空间资源比较小,也比较灵活;C语言编写的程序比较方便,人看到的表达比较清楚,但它资源的空间资源比较大,条条框框也比较多,虽然阅读比较方便,但单片机空间资源本身就小,对于大一点系统可能就难以应付了(不增加系统)。在这个方面年纪长一点还是用汇编语言多一点,年轻的用C语言还是多一点,这不是说明语言的高级,而是说明年纪长的接触单片机比较早,使用汇编语言比较顺手,C语言的条条框框也比较多,学习起来也比较麻烦,因此就继续使用汇编语言,而年轻人本身本来就没有负担(没有过多的语言压力),而C语言也是发展的趋势,学习C语言就成为自然而然的事情。我就属于用汇编语言那种人,接触计算机比较早一点,在单板机出现前,就使用了计算机芯片,记得当时用的8085芯片,后来单板机出现了又改用Z80芯片,因为汇编语言没有通用性,又得学习Z80的汇编指令系统,单片机出现了以后,又学习了8051、PIC16C58、PIC16C71的汇编指令系统,感觉真是有点累。根据这些情况,我就开发了MC(MCU COMPILE)编译软件。根据应用领域以及单片机的特点,单片机主要应用于控制或检测方面,舍去了于此无关的指令系统,而且编程也简单了,使它具有通用性,成立了一个语言系统,我就把它称为MC语言。而且对MCS51来说没有距离问题,我们都知道MCS51有LJMP、AJMP、SJMP以及JZ、JNZ、JC、JNC、JB、JNB、JBC、CJNE、DJNZ、ACALL、LCALL,它们反应都是距离问题,而使用了JUMP和CALL代替了LJMP、AJMP、SJMP和ACALL、LCALL,在MC语言里,都根据程序的实际情况,以最节约程序空间的方式表达出来。另外MC编译器可以使用汉字编写程序。
第一个例子
用MCS51汇编语言编写的程序
;变量赋值
TMH0 EQU  XX
TML0 EQU  XX
;程序开始
ORG  0            ;伪指令
          SJMP MAIN         ;跳转到初始化部分
;中断矢量表
   
   
          ORG  0BH          ;定时器0中断地址
          AJMP TIME0          ;跳转到定时器0服务程序地址
MAIN:
          ORG  XX
SETB ET0          ;允许时钟0中断
MOV  TMOD,        #11H;使用内部时钟,时钟0和1都为方式1(十六位计数)
MOV  TH0,        #TMH0;送入定时器0高位初始值
MOV  TL0,        #TML0;送入定时器0低位初始值
SETB TR0          ;定时器0可以计数
SETB EA           ;打开中断
;进行了各种初始化
   
   
MAIN_LOOP:                  ;主循环开始
          JB   P0.1,LOOP0  ;条件1
   
   :                       ;执行某些操作
LAST_OPERATION:             ;最后的操作
          AJMO MAIN_LOOP    ;返回主循环开始
LOOP0:                     ;符合条件1的操作
   
   
          AJMP LAST_OPERATION
TIME0:                     ;定时器0中断子程序
          PUSH ACC          ;累加器压栈
PUSH PSW          ;状态字压栈
MOV  TH0,   #TMH0
MOV  TL0,   #TML0
CLR  RS0
SETB RS1          ;改变寄存器组
   
   :                       ;一些操作
P0P  PSW          ;弹栈
POP  ACC          ;弹栈
          RETI              ;中断返回
如果使用MC语言,可以这样编写
定义 TMH0 为 XX,TML0  为 XX
MC语言对于没有 ORG  或 地址 的伪指令在第一条会产生 JUMP MAIN 指令,并产生中断矢量表和服务的MAIN段名以及中断的状态。
中断 2  內触发  1  时钟 XXXXXXXX  TIME0
;初始化
   :
   :
;主循环开始
MAIN_LOOP:                 //主循环开始
如果 P0.1
跳转 LOOP0
结束如果
   
   
LAST_OPERATION
跳转 MAIN_LOOP
LOOP0
   
   
          跳转 LAST_OPERATION
TIME0
压栈 A
压栈 PSW
TH0=TMH0
TL0=TML0
RS0=F
RS1=T
   
   
弹栈 PSW
弹栈 A
中断返回
另外一个例子
变量名1=变量名2(256)乘上变量名3(256)= 65536d(1,00000000,00000000b)
用MCS51汇编语言编写程序:
     变量名1 EQU 20H
变量名2 EQU 23H
变量名3 EQU 25H          //变量的地址
     MOV  R0,      #变量名1
//乘积清零
     CLR  A
     MOV  @R0,        A
     INC  R0
     MOV  @R0,        A
     INC  R0
     MOV  @R0,        A
//准备乘法
MOV  R0,      #变量名2
MOV  @R0,        #0
INC  R0
MOV  @R0,        #1
     MOV  R0,      #变量名3
     MOV  @R0,        #0
     INC  R0
     MOV  @R0,        #1
     MOV  R2,      #16
MAIN_LOOP:
     MOV  R0,      #变量名3
     CLR  C
     MOV  A,        @R0
     RLC  A
     MOV  @R0,      A
     INC  R0
     MOV  A,        @R0
     RLC  A
MOV  @R0,      A
PUSH PSW
//乘积乘上2
MOV  R1,      #变量名1
CLR  C
MOV  A,        @R1
RLC  A
MOV  @R1,        A
INC  R1
MOV  A,        @R1
RLC  A
MOV  @R1,        A
INC  R1
MOV  A,        @R1
RLC  A
MOV  @R1,        A
POP  PSW
JNC  OFFSET1
MOV  A,        R0
MOV  B,        A         //保存乘数
MOV  R0,       #变量名1
MOV  R1,      #变量名2
MOV  A,        @R0
ADD  A,        @R1
MOV  @R0,        A
INC  R0
INC  R1
MOV  A,        @R0
ADDC A,        @R1
MOV  @R0,        A
INC  R0
MOV  A,        @R0
ADDC A,        #0
MOV  @R0,        A
MOV  A,        B
MOV  R0,      A
OFFSET1
DJNZ R2,      MAIN_LOOP
用MC语言编写:
     定义 变量名1 为 3,变量名2 为 2,变量名3 为 2
     变量名2=256
     变量名3=256
     变量名1=变量名2*变量名3
就这样简单。


相关帖子

沙发
www5911839| | 2013-11-28 11:37 | 只看该作者

使用特权

评论回复
板凳
whcon|  楼主 | 2013-11-28 11:41 | 只看该作者
一、  中断的描述
Interrupt x ispulse(potential) 过程名
Interrupt x is external(in) y time(count)times(unit uS) 过程名
Interrupt x is serialy BTrate(unit K) 过程名
中文为 中断 x 是 脉冲(电位) 过程名
中断 x 是 外触发(内触发) y 时钟(计数器) 时间常数(单位 微秒) 过程名
中断 x 是 串行口 y 波特率(单位 千) 过程名
注:x为中断号,y为模式
四、MC编译软件
这个软件不仅可以编译汇编语言、MC语言,还具有反汇编、仿真的分支,它们都是使用.hex文件,调试程序时候使用仿真分支,在这个分支可以输入必要的条件,比我们开始时方便多了,那时牵扯人员也多。 不过这里要声明不要解剖别人的软件,防止发生法律纠纷。在MC语言编译器里,赋值指令没有先后顺序,可以在控制程序内安插,当然在程序开始就赋值最好,这样便于阅读,也是养成良好习惯。可以不用ORG或地址伪指令,赋值语句可以一行多个赋值语句,如:DEF VAR1 AS NUMBER,VAR2 AS VAR3,VAR4 AS BIT。如果NUMBER小于6(1-5)表示数据长度(八位机就是字节数),反之表示数据的大小。如果不是自动排列地址则用DEF VER1 AS NUMBER ADDR XX,汉字为 定义 变量1 为数据长度 地址 XX。对于常用的程序模块,只编一次程序,使用时候我们就调用可以了,这样也可以大大压缩了编程时间,不用重复编写程序了。
五、结束语
MC语言编译器是一个有利于单片机开发的良好语言,也是良好调试软件。对于编写的程序约束力比较小,前面定义好的数据大小(对于多字节数据尤为重要)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

14

帖子

0

粉丝