#include<reg51.h>
#include<intrins.h>
/* 宏定义 ---------------------------------------------------------------------*/
#define LCD_DATA P0
/* 本文件使用的变量 -----------------------------------------------------------*/
unsigned long LEDTiming = 0; //LED计时器
unsigned char LEDValue = 1; //LED显示出来的值
unsigned long BUZZTiming = 0; //蜂鸣器计时器
unsigned long DelayTiming = 0;//延时计时器
unsigned char KeyCode = 0;
sbit BUZZ = P2^0;
sbit KEY = P3^3;
sbit LCD_RS = P2^4;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^6;
unsigned char UIDA[5];
unsigned long UID;
unsigned char LCD_RAM[16];
/* 本文件使用的函数声明 -------------------------------------------------------*/
void BUZZOn(void);
void Delay(unsigned long ms50);
void Delay72us(void);
void LCDWriteCmd(unsigned char val);
void LCDWriteData(unsigned char val);
void LCDInit(void);
void LCDDrawString(unsigned char addr, unsigned char *str);
/* 本文件函数体 ---------------------------------------------------------------*/
unsigned char GetUID(void)
{
unsigned char i, j;
if(RI != 0)
{
for(i = 0; i < 5; i ++)
{
j = 250;
while(RI == 0 && --j);
if(j == 0)
{
break;
}
UIDA[i] = SBUF;
RI = 0;
}
if(i == 5)
{
if((UIDA[0] ^ UIDA[1] ^ UIDA[2] ^ UIDA[3] ^ UIDA[4]) == 0)
{
UID = UIDA[0];
UID <<= 8;
UID |= UIDA[1];
UID <<= 8;
UID |= UIDA[2];
UID <<= 8;
UID |= UIDA[3];
return 1;
}
}
}
return 0;
}
/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void main(void)
{
/* 串口配置 */
SCON= 0x50;
//选用【定时器1】作为串口波特率发生器
//清除【定时器1】控制位
TMOD &= 0X0F;
//设置【定时器1】工作方式为8位自动重装
TMOD |= 0X20;
//设置串口波特率为9600、晶振选用11.0592M
TH1 = TL1 = 0xFD;
TR1 = 1;
/* 【定时器0】配置 */
TMOD &= 0xF0;
// 【定时器0】工作方式为16位定时器
TMOD |= 0X01;
//定时【50ms】即是【50000us】设置方法
//系统周期 T = 12/(11.0592M) <开发板通过跳线换成【12M】晶振就很好算了>
//寄存器值 TH0:TL0 = 65536 - (50000 / T)
//晶振 11.0592M 时 TH0:TL0 = 19453 转为16进制为 0x4BFD 即是TH0 = 0x4B、TL0 = 0xFD
//晶振 12M 时 TH0:TL0 = 15536 转为16进制为 0x3CB0 即是TH0 = 0x3C、TL0 = 0xB0
TH0 = 0x4B;
TL0 = 0xFD;
//开启【定时器0】中断
ET0 = 1;
//开【定时器0】
TR0 = 1;
//开启全局中断
EA = 1;
LCDInit();
LCDDrawString(0x80, " Welcome!!!");
LCDDrawString(0xC0, " Hello World!");
while(1)
{
if(GetUID() != 0)
{
LCD_RAM[0] = ' ';
LCD_RAM[1] = ' ';
LCD_RAM[2] = ' ';
LCD_RAM[3] = ' ';
LCD_RAM[4] = UID / 1000000000 + '0';
LCD_RAM[5] = UID % 1000000000 / 100000000 + '0';
LCD_RAM[6] = UID % 100000000 / 10000000 + '0';
LCD_RAM[7] = UID % 10000000 / 1000000 + '0';
LCD_RAM[8] = UID % 1000000 / 100000 + '0';
LCD_RAM[9] = UID % 100000 / 10000 + '0';
LCD_RAM[10] = UID % 10000 / 1000 + '0';
LCD_RAM[11] = UID % 1000 / 100 + '0';
LCD_RAM[12] = UID % 100 / 10 + '0';
LCD_RAM[13] = UID % 10 + '0';
LCD_RAM[14] = 0;
LCDDrawString(0x80, LCD_RAM);
LCD_RAM[0] = ' ';
LCD_RAM[1] = ' ';
LCD_RAM[2] = ' ';
LCD_RAM[3] = ' ';
LCD_RAM[4] = (UID >> 16) % 100000 / 10000 + '0';
LCD_RAM[5] = (UID >> 16) % 10000 / 1000 + '0';
LCD_RAM[6] = (UID >> 16) % 1000 / 100 + '0';
LCD_RAM[7] = (UID >> 16) % 100 / 10 + '0';
LCD_RAM[8] = (UID >> 16) % 10 + '0';
LCD_RAM[9] = ',';
LCD_RAM[10] = (UID&0XFFFF) % 100000 / 10000 + '0';
LCD_RAM[11] = (UID&0XFFFF) % 10000 / 1000 + '0';
LCD_RAM[12] = (UID&0XFFFF) % 1000 / 100 + '0';
LCD_RAM[13] = (UID&0XFFFF) % 100 / 10 + '0';
LCD_RAM[14] = (UID&0XFFFF) % 10 + '0';
LCD_RAM[15] = 0;
LCDDrawString(0xC0, LCD_RAM);
}
}
}
/*******************************************************************************
* 函数名 : Delay
* 描述 : 以50ms为单位延时
* 输入 : ms50: 50ms计数, 为 1 时延时不准确
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void Delay(unsigned long ms50)
{
DelayTiming = ms50;
while(DelayTiming != 0);
}
/*******************************************************************************
* 函数名 : BUZZOn
* 描述 : 打开蜂鸣器
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void BUZZOn(void)
{
BUZZTiming = 40;
BUZZ = 0;
}
/*******************************************************************************
* 函数名 : Delay72us
* 描述 : 延时72us
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void Delay72us(void)
{
unsigned int i;
for(i = 0; i < 5; i ++);
}
/*******************************************************************************
* 函数名 : LCDWriteCmd
* 描述 : 向 LCD写命令
* 输入 : -val:将要写的命令
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void LCDWriteCmd(unsigned char val)
{
LCD_DATA = val;
LCD_RW = 0;
LCD_RS = 0;
LCD_EN = 0;
LCD_EN = 1;
Delay72us();
}
/*******************************************************************************
* 函数名 : LCDWriteData
* 描述 : 向 LCD写数据
* 输入 : -val:将要写的数据
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void LCDWriteData(unsigned char val)
{
LCD_DATA = val;
LCD_RW = 0;
LCD_RS = 1;
LCD_EN = 0;
LCD_EN = 1;
Delay72us();
}
/*******************************************************************************
* 函数名 : LCDInit
* 描述 : 初始化LCD
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void LCDInit(void)
{
LCDWriteCmd(0x38);
LCDWriteCmd(0x0c);
LCDWriteCmd(0x06);
LCDWriteCmd(0x01);
Delay(5);
}
/*******************************************************************************
* 函数名 : LCDDrawString
* 描述 : 在LCD上写字符串
* 输入 : -addr:地址 -1602可以为0x80/0xC0
-12864可以为0x80/0x90/0x88/0x98
-str: 字符串地址
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void LCDDrawString(unsigned char addr, unsigned char *str)
{
unsigned char i;
LCDWriteCmd(addr);
for(i = 0; i < 16; i ++)
{
if(*(str+i) == 0)
{
break;
}
else
{
LCDWriteData(*(str+i));
}
}
for( ; i < 16; i ++)
{
LCDWriteData(' ');
}
}
/*******************************************************************************
* 函数名 : timer0
* 描述 : 定时器0中断
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void timer0() interrupt 1
{
//重新装寄存器值,仍然定时50ms
TH0 = 0x4B;
TL0 = 0xFD;
if(LEDTiming > 0){LEDTiming --;}
if(BUZZTiming > 0){BUZZTiming --;}
if(DelayTiming>0){DelayTiming--;}
}