跪求,单片机程序注释

跪求,单片机程序注释,第1张

ORG 00H 程序开始地址,由单片机的硬件决定的,

AJMP START 跳转到START处。进入程序段

START:MOV SP,#06H将6送到SP指针寄存器

MOV SCON,#50H 将50H送到SCON寄存器

MOV TMOD,#20H将20H送到TMOD寄存器,这里是设定定时器模式

MOV TH1,#0E6H 将0E6H送到TH1寄存器,这里是设定定时器的定时参数,

SETB TR1 开启定时器1计数

MOV 30H,#0FFH 将0FFH送到30H缓冲(RAM)

READ:MOV A,P1 将单片机的P1端口读到累加器当中去

CJNE A,30H,SAVE 比较累加器与30H缓冲是否相等,不相等则跳转到SAVE,如果相等,则执行下一句。

JMP READ 跳转到READ段

SAVE:MOV 30H,A 将累加器A的数据存入30H缓冲当中去

MOV SBUF,A 将累加器A的数据送入UART串口缓存SBUF内发送出去

WAIT:JBC TI,READ 判断TI标志是否为1,如果为1则跳转到READ段,

AJMP WAIT 跳转到WAIT段

END程序结束

这是一个按键检测程序,当检测到有按键后,通过UART串口将数据发送出去。前面有初始化,将UART串口参数进行了设定,采用定时器1做为波特率发生器,具体的波特率与晶振有关。自己看看书就知道如何计算了!这也是一种常见的调试手段,通过串口查看具体的数据。

2、

ORG 00H 程序开始地址,由单片机的硬件决定的,

AJMP START 跳转到START处。进入程序段

START:MOV SP,#06H 将6送到SP指针寄存器

MOV SCON,#50H将50H送到SCON寄存器

MOV TMOD,#20H 将20H送到TMOD寄存器,这里是设定定时器模式

MOV TH1,#0E6H将0E6H送到TH1寄存器,这里是设定定时器的定时参数

SETB TR1 开启定时器1计数

READ:JB RI,UART 判断RI是否为1,如果为1则跳转到UART段

AJMP READ 跳转到READ段

UART:MOV A,SBUF将UART数据从SBUF从取出来,送到累加器A当中

MOV P1,A 将累加器A的数据送到P1端口。

CLR RI 清除RI标志,

AJMP READ跳转到READ段

END程序结束

这个程序是一个读取UART接收的程序,接收到的数据能过P1端口输出。

这两个程序一个是通过UART发送按键键值,一个是接收UART数据,并通过P1端口输出。

建议直接学习C语言,没有这些跳转指令学习起来会十分轻松!

/****************************************************************************

* File : main.c*

* COPYRIGHT BY HUOYAN LTD.COMPANY *

* Version: V1.3 *

* *

* Created: 18.10.2005 *

* Last Change: 21.10.2005 *

* *

* Author: NIL *

* *

* Compiler: KEIL C51 V7.10 *

* *

* Description: AT89S52-Firmware for FM1702 Demo Serial Reader *

* *

****************************************************************************/

#include <reg52.h>

#define __SRC

#include "main.h"

#undef __SRC

#include <intrins.h>

//#include <string.h>

//#include <stdio.h>

//#include <absacc.h>

#include "FM1702.h"

#define uchar unsigned char

#define uint unsigned int

//pin define mcu控制管脚定义

sbit RF_MISO = P2^3

sbit RF_MOSI = P2^1

sbit RF_SCK = P2^0

sbit RF_NSS = P2^2

sbit RF_RST = P2^4//由高变低时启动内部复位程序

sbit CARD_LED = P1^1

sbit SPEAKER= P1^0

sbit LED = P2^5

//sbit RF_MISO = P1^0

//sbit RF_MOSI = P1^1

//sbit RF_SCK = P1^2

//sbit RF_NSS = P1^3

//sbit RF_RST = P1^4 //由高变低时启动内部复位程序

//sbit LED = P2^4

//sbit SPEAKER= P2^0

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: spi_byte_transceive//

