找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1929|回复: 9
收起左侧

谁能告诉我哪错了吗(1): error C141: syntax error near ';' 温度计.C(2): error C...

[复制链接]
ID:1034970 发表于 2022-6-21 15:15 | 显示全部楼层 |阅读模式
;===================================================================================
; Main.asm file generated by New Project wizard
;
; Created:   //周四 6 月 7 2018
; Processor: 80C51
; Compiler:  ASEM-51 (Proteus)
;===================================================================================

$NOMOD51
$INCLUDE (8051.MCU)

;===================================================================================
; DEFINITIONS
;===================================================================================

;===================================================================================
; VARIABLES
;===================================================================================

;===================================================================================
; RESET and INTERRUPT VECTORS
;===================================================================================

      FLAG BIT F0                  ;  //声明传感器复位返回的标志位
      DQ BIT P1.7                  ;  //定义DQ 作为数据传输端口名
      ABIT EQU 35H
      BBIT EQU 36H
      CBIT EQU 37H                 ;  //固定个,十,百位的存储位置,名称
      ORG 0000H
      AJMP MAIN
      ORG 0100H                                   

;//主程序
MAIN: LCALL INIT_1                     ;  //复位
          LCALL FBLCHANGE                  ;  //改变温度的初始分辨率为9位
          LCALL GET_TEMP                             ;  //得到温度
          AJMP CHANGE                               ;  //跳转到数据处理子程序
;//复位程序
          INIT_1:SETB DQ                       ;  //总线释放
          NOP                                                   ;  //保持高电平,延时
          CLR DQ                                         ;  //总线置 0,请求响应
          MOV R0,#0FBH
TSR1: DJNZ R0,TSR1                        ;  //延时
          SETB DQ                                            ;  //再释放
          MOV R0,#25H
TSR2: JNB DQ,TSR3                                    ;  //改变为 0,则代表得到对应
          DJNZ R0,TSR2                                 ;  //未得到则继续等待,判断
TSR3: SETB FLAG                                    ;  //得到相应则标志位置 1,代表传感器正常存在
          MOV R0,#06BH
TSR4: DJNZ R0,TSR4                        ;  //延时
          SETB DQ                                            ;  //释放总线,完成复位
RET


;//改变温度分辨率
FBLCHANGE:
          LCALL INIT_1                                   ;  //复位
          MOV A,#0CCH                                     ;  //跳过ROM
          LCALL WRITE                                   ;  //把A写入传感器
          MOV A,#1FH                               ;  //改变温度分辨率为9
          LCALL WRITE                               ;  //把A写入传感器
RET


://得到温度并转换
GET_TEMP:
          SETB DQ                                           ;  //释放总线
          LACALL INIT_1                                   ;  //复位
          JB FLAG,TSS1                                   ;  //若传感器不存在,则直接返回主程序
RET

TSS2: MOV A,#0CCH
          LCALL WRITE                                   ;  //执行跳过ROM指令
          MOV A,#44H
          LCALL WRITE                                     ; // 执行测温指令
          LCALL DISPLAY                            ;  //不仅延时,还让程序完全生效前数码管置零
          LCALL INIT_1                             ;  //复位
          MOV A,#0CCH
          LCALL WRITE                                     ;  //执行跳过ROM置零
          MOV A,#0BEH
          LCALL WRITE                                     ;  //执行读取温度数据指令
          LCALL READ                                    ;  //跳转至通信子程序
RET


;//写入数据                                                      ;  注:不可超过120us,否则无法写入
WRITE:MOV R2,#8                                    ;  //写入八位二进制码,即循环次数
          CLR C                                         ;  //进位标志位初始置零
WR1:  CLR DQ                                            ;  //拉低总线为写入做准备
          MOV R3,#6
          DJNZ R3,$                                     ;  //快速延时
          RRC A
          MOV DQ,C                                     ;  //将A又循环写入C,写入总线以输入到传感器
          MOV R3,#23
          DJNZ R3,$                                     ;  //快速延时
          SETB DQ                                                ;  //释放,表示此位写入完毕
          NOP
          DJNZ R2,WR1                                    ;  //循环八次,一次写入八位
          SETB DQ                                         ;  //释放总线
RET


;//读入数据
READ: MOV R4,#2                                    ;  //读取两个八位数据,是外层循环次数
          MOV R1,#29H                                    ;  //立即数寻址给定存储位置
REE0: MOV R2,#8                                     ;  //给定数据位数,是内层循环次数
REE1: CLR C                                         ;  //进位标志位初始置零
          SETB C
          NOP
          NOP
          CLR DQ
          NOP
          NOP
          NOP
          SETB DQ                                                ;  //输入脉冲并持续2-3个机器周期
          MOV R3,#7                                   
          DJNZ R3,$                                      ;  //快速延时,等待传感器响应
          MOV C,DQ                                      ;  //按位读出
          MOV R3,#23
          DJNZ R3,$                                       ;  //快速延时
          RRC A                                                 ;  //把C存入A内
          DJNZ R2,REE1                                    ;  //循环8次
          MOV @R1,A                                     ;  //存储A
          DEC R1                                              ;  //更换地址
          DJNZ R4,REE0                                     ;  //循环2次
RET


;//数据处理函数
CHANGE:
          MOV A,29H
          MOV 26H,29H
          MOV 25H,28H
          MOV 24H,28H                                     ;  //在24H存储原始数据防止丢失
          MOV C,25H.7                                     ;  //存储符号位进C
          JNC SN1                                              ;  //判断温度的正负,正数则跳过转补码程序
          MOV A,25H
          CPL A                                              ;  //取补码,由于无效位置1,25H不必担心数据溢出
          MOV 25H,A
          MOV A,26H
          CPL A
          INC A                                               ;  //由于是末位,需要加一
          MOV 26H,A
          MOV 29H,26H
          MOV 28H,25H                                      ;  //在26H,25H中操作后放回29H,28H
