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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)