STC单片机能用汇编写程序吗?指令和C51有什么区别?

STC单片机能用汇编写程序吗?指令和C51有什么区别?,第1张

当然可以用和汇编语言写。其实STC就是51内核的单片机。指令系统当然圆禅和c51单片机兼容袭侍的。不过有的STC的外设比标准的C51丰富,比如有的橘禅尘STC有P4口,普通的C51就没有了。具体的根据芯片型号不同也有差异。不过你熟悉C51的话,看看STC数据手册。上手很快的。

LED_MCU_START EQU P3.7

ADC_CONTR EQU 0BCH A/D转换寄存器

ADC_RES EQU 0BDH 8位A/D转换结果寄存器

P1ASF EQU 9DHP1口中的相应位作为模拟功能使用时的控制寄存器,如做A/D用,相应位要置1

ADC_Power_On_Speed_Channel_0 EQU 11100000BP1.0作为A/D输入

ADC_Power_On_Speed_Channel_1 EQU 11100001BP1.1作为A/D输入

ADC_Power_On_Speed_Channel_2 EQU 11100010BP1.2作为A/D输入

ADC_Power_On_Speed_Channel_3 EQU 11100011BP1.3作为A/D输入

ADC_Power_On_Speed_Channel_4 EQU 11100100BP1.4作为坦桐物轮物A/D输入

ADC_Power_On_Speed_Channel_5 EQU 11100101BP1.5作为A/D输入

ADC_Power_On_Speed_Channel_6 EQU 11100110BP1.6作为A/D输入

ADC_Power_On_Speed_Channel_7 EQU 11100111BP1.7作为A/D输入

-------------------------------------------------

定义变量

ADC_Channel_0_Result EQU 30H0通道A/D转换结果

ADC_Channel_1_Result EQU 31H1通道A/D转换结果

ADC_Channel_2_Result EQU 32H2通道A/D转换结果

ADC_Channel_3_Result EQU 33H3通道A/D转换结果

ADC_Channel_4_Result EQU 34H4通道A/D转换结果

ADC_Channel_5_Result EQU 35H5通道A/D转换结果

ADC_Channel_6_Result EQU 36H6通道A/D转换结果

ADC_Channel_7_Result EQU 37H7通道A/D转换结果

--------------------------------------------------

ORG 0000H

LJMP MAIN

ORG 0050H

MAIN:

CLR LED_MCU_START MCU工作指示灯 LED_MCU_START EQU P3.7

MOV SP, #7FH 设置堆栈

ACALL Initiate_RS232初始化串口

ACALL ADC_Power_On 开ADC电源, 第一让液次使用时要打开内部模拟电源

开ADC电源, 可适当加延时,1mS以内就足够了

ACALL Set_P12_ASF 设置 P1.2 为模拟功能口

ACALL Set_ADC_Channel_2 设置 P1.2 作为A/D转换通道

ACALL Get_AD_Result 测量电压并且取A/D转换结果

ACALL Send_AD_Result发送转换结果到 PC 机

ACALL Set_P12_Normal_IO 设置 P1.2 为普通IO

MOV A, ADC_Channel_2_Result 用 P1 口显示A/D转换结果

CPL A

MOV P1, A

Wait_Loop:

SJMP Wait_Loop 停机

-------------------------------------------------------------

-------------------------------------------------------------

-------------------------------------------------------------

-------------------------------------------------------------

Initiate_RS232: 串口初始化

CLR ES禁止串口中断

MOV TMOD, #20H设置 T1 为波特率发生器

MOV SCON, #50H0101,0000 8位数据位, 无奇偶校验

MOV TH1, #0FBH18.432MHz 晶振, 波特率 = 9600

MOV TL1, #0FBH

SETB TR1 启动 T1

RET

--------------------------------------------------------------

Send_Byte:

CLR TI

MOV SBUF, A

Send_Byte_Wait_Finish:

JNB TI, Send_Byte_Wait_Finish

CLR TI

RET

--------------------------------------------------------------

ADC_Power_On:

PUSH ACC

ORL ADC_CONTR, #80H 开A/D转换电源

MOV A, #20H

ACALL Delay开A/D转换电源后要加延时,1mS以内就足够了

POP ACC

RET

-------------------------------------------------------------

设置P1.2为模拟功能

Set_P12_ASF:

PUSH ACC

MOV A, #00000100B

ORL P1ASF, A

POP ACC

RET

-------------------------------------------------------------

设置 P1.2 为普通IO

Set_P12_Normal_IO:

PUSH ACC

MOV A, #11111011B

ANL P1ASF, A

POP ACC

RET

-------------------------------------------------------------

Set_ADC_Channel_2:

MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_2

选择P1.2作为A/D转换通道

MOV A, #05H 更换 A/D 转换通道后要适当延时, 使输入电压稳定

以后如果不更换 A/D 转换通道的话, 不需要加延时

ACALL Delay 切换 A/D 转换通道,加延时20uS~200uS就可以了,与输入电压源的内阻有关

如果输入电压信号源的内阻在10K以下,可不加延时

RET

-------------------------------------------------------------

Send_AD_Result:

PUSH ACC

MOV A, ADC_Channel_2_Result 取 AD 转换结果

ACALL Send_Byte 发送转换结果到 PC 机

POP ACC

RET

----------------------------------------------------------

Get_AD_Result:

PUSH ACC 入栈保护

MOV ADC_RES, #0

ORL ADC_CONTR, #00001000B 启动 AD 转换

NOP 在对ADC_CONTR寄存器进行写 *** 作后,要加4个空 *** 作延时,才能够正确读到ADC_CONTR的值

NOP 在对ADC_CONTR寄存器进行写 *** 作后,要加4个空 *** 作延时,才能够正确读到ADC_CONTR的值

NOP 在对ADC_CONTR寄存器进行写 *** 作后,要加4个空 *** 作延时,才能够正确读到ADC_CONTR的值

NOP 在对ADC_CONTR寄存器进行写 *** 作后,要加4个空 *** 作延时,才能够正确读到ADC_CONTR的值

Wait_AD_Finishe:

MOV A, #00010000B 判断 AD 转换是否完成

ANL A, ADC_CONTR

JZWait_AD_Finishe AD 转换尚未完成, 继续等待

ANL ADC_CONTR, #11100111B 清0 ADC_FLAG, ADC_START 位, 停止A/D转换

MOV A, ADC_RES

MOV ADC_Channel_2_Result, A 保存 AD 转换结果

POP ACC

RET

---------------------------------------------------------------

Delay:

PUSH 02将寄存器组0 的 R2 入栈

PUSH 03将寄存器组0 的 R3 入栈

PUSH 04将寄存器组0 的 R4 入栈

MOV R4, A

Delay_Loop0:

MOV R3, #200 2 CLOCK ---------------------+

Delay_Loop1: |

MOV R2, #249 2 CLOCK ------+ |

Delay_Loop: | 1002 CLOCK |200406 CLOCK

DJNZ R2, Delay_Loop4 CLOCK| |

DJNZ R3, Delay_Loop1 4 CLOCK ------+ |

DJNZ R4, Delay_Loop0 4 CLOCK ---------------------+

POP 04

POP 03

POP 02

RET

----------------------------------------------------------------

END 希望对你有帮助


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12334426.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存