首页 >>  正文

0到99可增减计数器的单片机系统。求汇编语言程序。在线等。特急。

来源:www.zuowenzhai.com    作者:编辑   日期:2024-05-27
振荡频率12MHZ 测量的温度范围-55——99 精度误差小于0.5 有效数小数点后一位 单片机汇编语言实现 谢谢

TEMPERATURE_L EQU 30H
TEMPERATURE_H EQU 31H
TEMPERATURE_FH EQU 32H ;温度符号位
TEMPERATURE_INT EQU 33H ;转换后的温度十六进制整数部分
TEMPERATURE_FLT EQU 34H ;转换后的温度十六进制小数部分
TEMPERATURE_B EQU 35H ;转换后的温度十进制百位
TEMPERATURE_S EQU 36H ;转换后的温度十进制十位
TEMPERATURE_G EQU 37H ;转换后的温度十进制个位
TEMPERATURE_XS EQU 38H ;转换后的温度十进制小数位

DAT_LCD EQU P2
FLAG BIT 00H
DQ BIT P0.0

BL BIT P1.0
RS BIT P1.1
RW BIT P1.2
EN BIT P1.3

ORG 0000H
LJMP START
ORG 0030H
START:
MOV SP,#60H
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV SCON,#50H
SETB TR1
CLR BL
LCALL INIT_1602
LCALL DISP_START

;------------------>--------------------
MAIN:
LCALL READ_TEMPERATURE
LCALL DISP_18B20
LCALL CHUANGE_TEMPERATURE
LCALL DISP_TEMPERATURE
LCALL SEND_TEMPERATURE
LJMP MAIN
;------------------------------------------------

;---------------------------
READ_TEMPERATURE:
SETB DQ
LCALL INIT_18B20 ;先复位DS18B20
JB FLAG,OK_18B20 ;判断DS1820是否存在,若DS18B20不存在则返回
RET
OK_18B20:
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_18B20
MOV A,#44H ;发出温度转换命令
LCALL WRITE_18B20
LCALL DELAY_18B20 ;等待AD转换结束,12位的话750毫秒
LCALL INIT_18B20 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_18B20
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_18B20
MOV R1,#30H
LCALL READ_18B20 ;将读出的温度数据保存到
MOV R1,#31H
LCALL READ_18B20
RET
;------------------------------------------------

;-------------------------------
INIT_18B20:
SETB DQ
NOP
CLR DQ ;主机发出延时537微秒的复位低脉冲
MOV R7,#230
DJNZ R7,$
SETB DQ ;然后拉高数据线,释放总线进入接受状态
NOP
NOP
NOP
MOV R7,#110
TSR1:
JNB DQ,TSR2 ;等待DS18B20回应
DJNZ R7,TSR1
LJMP TSR3
TSR2:
SETB FLAG ;置标志位,表示DS1820存在
LJMP TSR4
TSR3:
CLR FLAG ;清标志位,表示DS1820不存在
LJMP TSR5
TSR4:
MOV R7,#103
DJNZ R7,$ ;时序要求延时一段时间
TSR5:
SETB DQ
RET
;------------------------------------------------

;-------------------------------
WRITE_18B20:
MOV R2,#8 ;一共8位数据,串行通信
CLR C
WR1:
CLR DQ
MOV R0,#5
DJNZ R0,$
RRC A ;循环右移
MOV DQ,C
MOV R0,#25
DJNZ R0,$
SETB DQ
NOP
DJNZ R2,WR1 ;A里面一共是8位,所以要送8次
SETB DQ ;释放总线
RET
;------------------------------------------------

;---------------------------------
READ_18B20: ;将温度高位和低位从DS18B20中读出
MOV R2,#8 ;数据一共有8位
CLR C
RE8:
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
NOP
NOP
NOP
SETB DQ
NOP
NOP
NOP
NOP
MOV C,DQ
RRC A
MOV R7,#15
DJNZ R7,$
DJNZ R2,RE8
MOV @R1,A
RET
;------------------------------------------------