SN1:  MOV C,28H.0                                      ;  //正负温度到此均得到整数部分绝对值
          RRC A
          MOV C,28H.1
          RRC A
          MOV C,28H.2
          RRC A
          MOV C,28H.3                                       ;  //分别循环,存入A内,连续4次滤掉小数部分
          RRC A                                                    ;  //可分析A内八位恰为整数部分(最高位为0)
          JC SL0
          MOV 27H,#00H
          AJMP SL5
SL0:  MOV 27H,#05H
SL5:  MOV 29H,A                                       ;  //为小数部分显示0和5做准备
            LCALL DISPLAY                                   ;  //转入显示函数
LJMP MAIN                                                ;  //返回主函数,程序执行完毕


;//显示函数
DISPLAY:
          MOV A,29H
          MOV B,#10
          DIV AB
          MOV ABIT,B
          MOV B,#10
          DIV AB
          MOV BBIT,B
          MOV CBIT,A                                       ;  //此时可知CBA即为百十个位
          MOV R0,#4                                        ;  //循环显示
DPL1: MOV R1,#250                                       ;  //长时间延时循环
DPL2: MOV C,24H.7
          JNC DPL3
          MOV P0,#0BFH
          SETB P1.2
          LCALL DELAY
          CLR P1.2
          AJMP DPL4
DPL3: MOV P0,#0FFH  
          SETB P1.2
          LCALL DELAY
          CLR P1.2                                              ;  //符号位判断显示
DPL4: MOV DPTR,#TAB
          MOV A,27H
          MOVC A,@A+DPTR
          MOV P0,A
          SETB P1.6
          LCALL DELAY
          CLR P1.6                                            ;  //小数位判断显示
          MOV A,ABIT
          MOV DPTR,#TAB1
          MOVC A,@A+DPTR
          MOV P0,A
          SETB P1.5
          LCALL DELAY
          CLR P1.5
          MOV A,BBIT
          MOV DPTR,#TAB
          MOVC A,@A+DPTR
          MOV P0,A
          SETB P1.4
          LCALL DELAY                                            ; //个十百位显示
          CLR P1.4        
          MOV A,CBIT
          MOVC A,@A+DPTR
          MOV P0,A
          SETB P1.3
          LCALL DELAY  
          CLR P1.3
          DJNZ R1,DPL2
          DJNZ R0,DPL1
RET


;//延迟函数
DELAY:MOV R5,#10
DEL0: MOV R6,#1
DEL1: MOV R7,#20
DEL2: DJNZ R7,DEL2
          DJNZ R6,DEL1
          DJNZ R5,DEL0
RET

TAB:                                                                      ;  //正常阳极数码0-9
          DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
TAB1:                                                                      ;  //带小数点的个位显示数码0-9
          DB  40H,79H,24H,30H,19H,12H,02H,78H,00H,10H


LOOP:
          JMP LOOP ;====================================================================
END


回复

使用道具 举报

ID:979299 发表于 2022-6-21 18:04 | 显示全部楼层
语法错误,少符号了
回复

使用道具 举报

ID:979299 发表于 2022-6-21 18:06 | 显示全部楼层
://得到温度并转换。此处把:号换成;号
回复

使用道具 举报

ID:883242 发表于 2022-6-21 20:14 | 显示全部楼层
内容明明是汇编asm文件,名字却是c文件,无法编译。
回复

使用道具 举报

ID:342822 发表于 2022-6-21 22:51 | 显示全部楼层
://得到温度并转换
GET_TEMP:
          SETB DQ                                           ;  //释放总线
          LACALL INIT_1                                   ;  //复位
          JB FLAG,TSS1                                   ;  //若传感器不存在,则直接返回主程序红字的地方好好研究
应是 分号 ;
LCALL  
TSS1标签不存在,是不是TSR1

回复

使用道具 举报

ID:1034970 发表于 2022-6-22 07:19 | 显示全部楼层
改了,但运行后总是显示一二行有错误,
Build target 'Target 1'
compiling 温度计.c...
温度计.C(1): error C141: syntax error near ';'
温度计.C(2): error C129: missing ';' before '.'
Target not created
回复

使用道具 举报

ID:883242 发表于 2022-6-23 00:32 | 显示全部楼层
暮至北海 发表于 2022-6-22 07:19
改了,但运行后总是显示一二行有错误,
Build target 'Target 1'
compiling 温度计.c...

我在地板位已经说的很清楚了,你就是看不懂。

你的源文件是汇编,你却给了扩展名c,结果导致编译器当成c文件来编译。

两种语言语法完全不一样,能编译通过就真的见鬼了。
回复

使用道具 举报

ID:1034970 发表于 2022-7-1 09:27 | 显示全部楼层
Hephaestus 发表于 2022-6-23 00:32
我在地板位已经说的很清楚了,你就是看不懂。

你的源文件是汇编,你却给了扩展名c,结果导致编译器当 ...

我按你说的改过还是不行。。。
回复

使用道具 举报

ID:1034970 发表于 2022-7-1 09:54 | 显示全部楼层
Hephaestus 发表于 2022-6-23 00:32
我在地板位已经说的很清楚了,你就是看不懂。

你的源文件是汇编,你却给了扩展名c,结果导致编译器当 ...

可以了,谢谢,我确实是把那个扩展名弄错了。。
回复

使用道具 举报

ID:329625 发表于 2022-7-1 19:36 | 显示全部楼层
符号不对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表