//功能: 该函数实现SPI通讯的数据收发//

// //

//输入://

// 发送数据 //

// //

//输出://

// 接收数据 //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

char spi_byte_transceive(char sendbyte)

{

char i,temp

for(i=0i<8i++)

{

RF_SCK=0

if(sendbyte &0x80) //位运算,判断最高位是否为1

{

RF_MOSI=1

}

else

{

RF_MOSI=0

}

sendbyte <<= 1

RF_SCK=1

temp <<= 1

if(RF_MISO)

temp |= 0x01

}

RF_SCK=0

_nop_()

_nop_()

RF_MOSI=0

return (temp)

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: rc531_register_write //

//功能: 该函数实现通过SPI接口对RC531中一个寄存器写入值 //

// //

//输入://

// RC531目标寄存器地址和写入值 //

// //

//输出://

// N/A //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

void SPIWrite(char reg_ad,char reg_data)

{

RF_SCK=0

reg_ad <<= 1

RF_NSS=0

reg_ad &= 0x7F

spi_byte_transceive(reg_ad)

spi_byte_transceive(reg_data)

RF_NSS=1

return

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: rc531_register_read//

//功能: 该函数实现通过SPI接口读取RC531中一个寄存器的值 //

// //

//输入://

// RC531目标寄存器地址 //

// //

//输出://

// 目标寄存器的值 //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

unsigned char SPIRead(char reg_ad)

{ char temp

RF_SCK=0

_nop_()

_nop_()

RF_NSS=0

reg_ad <<= 1

reg_ad |= 0x80

spi_byte_transceive(reg_ad)

temp=spi_byte_transceive(0x00)

RF_NSS=1

return (temp)

}

///////////////////////////////////////////////////////////////////////

// 主函数

///////////////////////////////////////////////////////////////////////

void main(void)

{ //设置变量

uchar baud

SPEAKER=0

InitSystem()//初始化系统

SPEAKER=1

LED=0

while (1)

{

//检查命令标志

if (CmdValid) //if LEVEL 1

{

CmdValid = FALSE

if(RevBuffer[0]==11) //if LEVEL 2

{

RevBuffer[2]=RevBuffer[1]

RevBuffer[0]=1

RevBuffer[1]=0

CALL_isr_UART() //equal to 'SETB TI', defined in main.h

SPEAKER=0 //开蜂鸣器和指示灯

delay_10ms(RevBuffer[2])

SPEAKER=1

}

else if(RevBuffer[0]==13) //设置通讯波特率 //if LEVEL 2

{

switch(RevBuffer[1])

{

case 0:

baud=BAUD_9600

break

case 1:

baud=BAUD_14400

break

case 2:

baud=BAUD_19200

break

case 3:

baud=BAUD_28800

break

case 4:

baud=BAUD_38400

break

case 5:

baud=BAUD_57600

break

case 6:

baud=BAUD_115200

break

default:

baud=BAUD_19200

break

} //switch body

RevBuffer[0]=1 //contact

RevBuffer[1]=0

CALL_isr_UART()

delay_10ms(5)

TR1 = 0

TH1 = baud

TL1 = TH1

delay_10ms(2)

TR1 = TRUE

}//if LEVEL 2

else

{

cmd_process() // 进入IC卡处理程序

CALL_isr_UART()

}

}

}//while循环体

}//main函数

///////////////////////////////////////////////////////////////////////

// 系统初始化

///////////////////////////////////////////////////////////////////////

void InitSystem(void)

{

RF_NSS=1

RF_RST=0

ET2 = 0 //Timer 2 disabled

T2CON = 0x04 //start Timer 2(internal timer, auto reload)

PCON = 0x80 //baud rate double

SCON = 0x70 //UART mode 1, enable receive, if No valid stop bit, RI not activated.

//TMOD = 0x22

TMOD = 0x21 //Timer 1 8bit auto reload TR1 control

//Timer 0 16bit TR0 control

TH1 = BAUD_9600 //默认波特率

TL1 = TH1

TR1 = TRUE // 波特率发生器

TH0 = 0x60

TL0 = 0x60

TR0 = 0 //Timer 0 doesn't run

ET0=0

ET1=0

EA=1

EX0=1

IT0 = 1

TR2=0

ES = TRUE //enable UART interrupt

CmdValid=0 //flag initiation

//喇叭和指示灯测试

delay_10ms(10)

delay_10ms(10)

Init_FM1702(0)

}

///////////////////////////////////////////////////////////////////////

// 串口接收和发送中断

///////////////////////////////////////////////////////////////////////

void isr_UART(void) interrupt 4 using 1

{

uchar len, i

unsigned int j=0

if(RI)

{

len=SBUF

RI=0

for(i=0i<leni++)

{

while(!RI)

{

j++

if(j>1000)

{

break

}

}

if(j<1000)

{

RevBuffer[i]=SBUF

RI=0

j=0

}

else

{

break

}

}

if(i==len)

{

REN=0

CmdValid=1

}

}

else if(!RI &&TI)

{

TI=0

len=RevBuffer[0]

for(i=0i<len+1i++)

{

SBUF=RevBuffer[i]

while(!TI)

TI=0

}

REN=1

}

}

/****************************************************************/

/*名称: Load_keyE */

/*功能: 该函数实现把E2中密码存入FM1702的keyRevBuffer中*/

/*输入: Secnr: EE起始地址*/

/*输出: True: 密钥装载成功*/

/* False: 密钥装载失败*/

/****************************************************************/

uchar Load_key_CPY(uchar *buff)

{

char idata status

uchar coded_keys[12]

uchar temp

M500HostCodeKey(buff,coded_keys)////////////////

temp=Command_Send(0x0c,coded_keys,LoadKey)

if(temp == FALSE)

{

return FM1702_LOADKEYERR

}

status=(SPIRead(ErrorFlag)) &0x40

if (status==0x40)

return FM1702_AUTHERR

return FM1702_OK

}

///////////////////////////////////////////////////////////////////////

// IC卡处理函数

///////////////////////////////////////////////////////////////////////

void cmd_process(void)

{

uchar cmd

uchar status

cmd = RevBuffer[0]

switch(cmd)

{

case 1: // Halt the card //终止卡的 *** 作

status=MIF_Halt()

RevBuffer[0]=1

RevBuffer[1]=status

break

case 2:

status = Request(RF_CMD_REQUEST_ALL) //RF_CMD_REQUEST_STD=0x26, request Idle

if(status != FM1702_OK)

{

status = Request(RF_CMD_REQUEST_ALL)

if(status != FM1702_OK)

{

RevBuffer[0] = 1

RevBuffer[1] = FM1702_REQERR

break

}

}

if(tagtype[0]==2)

cardtype=mifarepro// Mifare Pro 卡

else if(tagtype[0]==4)

cardtype=mifare1 // Mifare One 卡

else if(tagtype[0]==16)

cardtype=mifarelight // Mifare Light 卡

else

cardtype=unknowncard

RevBuffer[0]=3

RevBuffer[1]=status

RevBuffer[2]=tagtype[0]

RevBuffer[3]=tagtype[1]

break

case 3: // 防冲突 读卡的系列号 MLastSelectedSnr

status = AntiColl()

if(status!=FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=FM1702_ANTICOLLERR

break

}

//memcpy(MLastSelectedSnr,&RevBuffer[2],4)

RevBuffer[0]=5

RevBuffer[1]=status

RevBuffer[2]=UID[0]

RevBuffer[3]=UID[1]

RevBuffer[4]=UID[2]

RevBuffer[5]=UID[3]

break

case 4: // 选择卡 Select Card

status=Select_Card()

if(status!=FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=FM1702_SELERR

break

}

RevBuffer[0]=1

RevBuffer[1]=status

break

case 5:

//下载密钥

// status = Load_keyE2(RevBuffer[2],RevBuffer[1]) //%40

status = Authentication(UID, RevBuffer[2], RevBuffer[1])

if(status != FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=status

break

}

RevBuffer[0]=1

RevBuffer[1]=status

break

case 6: // Key loading into the MF RC500's EEPROM

// 校验卡密码(E2) Load_keyE2_CPY(uchar Secnr, uchar Mode)

// RevBuffer[5] = 0xff

// RevBuffer[6] = 0xff

// RevBuffer[7] = 0xff

// RevBuffer[8] = 0xff

// RevBuffer[9] = 0xff

// RevBuffer[10] = 0xff

status = Load_key_CPY(&RevBuffer[3])

// status = Load_keyE2_CPY(RevBuffer[2],RevBuffer[1]) //%40

// if(status != FM1702_OK)

// {

// RevBuffer[0]=1

// RevBuffer[1]=status

// break

// }

RevBuffer[0]=1

RevBuffer[1]=status

break

这里不能全部发完,你加我的QQ吧,574301093 我发给你接收完后麻烦采纳下我的答案。谢谢了

以下是北京友我科技的射频卡(RFID)开发板,性价比和知名度都比较高。

具体查看:http://www.youwokeji.com.cn

YW-100系列射频卡开发板采用非接触射频技术,配以最常用的AT89C52单片机,是一款 *** 作简单易用,功能齐全的开发板。

YW-100系列射频卡开发板不仅提供提供了详细的电路原理图,各种参数调整和设置方法,还提供了关于射频卡 *** 作的所有源代码。对于想了解射频卡技术的人员,她提供了方向和方法。对于要做射频卡项目的人员或团队,她提供了极大的方便,可以在相当短的时间内,让工程技术人员设计出符合要求的射频卡系统。

YW-100系列射频卡开发板不仅可以作为开发板,学习板来使用,也可以作为射频卡(RFID)读卡器来使用。

功能特点

☞含有详细的电路原理图,让你了解每一个设计细节和参数。

☞提供稳定可靠的关于射频卡 *** 作的C51源代码,可以嵌入到各种系统中。这些函数包括:初始化寻卡、防冲撞、选卡、转换密钥匙格式、传送密钥、验证密钥、读卡、写卡、扣款和充值、调钱包到缓冲区、备份缓冲区中的钱包、卡休眠、启动天线发射、关闭天线发射。

☞采用AT89C52单片机做控制器完成对读卡芯片的驱动。

☞主板和天线一体化设计,轻松掌握天线设计方法。

☞提供计算机演示程序,可以清楚地测试和调试。

☞开发板内含有电压保护稳定电路,可以使用较宽的电压。

☞+5V到+12V供电,电流<100mA,读卡时<300mA。

☞不仅可以作为开发板使用,还可以单独作为读卡器使用,具有极高的性价比。

开发板型号

目前开发板有以下型号,主要采用芯片MFRC530, CLRC632等。请选择合适的开发板或与我们联系咨询。

型号 主芯片 支持读卡协议 主要功能 主要用途

YW-100 AT89C52+RC530 ISO14443 始化RC530寻卡、选卡、读卡、写卡…… S50、S70符合ISO14443协议的射频卡

YW-101 AT89C52+RC632 ISO15693 支持ISO15693协议的寻卡、选卡、读卡、写卡…… 电子标签ISO15693(RFID)

YW-102 AT89C52+RC632 ISO14443

ISO15693 同时支持ISO14443和ISO15693协议的寻卡、选卡、读卡、写卡…… 同时支持ISO14443和ISO15693协议的读卡器

YW-103 AT89C52+FM1702 ISO14443 始化FM1702寻卡、选卡、读卡、写卡…… S50、S70符合ISO14443协议的射频卡

YW-104 AT89C52+FM1725 ISO14443

ISO15693 同时支持ISO14443和ISO15693协议的寻卡、选卡、读卡、写卡…… 同时支持ISO14443和ISO15693协议的读卡器

表格 1

订购方式

可以通过我们的网站或电话订购。或者联系当地的经销商。

网站:http://www.youwokeji.com.cn

电话:010-87171913

24小时手机:13671114914

Email:Zhou21cn@126.com


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

原文地址: http://outofmemory.cn/yw/8099578.html

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

发表评论

登录后才能评论

评论列表(0条)

保存