;---------------------------------
INIT_1602:
MOV DAT_LCD,#01H ;清屏并光标复位
LCALL WRITCOM
MOV DAT_LCD,#38H ;设置显示模式:8位2行5x7点阵
LCALL WRITCOM
MOV DAT_LCD,#0CH ;显示器开、光标关、光标禁止闪烁
LCALL WRITCOM
MOV DAT_LCD,#06H ;文字不动,光标自动右移
LCALL WRITCOM
RET
;------------------------------------------------

;---------------------------
DISP_18B20:
JB FLAG,DISOK
MOV DAT_LCD,#0DH
ORL DAT_LCD,#80H
LCALL WRITCOM
MOV DAT_LCD,#'E'
LCALL WRITDATA
MOV DAT_LCD,#'R'
LCALL WRITDATA
MOV DAT_LCD,#'R'
LCALL WRITDATA
RET
DISOK:
MOV DAT_LCD,#0DH
ORL DAT_LCD,#80H
LCALL WRITCOM
MOV DAT_LCD,#' '
LCALL WRITDATA
MOV DAT_LCD,#'O'
LCALL WRITDATA
MOV DAT_LCD,#'K'
LCALL WRITDATA
RET
;------------------------------------------------

;---------------------------
DISP_START:
MOV DPTR,#TAB_START
MOV DAT_LCD,#03H ;写入显示起始地址
ORL DAT_LCD,#80H ;按模块要求写入的地址最高位必需为1
LCALL WRITCOM
MOV R7,#7
MOV R2,#0
DIS_N_BIT:
MOV A,R2
MOVC A,@A+DPTR
MOV DAT_LCD,A
LCALL WRITDATA
INC R2
DJNZ R7,DIS_N_BIT
MOV DAT_LCD,#4EH
ORL DAT_LCD,#80H
LCALL WRITCOM
MOV DAT_LCD,#0DFH
LCALL WRITDATA
MOV DAT_LCD,#43H
LCALL WRITDATA
RET
;------------------------------------------------

;-------------------------------
DISP_TEMPERATURE:
MOV DPTR,#TAB_NUMBER_ASIC
MOV DAT_LCD,#48H
ORL DAT_LCD,#80H
LCALL WRITCOM
MOV A,#0
CJNE A,TEMPERATURE_B,DISP_B
MOV A,#0
CJNE A,TEMPERATURE_S,DISP_S
LJMP DISP_G

DISP_B:
MOV DAT_LCD,TEMPERATURE_FH
LCALL WRITDATA
MOV A,TEMPERATURE_B
MOVC A,@A+DPTR
MOV DAT_LCD,A
LCALL WRITDATA
LJMP LOOP_S
DISP_S:
MOV DAT_LCD,#' '
LCALL WRITDATA
MOV DAT_LCD,TEMPERATURE_FH
LCALL WRITDATA
LOOP_S:
MOV A,TEMPERATURE_S
MOVC A,@A+DPTR
MOV DAT_LCD,A
LCALL WRITDATA
LJMP LOOP_G
DISP_G:
MOV DAT_LCD,#' '
LCALL WRITDATA
MOV DAT_LCD,#' '
LCALL WRITDATA
MOV DAT_LCD,TEMPERATURE_FH
LCALL WRITDATA
LOOP_G:
MOV A,TEMPERATURE_G
MOVC A,@A+DPTR
MOV DAT_LCD,A
LCALL WRITDATA

MOV DAT_LCD,#'.'
LCALL WRITDATA
MOV A,TEMPERATURE_XS
MOVC A,@A+DPTR
MOV DAT_LCD,A
LCALL WRITDATA
RET
;------------------------------------------------

;--------------------------------------
CHUANGE_TEMPERATURE:
MOV A,TEMPERATURE_H
JB ACC.7,LOOP_FH
MOV TEMPERATURE_FH,#' '
TRAN:
MOV A,TEMPERATURE_H
ANL A,#07H
SWAP A
MOV TEMPERATURE_INT,A
MOV A,TEMPERATURE_L
ANL A,#0F0H
SWAP A
ADD A,TEMPERATURE_INT
MOV TEMPERATURE_INT,A
MOV A,TEMPERATURE_L
ANL A,#0FH
MOV TEMPERATURE_FLT,A
MOV A,TEMPERATURE_INT
MOV B,#100
DIV AB
MOV TEMPERATURE_B,A
MOV A,B
MOV B,#10
DIV AB
MOV TEMPERATURE_S,A
MOV TEMPERATURE_G,B
MOV DPTR,#TAB_XS
MOV A,TEMPERATURE_FLT
MOVC A,@A+DPTR
MOV TEMPERATURE_XS,A
RET
;-----------------------------
LOOP_FH:
MOV TEMPERATURE_FH,#'-'
CPL TEMPERATURE_L
CPL TEMPERATURE_H
CLR C
MOV A,#1
ADD A,TEMPERATURE_L
MOV TEMPERATURE_L,A
MOV A,#0
ADDC A,TEMPERATURE_H
MOV TEMPERATURE_H,A
LJMP TRAN
;------------------------------------------------

;---------------------------
WRITCOM:
CLR RS
CLR RW
CLR EN
LCALL BUSY_1602
SETB EN
RET
;------------------------------------------------

;---------------------------
WRITDATA:
SETB RS
CLR RW
CLR EN
LCALL BUSY_1602
SETB EN
RET
;------------------------------------------------

;---------------------------------
BUSY_1602:
CLR RS
SETB RW
CLR EN
SETB EN
JB DAT_LCD.7,BUSY_1602
RET
;------------------------------------------------

;------------------------------
DELAY_18B20:
MOV R7,#255
DELAY_18B20_A:
MOV R6,#255
DJNZ R6,$
DJNZ R7,DELAY_18B20_A
RET
;------------------------------------------------

;-------------------------------------
SEND_TEMPERATURE:
MOV SBUF,#02H
JNB TI,$
CLR TI
MOV SBUF,TEMPERATURE_FH
JNB TI,$
CLR TI
MOV R1,#TEMPERATURE_B
MOV R7,#4
SEND4:
MOV A,@R1
ADD A,#30H
MOV SBUF,A
JNB TI,$
CLR TI
INC R1
DJNZ R7,SEND4
MOV SBUF,#03H
JNB TI,$
CLR TI
RET
;------------------------------------------------

TAB_START:
DB 'DS18B20'

TAB_NUMBER_ASIC:
DB '0123456789'

TAB_XS:
DB 00H,01H,01H,02H,03H,03H,04H,04H
DB 05H,06H,06H,07H,08H,08H,09H,09H

END

1602液晶显示的 ,用DS18B20传感器的 ,并且数据会通过串口发送到电脑的,02 符号 温度百位 温度十位 温度个位 温度小数 03 结束

看不见你接线图,先来一个C语言的,汇编确实没C语言方便

#include
#define uchar unsigned char
#define uint unsigned int
uchar a , b=0;
sbit wei1=P1.0;
sbit wei2=P1.1;
//共阴数码管七段码
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void display( uchar a)) //显示程序
{
P0= table[a/10];//十位
wei1=1;
Delay1ms(2) ;
wei1=0;
P0= table[a%10];//个位
wei2=1;
Delay1ms(2) ;
wei2=0;
}
void main(void )//主程序
{
TMOD=0x01;// 定时器0工作方式一
ET0=1;
EA=1;
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
display(b);
}
}
//中断子程序
void Timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)//20次是1 秒
{ a=0;b++;}
if(b==100)
{ b=0;}
}

Count         EQU 30H

KEY1          BIT P3.6

KEY2          BIT P3.7

                  ORG 0

START:         MOV Count,#00H

NEXT:          MOV A,Count

               MOV B,#10

               DIV AB

               MOV DPTR,#TABLE

               MOVC A,@A+DPTR

      MOV P2,#02H

               MOV P0,A

      LCALL DELAY

               MOV A,B

               MOVC A,@A+DPTR

      MOV P2,#01H

               MOV P0,A

      LCALL DELAY

