SLE4442卡_IC的51单片机驱动程序

发布者:Xiaoxue666最新更新时间:2015-04-27 来源: 51hei关键字:SLE4442卡  51单片机  驱动程序 手机看文章 扫描二维码
随时随地手机看文章
整理了最初的实验草稿版,将端口宏定义,函数声明以及常用的函数声明建立头文件,感觉清楚多了,在不断地修改中凝练,在不停的实践中提高,满眼的思绪,在小小的Readme中划过一笔~~~~~~~~

char data_RST[4], ErrorCount[4];

void IC_RST(void)
{
uchar value,i,count;
DATA_IN;  //IC输入
RST_LOW;  //复位时序
CLK_LOW;
DATA_HIGH;
DelayUs(5);
RST_HIGH;
DelayUs(5);
CLK_HIGH;
DelayUs(5);
CLK_LOW;
DelayUs(5);
RST_LOW;
DelayUs(2);
for(i=0;i<4;i++) //读4个BYTE  可用后面的Byte_Read()代替
{
  value = 0xff;
  for(count=0;count<8;count++)
  {
   value = value >> 1;
   DelayUs(2);
   CLK_LOW;
   DelayUs(2);
   CLK_HIGH;
   DelayUs(2);
   if(RD5 == 1)
   {
    value |= 0x80; //判断IO脚是否为1,是则位置1
   }
   else
   {
    value &= 0x7f; //否则位置0
   }
   DelayUs(2);

  }
  data_RST[i] = value;
  DelayUs(2);
}
DelayUs(2);
CLK_LOW;
DelayUs(2);
DATA_HIGH;
}

void IC_Init(void)  //初始化
{
TRISD1 = 0;
RD1 = 0;  //上电
TRISD4 = 0;  //时钟输出
TRISD3 = 0;  //RST输出
DelayMs(5);  //上电的必要延时,否则程序出错
}


void Start(void)
{
DATA_OUT; //开始时序
CLK_LOW;
DATA_HIGH;
DelayUs(2);
CLK_HIGH;
DelayUs(2);
DATA_LOW;
DelayUs(2);
CLK_LOW;
}

void Stop(void) //结束时序
{
DATA_OUT;
CLK_LOW;
NOP();
NOP();
DATA_LOW;
DelayUs(2);
CLK_HIGH;
DelayUs(2);
DATA_HIGH;
DelayUs(2);
}

uchar Byte_Read(void) //读字节
{
uchar count;
uchar value;
DATA_IN;
DelayUs(2);
value = 0xff;
for(count=0;count<8;count++)
{
  value = value >> 1;  //循环右移,从最低位开始读
  DelayUs(2);
  CLK_LOW;
  DelayUs(2);
  CLK_HIGH;
  DelayUs(2);
  if(RD5 == 1)
  {
   value |= 0x80;//判断IO脚是否为1
  }
  else
  {
   value &= 0x7f;
  }
  DelayUs(2);
}
return (value);
}

[page]
void Byte_WRT(uchar Xdata)   //写字节
{
uchar count;
DATA_OUT;
DelayUs(2);
for(count=8;count!=0;count--)
{
  CLK_LOW;
  DelayUs(2);
  if((Xdata)&0x01)
  {
   DATA_HIGH;
  }
  else
  {
   DATA_LOW;
  }
  DelayUs(2);
  CLK_HIGH;
  DelayUs(2);
  Xdata = Xdata >> 1;  //循环右移,从最低位开始写
}
}


void Command(uchar command,uchar address,uchar IC_data)
{
Start();
Byte_WRT(command);         //发送命令
Byte_WRT(address);         //发送地址
Byte_WRT(IC_data);   //发送数据
Stop();                 //操作命令结束
}

void Process(void)
{
uint j;  //写指令后的处理过程
DATA_OUT;
  DelayUs(2);
  CLK_LOW;
  DATA_LOW;
  DelayUs(2);
  for(j = 0;j < 255;j++)
  {
   CLK_HIGH;
   DelayUs(2);
   CLK_LOW;
   DelayUs(2);
  }
DATA_HIGH;
}

