#include<reg51.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uint unsigned int
#define uchar unsigned char //宏定义
uchar code table[]={"0123456789ABCDEF"};//用于1602显示
uchar sn[8];
uchar array[8];
sbit DQ=P3^7;
sbit rs =P2^6;
sbit rw =P2^5;
sbit e =P2^7;
void delay_50us(uchar t)
//延时函数
{
uchar j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void delay(uchar i)
{
uchar j;
while(i--)
{
for(j=125;j>0;j--)
;
}
}
void write_com(uchar com) //LCD写指令函数
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void write_data(uchar dat) //LCD写数据函数
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void init_lcd(void) //LCD初始化函数
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
/////////////////////////////////LCD//////////////////////////
void delayb(uint count) //延时函数
{
uint i;
while(count)
{
i=200;
while(i>0)i--;
count--;
}
}
void dsreset()//初始化
{
uint i;
DQ=0;
i=103;
while(i>0)i--;
DQ=1;
i=4;
while(i>0)i--;
}
bit read_bit(void) //读一位
{
uint i;
bit dat;
DQ=0;
i++;
DQ=1;
i++;
i++;
dat=DQ;
i=8;
while(i>0)i--;
return (dat);
}
uchar read_byte(void) //读一个字节
{
uchar dat,i,j;
dat=0;
for(i=1;i<=8;i++)
{
j=read_bit();//读出一个字节数据,低位在前
dat=(j<<7)|(dat>>1);//把读出的一个bit经过移位运算后,低位在dat的最低位,高位在dat的最高位
}
return dat;//返回一个字节数据
}
void write_byte(uchar dat) // 写一个字节
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;//写入最低位数据,其他位暂时屏蔽
dat=dat>>1; //为下次写入第二位数据做准备
if(testb)//如果要写入的数据为1
{
DQ=0;
i++;i++;
DQ=1;
i=8;while(i>0)i--;
}
else//否则写入0
{
DQ=0;
i=8;while(i>0)i--;
DQ=1;
i++;i++;
}
}
}
void rom() //读序列号
{
uchar i;
dsreset();//初始化器件
delayb(1);
write_byte(0x33);//写入读取代码命令
for(i=0;i<8;i++)
{
sn[i]=read_byte();//读出来的数据放在数组里
}
}
void serial_init()//串口初始化
{
SCON=0x40;EA=1;ES=1;PCON=0X80;//串口工作在发送状态,方式1,波特率倍增
TMOD=0X20;TH1=0XFA;TL1=0XFA;TR1=1;//定时器1工作在方式2,自动重装处置,波特率为9600,TR1=1启动定时器1
}
void display()
{ uchar i,c,l,h;
rom();//调用读序列号子程序
delay_50us(200);//延时,如果是不断地读取的话可以不延时
for(i=0;i<8;i++)//因为是8个字节,所以要循环8次,每次显示一个字节
{
l=(sn[i]&0xf0)>>4; //获取低四位
h=sn[i]&0x0f; //获取高四位
write_com(0x80+c); //显示位置
write_data(table[l]); //显示低四位的16进制码
write_data(table[h]); //显示高四位的16进制码
c++;c++; //每显示一个字节,显示位置右移两位
}
}
uchar Y=0;
void main() //主函数
{
serial_init();//串口初始化
init_lcd(); //初始化1602
display();//LCD显示函数,
while(1)
{
for(Y=0;Y<8;Y++)//把ROM代码发送到串口
{
SBUF=sn[Y];//把要发送的数据放入SBUF缓冲器
while(!TI);//等待发送完毕
TI=0;//软件清除发送中断标志位,为下次发送做准备
}
delayb(500);//隔一段时间发送一次
}
}