WT:            JB KEY1,WT1

               LCALL DELY10MS

               JB KEY1,WT1

               JNB KEY1,$

               INC Count

               MOV A,Count

               CJNE A,#100,NEXT

      MOV Count,#0

               LJMP NEXT

WT1:

               JB KEY2,WT2

      LCALL DELY10MS

      JB KEY2,WT2

      JNB KEY2,$

      MOV A,Count

      JZ WT11

      DEC Count

      LJMP NEXT

WT11:

               MOV Count,#99

WT2:

               LJMP NEXT

DELAY:

               MOV R3,#6

DELAY1:

               MOV R4,#250

      DJNZ R4,$

      DJNZ R3,DELAY1

      RET

DELY10MS:      MOV R6,#20

D1:            MOV R7,#248

               DJNZ R7,$

               DJNZ R6,D1

               RET

TABLE:  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

 



按照楼主给出的程序,增加了减一的功能。

程序已经调试成功,如下:



Count  EQU  30H

SP1    BIT  P3.7

SP2    BIT  P3.6

    ORG   0

START:

    MOV   Count, #0

;---------------------------

M_LOOP:

    CALL  DISP

WT1:

    JB    SP1, WT2

    LCALL DELY10MS

    JB    SP1, WT2

    JNB   SP1, $

    INC   Count

    MOV   A, Count

    CJNE  A, #100, M_LOOP

    LJMP  START

;---------------------------

WT2:

    JB    SP2, WT1

    LCALL DELY10MS

    JB    SP2, WT1

    JNB   SP2, $

    DEC   Count

    MOV   A, Count

    CJNE  A, #255, M_LOOP

    MOV   Count, #99

    LJMP  M_LOOP

;---------------------------

DELY10MS:

    MOV   R6, #20

D1: MOV   R7, #248

    DJNZ  R7, $

    DJNZ  R6, D1

    RET

;---------------------------

DISP:

    MOV   A, Count

    MOV   B, #10

    DIV   AB

    MOV   DPTR, #TABLE

    MOVC  A, @A + DPTR

    MOV   P0, A

    MOV   A, B

    MOVC  A, @A + DPTR

    MOV   P2, A

    RET

TABLE:

    DB  3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH

;---------------------------

END 

仿真截图如下:



Count EQU 30H ; 应该这样试试
SP1 BIT P3.7
SP2 BIT P3.6
ORG 0
START: MOV Count,#00H
NEXT: MOV A,Count
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
WT1: JB SP1,WAIT1
JB SP2,WAIT2
JMP WT1
WAIT1: JB SP1,WAIT1
LCALL DELY10MS
JB SP1,WAIT1
INC Count
MOV A,Count
CJNE A,#100,NEXT
LJMP START
WAIT2: JB SP2,WAIT2
LCALL DELY10MS
JB SP2,WAIT2
DEC Count
MOV A,Count
CJNE A,#100,NEXT
LJMP START
DELY10MS: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

Count EQU 30H
SP1 BIT P3.7
SP2 BIT P3.6
ORG 0
START: MOV Count,#00H
NEXT: MOV A,Count
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
WT1: JNB SP1,WT1
WT2: JNB SP2,WT2
WAIT1: JB SP1,WAIT1
LCALL DELY10MS
JB SP1,WAIT1
INC Count
MOV A,Count
CJNE A,#100,NEXT
LJMP START
WAIT2: JB SP1,WAIT2
LCALL DELY10MS
JB SP1,WAIT2
DEC Count
MOV A,Count
CJNE A,#100,NEXT
LJMP START
DELY10MS: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END


172793212220到99可增减计数器的单片机系统。。求汇编语言程序。在线等。
甘肾李答:MOVC A,@A+DPTR //查表,得到各位商的LED管码 /*这里加入把管码通过单片机引脚*/ /*写到LED管的程序,具体看你的电路了*/ POP ACC JNB ADD,Countadd JNB DEC Countdec JMP MAIN Countadd: CJNE A,99,add MOV A,0 SJMP BACK add: INC ACC BACK1: RET Countdec: CJ...

172793212220到99可增减计数器的单片机系统。求汇编语言程序。在线等。特急。
甘肾李答:Count EQU 30H KEY1 BIT P3.6 KEY2 BIT P3.7 ORG 0 START: MOV Count,#00H NEXT: MOV A,Count MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,#02H MOV P0,A LCALL DELAY MOV A,B MOVC A,@A+DPTR MOV P2,#01H MOV P0,A LCALL DELAY WT: ...

1727932122251单片机 0-99计数器 一个按键 按一下加一 按两下减一 按三下清零 电...
甘肾李答:51单片机 0-99计数器,一个按键,按一下加一,那只能是自动加1啦,不然再按一个就变成减1,再按3下清0了。按两下减一,也应该是自动减1啦。 按三下清零。仿真图

17279321222求用AT89S51单片机构成的0-99加法计数器电路图和C语言源程序…要求用...
甘肾李答:0x7c, 0x39,0x5e,0x79,0x71}; void display(uchar bai,uchar shi,uchar ge);//显示子程序声明 void delay(uint z); //延时函数 void init(); //初始化函数 void main() { init(); //初始化子程序 while(1) { if(aa==20) //检测到1s { aa=0; temp++; if(temp==100) /...

17279321222单片机的 《00-99计数器》试验 再加个定时器作为外部中断源怎么做?_百 ...
甘肾李答:2、掌握单片机对按键的控制原理 实验内容:通过按一下P3.3按键,数码管做 1 的累加, 实现00~99的计数功能,当计到99时又从00开始 / ;/* 程序详细功能介绍:; * 具体的硬件结构,大家可以看 WS 系列产品的原理图 ;* 利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.3管脚接一个轻触...

17279321222用单片机c51,c语言编00-99计数器程序!谢谢!!
甘肾李答:unsigned char Count;void delay10ms(void){ unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);} void main(void){ Count=0;P0=table[Count/10];P2=table[Count%10];while(1){ if(P3_7==0){ delay10ms();if(P3_7==0){ Count++;if(Count==100){ Count=0;} ...

17279321222利用AT89S51单片机来制作一个手动00-99计数器。
甘肾李答:teble里的值就是共阴8 段(含小数点)数码管的段码。8 段从上面一横开始顺时针依次为a、b、c、d、e、f、g(中间的横)和h(小数点),分别接在IO口的0~7 例如要显示0,则段码为0011 1111 即0x3f 。其它,你可自行推出。

17279321222麻烦大神用单片机c51,编0-99共阳极计数器程序,谢谢!
甘肾李答:/256;TL0=(65536-5000)%256;number++;if(number>1)number=0;switch(number){case 0:P2=0x02;P0=distab[dat/10];break;case 1:P2=0x01;P0=distab[dat%10];break;default:break;}}void t1isr() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;time++;if(time>=20)...

1727932122200-99计数器设计。 利用单片机来制作一个手动计数器,还有仿真图,谢谢...
甘肾李答:TABLE: ; 共阴极数码管显示代码表 DB 3FH,06H,5BH,4FH,66H ;01234 DB 6DH,7DH,07H,7FH,6fh ;56789 ;--- BEGIN: MOV P0,#0 ;数码管初始化,不显示 MOV P1,#0 ;数码管初始化,不显示 MOV 30H,#0 ;数据初始化为0 LOOP:JB P3.2,LOOP1 ;加1键如果未按下...

17279321222倾家荡产求单片机C语言程序:0~99秒计数器;三个独立按键控制,P1.1开始...
甘肾李答:和本次稍有区别是:以前是用“两个独立按键控制”,启动和暂停,用一个按键控制。现在,按照楼主的要求,进行了改动,程序如下。//下面是00-99秒计数的语言C程序。include<reg52.h> include<intrins.h> unsigned char i, j;unsigned char code table[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99,...


(编辑:双谭泉)
联系方式:
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 作文摘要网