1、 ORG 00H LJMP START ORG 100H START: ;;-----初始化 MOV SP,#60H ;;初始化堆栈指针 Set18B20:;;-----DS18B20初始化 ;;DS18B20复位 ACALL Reset JB RFail,LOOP ;;复位失败则直接跳至显示部分 ;;对DS18B20发出Skip ROM命令 MOV A,#0CCH ACALL Write ;;对DS18B20发出温度转换命令 MOV A,#44H ACALL Write SetDisT:MOV DisTime,#3 ;;设置下一个循
2、环体的循环8次 LOOP: ACALL Display ;;显示 JB RFail,Set18B20 ;;DS18B20复位失败时,在显示完一次后重新复位 DJNZ DisTime,LOOP JNB DS18B20,$ ;;判断DS18B20是否已完成温度转换 ACALL GetTemp ;;从DS18B20读出温度值 ACALL DealTemp ;;温度值处理 ACALL SendDisDT ;;根据当前系统状态设置显示内容 SJMP SetDisT ;;;;;;; ;;根据当前状态给显示模块设置显示参数 SendDisDT: MOV D
3、ian,#7FH ;;最高位为0代表显示小数点 ;;传送温度值 MOV A,TempH ;;送高位数据 MOV VAR,TempL ;;送低位数据 ACALL TransData RET ;;A中保存高位值,Var中保存低位值 TransData: ;;取个位值 MOV B,#10 DIV AB MOV DisData2,B ;;取十位值 JZ HavNot1 ;;判断商是否为0 MOV B,#10 DIV AB MOV DisData3,B JZ HavNot2 ;;判断商是否为0 MOV DisData4
4、A SJMP XiaoShu ;;跳至百位符号处理部分 HavNot1:MOV DisData3,#10 ;;十位开始没有数字 HavNot2:MOV DisData4,#10 ;;百位开始没有数字 SignJudge:;;符号处理部分 JNB VAR.7,XiaoShu ;;当为负数显示符号 MOV A,#10 CJNE A,DisData3,BWSign MOV DisData3,#11 ;;负号在十位 SJMP XiaoShu BWSign:MOV DisData4,#11 ;;负号在百位 XiaoShu:;;小数处理部分,用查表法获取小数值,
5、精确到小数点后1位 MOV A,VAR ANL A,#0FH MOV DPTR,#XSTab MOVC A,@A+DPTR MOV DisData1,A RTransTemp: RET XSTab: DB 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 DS18B20通迅模块组 -------复位模块 Reset: ;;3微秒高电平 SETB DS18B20 MOV R7,#250 CLR RFail ;;清0复位失败标记 CLR DS18B20 ;;延迟501uS DJNZ R7,$ SETB DS18B20
6、释放总线(拉高数据线) ;;等待DS18B20作出复位成功反应,最大等待时间为69uS MOV R7,#17 Wait: JNB DS18B20,RReset ;;若DS18B20在作出复位成功反应,不再等待 DJNZ R7,Wait SETB RFail ;;70uS内DS18B20作出复位成功反应,置1复位失败标记 RReset: ;;延迟350Us MOV R7,#174 DJNZ R7,$ SETB DS18B20 RET / ;;-------向DS18B20写一个字的模块,要写的内容提前装入ACC中 Wri
7、te: MOV R6,#8 ;写8位 WriteBit: ;;2微秒高电平 SETB DS18B20 MOV R7,#3 ;;7微秒低电平 CLR DS18B20 DJNZ R7,$ ;;ACC低位送至DS18B20 RRC A MOV DS18B20,C ;;延迟60Us MOV R7,#28 DJNZ R7,$ ;;是否已写完8位 DJNZ R6,WriteBit RWrite: SETB DS18B20 RET ; / ;;-------从DS18B20读回一个字节的内容,读回的内
8、容装入ACC中 Read: MOV R6,#8 ;;读回8位 MOV A,#0 ;;读回的内容装入ACC中 ReadBit: ;;2微秒高电平 SETB DS18B20 MOV R7,#7 ;;2微秒低电平 CLR DS18B20 NOP ;;16微秒高电平 SETB DS18B20 DJNZ R7,$ ;;读回一位数据放入ACC中 MOV C,DS18B20 RRC A ;;延迟66Us MOV R7,#33 DJNZ R7,$ ;;是否已读完8位 DJNZ
9、 R6,ReadBit RRead: SETB DS18B20 RET / ;;-------与DS18B20通迅,读回两字节温度值,并装入ACC中TempL和TempH中 GetTemp: ACALL Reset ;;复位 JB RFail,RGetTemp ;;判断复位是否成功 ;;复位成功 ;;对DS18B20发出Skip ROM命令 MOV A,#0CCH ACALL Write ;;对DS18B20发出读命令 MOV A,#0BEH ACALL Write ;;从DS18B20读回低8位温度值 ACALL Read
10、 MOV TempL,A ;;从DS18B20读回高8位温度值 ACALL Read MOV TempH,A ACALL Reset ;;复位 JB RFail,RGetTemp ;;判断复位是否成功 ;;对DS18B20发出Skip ROM命令 MOV A,#0CCH ACALL Write ;;对DS18B20发出温度转换命令 MOV A,#44H ACALL Write RGetTemp: RET 温度数据处理模块 DealTemp: ;;将整数的二进制数部分移到一个字节,符号位和小数部分移到一个字节 MOV R1,
11、Var MOV Var,TempH MOV A,TempL XCHD A,@R1 ;;符号位、小数部分至VAR(@R1),整数部分至ACC SWAP A ;;整数部分处理 JNB Var.7,NotNeg ;;判断是否为负数 CPL A ;;为负数,取反后加1得其绝对值 ;;小数部分取反 XRL Var,#1FH ;; INC Var NotNeg: MOV TempH,A MOV TempL,Var RET 显示模块 -------显示DisData(30H)从开始的三个字节保存显示信息 Display: M
12、OV DPTR,#Tab ;;**显示小数部分 MOV A,DisData1 MOVC A,@A+DPTR MOV P2,A CLR Wei1 ACALL Delay SETB Wei1 ;;**显示个位 MOV A,DisData2 MOVC A,@A+DPTR ;;小数点处理 ANL A,Dian MOV P2,A CLR Wei2 ACALL Delay SETB Wei2 ;;**显示十位 MOV A,DisData3 MOVC A,@A+DPTR MOV P2,A CLR Wei3 ACALL D
13、elay SETB Wei3 ;;**显示百位 MOV A,DisData4 MOVC A,@A+DPTR MOV P2,A CLR Wei4 ACALL Delay SETB Wei4 RET Tab: ;;0~9、空白、负号的编码 DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;;延迟 Delay: MOV R6,#6 DD1:MOV R5,#250 DJNZ R5,$ DJNZ R6,DD1 RET END …………………………
14、………………………………………………………………………… org 00h ajmp start org 30h ;**********检测键盘状态的程序**************** START: mov p0,#0ffh ;置p0为输入口,将P0口置为1,用于检查按键是否按下 jnb p0.0,QIDONG ;按键S2按下,p0.0为0,进入启动(正转)程序 jnb p0.1,FANZHUAN ;按键S3按下,p0.1为0,进入反转程序 jnb p0.2,JITING ;按键S4按下,p0.2为0,进入急停程序 jnb p0.3,JIASU ;按键S5按下,p0.3为
15、0,进入加速程序 jnb p0.4,JIANSU ;按键S6按下,p0.4为0,进入减速程序 jnb p0.5,TINGZHI ;按键S7按下,P0.5为0,进入停止程序 ajmp start ;************启动程序,默认为顺时针转动,转速为2000RPM*********** QIDONG: LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动 JNB P0.0,QI LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序 QI: clr p0.6 ;p0.6接电机R/S端,将其清零表示电机可以运行 se
16、tb p0.7 ;p0.7接DIR端,为1,则与COM端断开,电机正转 mov p2,#0Bh ;p2.0接CH1,p2.1接CH2,p2.2接CH3,将速度设定为2000RPM lcall XIANSHI ;显示设定速度 LJMP START ;执行完启动程序后,回到检测按键状态程序 ;***************反转程序,也即逆时针转动***************** FANZHUAN: LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动 JNB P0.1,FAN LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序
17、 FAN: clr p2.3 ;接通BRK端,使电机急停 lcall PANTING ;调用判停程序,能从判停程序中返回,说明机已停 setb p2.3 ;断开BRK端,解除急停状态 clr p0.7 ;接通DIR端,使电机逆时针转动 lcall XIANSHI ;显示设定速度 LJMP START ;执行完启动程序后,回到检测按键状态程序 ;*****************急停程序********************* JITING: LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动 JNB P0.2,JI LJMP START ;软件消抖后
18、若p0.0为1,则认为按键未按下,回到检测按键状态程序 JI: clr p2.3 ;接通BRK端,使电机急停 lcall PANTING ;调用判停程序,若能从中返回,说明电机已停 LJMP START ;执行完启动程序后,回到检测按键状态程序 ;***************加速程序,每按一次键,加速500rpm**************** JIASU: LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动 JNB P0.3,JIA LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序 JIA: mov a,
19、p2 ;将p2的值复制到累加器a中 anl a,#07h ;取ch3ch2ch1的值,并放到累加器a中 jz START ;若a中值为0,则速度已经最大,不再加速,回到检测按键状态程序 mov r0,p2 dec r0 mov p2,r0 ;加速500rpm(参考电机驱动器说明中的多段速度选择部分) lcall XIANSHI ;显示设定的速度 LJMP START ;执行完启动程序后,回到检测按键状态程序 ;********************减速程序,每按一次键,减速500rpm**************** JIANSU: LCALL YANSHI ;调用
20、延时子程序,目的:软件消除按键抖动 JNB P0.4,JIAN LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序 JIAN: mov a,p2 anl a,#07h ;取ch3ch2ch1的值 cjne a,#07h,JS ;若a中数值为07h,则速度已为0, ljmp START ;若速度为0,则程序回到开始程序,不再减速,以防出错 JS: mov a,P2 inc a mov P2,a ;减速500rpm(参考电机驱动器说明中的多段速度选择部分) lcall XIANSHI ;显示设定的速度 ljmp STAR
21、T ;执行完启动程序后,回到检测按键状态程序 ;********************停止程序*********************** TINGZHI: LCALL YANSHI ;调用延时子程序,目的:软件消除按键抖动 JNB P0.5,TING LJMP START ;软件消抖后,若p0.0为1,则认为按键未按下,回到检测按键状态程序 TING: setb p0.6 ;p0.6接R/S端,为1,则与COM端断开 lcall PANTING ;调用判停程序,若能从中返回,说明电机已停 LJMP START ;执行完启动程序后,回到检测按键状态程序 ;****
22、延时10ms,这是一个子程序,功能是延时10毫秒************* YANSHI: mov a,#0 ;对累加器a置零,延时用 y: mov r1,#00h ;对寄存器r1置零,延时用 inc r1 cjne r1,#0ffh,y ;延时1ms inc a cjne a,#10,y ;延时10×1=10ms ret ;*******判停程序,这是一个子程序,若能从判停程序中返回,则说明电机已停******** PANTING: jnb p2.4,yanshi250ms ;若speed端为0,则进入延时程序 ajmp PANTING
23、若speed端为1,则返回PANTING,等待speed端出现0电平 yanshi250ms: clr p2.6 ;允许对计数器置数 mov p3,#08h ;对计数器置入数8 setb p2.6 ;计数器开始计数 mov a,#0 ;对累加器a置零,延时用 y250: mov r1,#00h ;对寄存器r1置零,延时用 inc r1 jb p2.5,PANTING ;若期間Tc为1,则电机未停,返回PANTING,继续判断 cjne r1,#0ffh,y250 ;延时1ms inc a cjne a,#250,y250 ;延时250ms, ret ;若至延时
24、结束Tc一直不改变状态,则说明speed端口无脉冲输出,认为电机停转,程序 ;返回。 ;在电机停转之前,单片机不响应按键状态的改变。 ;*******************显示程序,这是一个子程序************************** XIANSHI: mov a,p2 ;将当前的速度设定值读入a中 anl a,#07h ;取ch3ch2ch1的值,存入a中 mov b,#4 mul ab ;取得低位速度值对应的相对地址,存入a中 add a,r3 ;得到低位字符地址,放在a中 mov scon,#00h ;初始化串行口方式0 mov r2,#0 ;利用
25、r2来控制显示字符数 mov dptr,#tab ;字形表的入口地址 mov r3,a ;低位速度值地址存入r3 x: add a,r2 ;利用a与r2的和获得字符地址 movc a,@a+dptr ;查表获得字型码,放在a中 mov sbuf,a ;串口显示 l: jnb ti,l ;等待发送完毕 clr ti ;发送标志ti清零 inc r2 mov a,r3 cjne r2,#4,x ;发送四个字符 ret tab: db 03h,03h,49h,0dh db 03h,03h,03h,0dh db 03h,03h,49h,27h db 03h,03h,03h,27h db 03h,03h,49h,9fh db 03h,03h,03h,9fh db 03h,03h,49h,0ffh db 03h,0ffh,0ffh,0ffh END