void Process2(void)
{
uint j;  //写指令后的短处理过程
DATA_OUT;
  DelayUs(2);
  CLK_LOW;
  DATA_LOW;
  DelayUs(2);
  for(j = 0;j < 2;j++)
  {
   CLK_HIGH;
   DelayUs(2);
   CLK_LOW;
   DelayUs(2);
  }
DATA_HIGH;
}

uchar Code_Check(uchar Code1,uchar Code2,uchar Code3)  //密码校验函数
{
uchar i;
Command(0x31,0x00,0x00);
for(i = 0;i < 4;i++)
{
  ErrorCount[i] = Byte_Read();
}
if(ErrorCount[0] == 0)
{
  return 0;
}
else
{
  if((ErrorCount[0]&0x01) == 1)
  {
   ErrorCount[0] &= 0x06;      //bit0=0;
  }
  else if((ErrorCount[0]&0x02) == 1)
  {
   ErrorCount[0] &= 0x05;      //bit1=0;
  }
  else
  {
   ErrorCount[0] &= 0x03;      //bit2=0
  }
}
Command(0x39,0x00,ErrorCount[0]);
Process();

Command(0x33,0x01,Code1);
Process2();

Command(0x33,0x02,Code2);
Process2();

Command(0x33,0x03,Code3);
Process2();

Command(0x39,0x00,0xff);
Process();

Command(0x31,0x00,0x00);
for(i = 0;i < 4;i ++)
{
  ErrorCount[i] = Byte_Read();
}
if(ErrorCount[0] == 0x07)
{
  return 1;
}
else
{
  return 0;
}
}


void ReadMainROM(uchar addr,uchar *p,uchar N)  //读主存区
{
Command(0x30,addr,0xff);
while(N--)
{  
  *p=Byte_Read();
     p++;
    }
}

[page]
void WriteMainROM(uchar addr,uchar *t,uchar N)  //写主存区
{
while(N--)
{
  Command(0x38,addr,*t);
  Process();
  addr++;
  t++;
    }
}

void ReadProROM(uchar addr,uchar *p,uchar N)  //读保护区
{
Command(0x34,addr,0xff);
while(N--)
{  
  *p=Byte_Read();
     p++;
    }
}


void WriteProROM(uchar addr,uchar *t,uchar N)  //写保护区
{
while(N--)
{
  Command(0x3c,addr,*t);
  Process();
  addr++;
  t++;
    }
}

void ReadCode(uchar addr,uchar *p,uchar N)  //读密码
{
Command(0x31,addr,0xff);
while(N--)
{  
  *p=Byte_Read();
     p++;
    }
}

void WriteCode(uchar addr,uchar *t,uchar N)  //写密码
{
while(N--)
{
  Command(0x39,addr,*t);
  Process();
  addr++;
  t++;
    }
}

}

关键字:SLE4442卡  51单片机  驱动程序 引用地址:SLE4442卡_IC的51单片机驱动程序

上一篇:T6963C的51单片机驱动程序
下一篇:51单片机控制P2口8位LED灯左移C语言程序

推荐阅读最新更新时间:2024-03-16 13:59

51单片机实现按键控制LED灯亮灭
#include reg51.h //头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void delay()//延时函数 { unsigned char a,b; for(a=0;a 200;a++) for(b=0;b 200;b++); } void key()//按键处理函数 { if(k1==0)//判断按键是否按下(按键按下时k=0) { delay();//如果按下按键延时消抖 if(k1==0)//如果按键仍然按下 { LED=~LED;//对LED取反,原来亮则灭,原来灭则亮 } while(!k1);//等待
[单片机]
51单片机DS1302实时时钟驱动程序
DS1302是低功耗实时时钟芯片,它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。 一.基本原理 1.引脚分析 2.时序分析 (1)写字节 第一个字节是地址字节,第二个字节是数据字节。RST信号必须拉高,否则数据的输入是无效的。换一句话说,RST信号控制数据|时间信号输入的开始和结束。地址字节和数据字节的读取时上升沿有效,而且是由LSB开始读入。 (2)读字节 读一个字节和写一个字节有明显的不一样,先是写地址字节,然后再读数据字节,写地址字节时上升沿有效,而读数据字节时下降沿有效,当然前提是RST信号必须拉高
[单片机]
<font color='red'>51单片机</font>DS1302实时时钟<font color='red'>驱动程序</font>
51单片机,汇编语言,定时与计数
要求:将定时器 T1 设置为外部事件计数器,要求每计 500 个脉冲,再将 T1 转为定时方式,在 P1.2 输出一个脉宽 10ms 的正脉冲。 周而复始。 设系统时钟频率为 12MHz。 程序如下: ORG 0000H ;----------------------------------- START: CLR P1.2 CLR TR1 MOV TMOD, #50H ;T1计数方式1 MOV TH1, #(65536 - 500) / 256 ;计数值为500 MOV TL1, #(65536 - 500) MOD 256 SETB TR1 JNB TF1,
[单片机]
51单片机秒表C程序
本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c52;电路找到相应部分即可.这是一整个单片机开发板的电路图其他的忽略. 本程序的keil工程下载: http://www.51hei.com/f/miaobiao.rar 以下是通过测试的源代码: /* *功能:用定时器0实现秒表,实现60秒定时,精确度为1毫秒 * 利用key1独立按键实现定时器的启动和停止, * 利用key2独立按键实现秒表的清零; *日期:2013-03-24 *作者:徐冉 *注意事项:若打开两个定时器时,必须使用两个定时器, * 否则两个定时器都不工作!!! **/ /**********stc89C52-RC 51hei单片机实验板
[单片机]
基于51单片机的电子钟的设计
//本程序为2005带单片机课程设计时所写,并有相关的硬件电路板 //本程序在硬件上测试通过 //晶振为11.0592MHZ //程序中用单片机的P1口的I/O引脚做按键 //用四位一体的共阴数码管显示 org 0000h ljmp start ORG 001BH ;INT T1 入口地址 lJMP INT_T1 ORG 0080H start: MOV SP,#60H mov
[单片机]
42-基于51单片机的电子密码锁设计
具体实现功能 系统由AT89S52单片机+AT24C02数据存储模块+按键模块+LCD1602显示+报警模块等构成。 具体功能: 1、输入密码,且输入的密码显示在液晶显示屏上; 2、按下“DorBell”后,会响起门铃声; 3、初始密码为“1234”,输入正确后,显示“OK”,并且LED灯闪烁,表示开门; 4、输入密码错误后,显示“Eror”,三次输入错误后会报警; 5、按下“DELE”,清除输入的密码。 设计背景 电子密码锁在当前市场运用较为广泛,其主要通过对外接密码输入来实现对系统或电路的控制,并进一步控制系统机械开关的操作。相关电子产品通过系统编程控制能够以电子密码锁的形式来实现系统的开关,尤
[单片机]
42-基于<font color='red'>51单片机</font>的电子密码锁设计
1602.c和1602.h头文件,完美版的51单片机1602液晶驱动
本文件可以完美驱动1602液晶屏,调用方法详见: http://www.51hei.com/bbs/dpj-24670-1.html ,有2个文件1602.c和1602.h头文件(在后面). 1602.c文件 //***************************** #include stc12c5a.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define IODATA P0 //这三个引脚参考资料 sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit
[单片机]
基于51单片机IAP技术的LED显示屏控制系统
  LED显示屏由于其具有耗电少、使用寿命长、成本低、亮度高、故障少、视角大、可视距离远等特点,已经成为新一代的信息传播媒体工具。LED与LCD相比较最突出的特点是,亮度高、成本低且屏幕尺寸可根据现场情况用标准LED单元板拼制。按安装位置可分为室外、半室外和室内;按颜色可分为单色、双基色和彩色;按发光二极管点距可分为φ5.0、φ3.75及φ3.0等。本文以市场上常见的室内双色LED单元板为控制对象,说明基于单片机IAP技术的LED显示屏控制系统工作原理以及数据组织方法。 1 双色LED单元板硬件组成及工作原理   常见的室内双色LED单元板电路框图如图1(a)所示。其中行扫描电路由2片74HC138(3-8译码器)构成的4
[单片机]
基于<font color='red'>51单片机</font>IAP技术的LED显示屏控制系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved