单片机电子密码锁带时钟Word文档格式.docx

上传人:b****6 文档编号:21546507 上传时间:2023-01-31 格式:DOCX 页数:20 大小:31.45KB
下载 相关 举报
单片机电子密码锁带时钟Word文档格式.docx_第1页
第1页 / 共20页
单片机电子密码锁带时钟Word文档格式.docx_第2页
第2页 / 共20页
单片机电子密码锁带时钟Word文档格式.docx_第3页
第3页 / 共20页
单片机电子密码锁带时钟Word文档格式.docx_第4页
第4页 / 共20页
单片机电子密码锁带时钟Word文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

单片机电子密码锁带时钟Word文档格式.docx

《单片机电子密码锁带时钟Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机电子密码锁带时钟Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

单片机电子密码锁带时钟Word文档格式.docx

ucharIS_Valid_User=0;

ucharcodeTitle_Text[]="

YourPassword..."

;

ucharDSY_BUFFER[10]="

"

//显示缓冲

ucharUserPassword[10]="

//用户输入的密码

voidInitialize_LCD();

voidSet_Disp_Pos(ucharpos);

voidWrite_LCD_Data(uchardat);

voidDisplay_String(uchar*str,ucharLineNO);

//在液晶指定行显示字符串

voidIIC_24C04_Init();

//IIC初始化

voidBeep();

voidyinyue();

voidWrite_LCD_Command(ucharcmd);

ucharRecString(ucharSlave,ucharSubsddr,uchar*Buffer,ucharN);

//从IIC读取数据

ucharSendString(ucharSlave,ucharSubsddr,uchar*Buffer,ucharN);

//向IIC写入数据

ucharKeys_Scan();

//键盘扫描

voidboss();

sbitLED_OPEN=P2^4;

//开锁亮灯

sbitBEEP=P3^7;

//蜂鸣器

sbitRS=P2^7;

sbitRW=P2^6;

sbitEN=P2^5;

sbitSCL=P3^2;

sbitSDA=P3^3;

//-------------------------------------

//延时

voidDelayXus(uintx)

{

uchari;

while(x--)for(i=0;

i<

120;

i++);

//蜂鸣器子程序

voidBeep()

for(i=0;

100;

i++)

DelayXus

(1);

BEEP=~BEEP;

BEEP=0;

//-------------------------------------

//清除密码

voidClear_Password()

UserPassword[0]='

\0'

DSY_BUFFER[0]='

voidDisplay_String(uchar*str,ucharLineNO)

Write_LCD_Command(LineNO|0x80);

for(i=0;

=strlen(str);

Write_LCD_Data(str[i]);

//-----------------------------------------------------------------

//主程序

voidmain()

P0=0xFF;

P1=0xFF;

P2=0xFF;

IE=0x82;

//允许T0中断

TMOD=0x00;

//TMOD=0x02;

//T0设置为8位自动重装模式

//TH0=175;

//TL0=175;

//TR0=1;

//启动T0

DelayXus(10);

Initialize_LCD();

//初始化LCD

IIC_24C04_Init();

//初始化24C04

Display_String(Title_Text,0x00);

//在第1行显示标题

RecString(0xa0,0,IIC_Password,6);

IIC_Password[0]='

UserPassword[0]='

while

(1)

{

boss();

Beep();

DelayXus(100);

P1=0xF0;

while(P1!

=0xF0);

//如果有键未释放则等待

while(P1==0xF0);

//如果没有再次按下按键则等待

//----------------------------------------LCD1602.C----------------------------

//液晶控制与显示程序

voidDelayMS(uintms)

while(ms--)for(i=0;

//------------------------------------

//忙检查

ucharBusy_Check()

ucharLCD_Status;

RS=0;

//RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

RW=1;

//R/W为读写信号线,高电平

(1)时进行读操作,低电平(0)时进行写操作

EN=1;

//E(或EN)端为使能(enable)端,下降沿使能,下跳变时液晶屏开始执行命令

DelayMS

(1);

LCD_Status=P0;

//DB9为高4位三态、双向数据总线7位(最高位)(也是busyflag)

EN=0;

returnLCD_Status;

//-----------------------------

//写LCD命令

//---------------------------------

voidWrite_LCD_Command(ucharcmd)

while((Busy_Check()&

0x80)==0x80);

//忙等待

//低电平0时选择指令寄存器

RW=0;

//低电平(0)时进行写操作

//写指令时,E为高脉冲,即让E从0到1发生正跳变,应先置0

P0=cmd;

//产生正跳变

//设置LCD显示位置

voidSet_Disp_Pos(ucharpos)

Write_LCD_Command(pos|0x80);

//发送数据

voidWrite_LCD_Data(uchardat)

RS=1;

//高电平1时选择数据寄存器

P0=dat;

//LCD初始化

voidInitialize_LCD()

Write_LCD_Command(0x38);

//设置16×

2显示,5×

7点阵,8位数据接口

Write_LCD_Command(0x01);

//显示清屏,数据指针=0,所有显示=0

Write_LCD_Command(0x06);

//写指令06H置字符输入模式:

屏幕不动,字符后移

Write_LCD_Command(0x0c);

//显示开,关光标

/*

//----------------------------------

//显示字符串

voidShowString(ucharx,uchary,uchar*str)

uchari=0;

if(y==0)Write_LCD_Command(0x80|x);

//以下设置显示起始位置

if(y==1)Write_LCD_Command(0xc0|x);

//1602型LCD字符显示位置的确定方法规定为:

80H+地址码,注意可以设置显示位置

//第二行行首地址:

80H+40H=0CH教材

P287

16;

i++)//输出字符串

*/

//-----------------------------------------------------------------------

//1602型LCD内部地址参照教材P287,1602型字符显示位置的确定方法规定为80H+地址码(00-0FH40-4FH)

//如要将字符显示在第2行第6列,则确定地址的指令代码应为80H+45H=C5H

//----------------------------24C04.c--------------------------------

//24C04IIC读/写程序

//-------------------------------------------------------------------

voidDeslayMS(uintx)

//---------------------------------------------------------

//起始位

voidStart()

SDA=1;

SCL=1;

Delay4us();

SDA=0;

SCL=0;

//停止位

voidStop()

//读取应答每次传送一个字节完毕,必须接收从机发出的一个应答位

voidRACK()

//发送应答信号

voidACK()

//发送非应答信号

voidNO_ACK()

//从芯片读取1字节

ucharRecbyte()

uchari,rd;

rd=0x00;

8;

rd<

<

=1;

rd|=SDA;

returnrd;

//向芯片发送1字节

ucharSendByte(ucharwd)

bitack0;

SDA=(bit)(wd&

0x80);

wd<

//释放总线并准备读取应答

ack0=!

SDA;

//此SDA为从机发来的应答信号,SDA为0表示应答,为1则为无应答

returnack0;

//返回应答

//向芯片发送多字节数据函数(写多字节)

ucharSendString(ucharSlave,ucharSubaddr,uchar*Buffer,ucharN)

Start();

if(!

SendByte(Slave))return0;

//0xa0器件地址以及写入操作,0xa0即为10100000B

SendByte(Subaddr))return0;

N;

SendByte(Buffer[i]))return0;

Stop();

return1;

//接收多字节数据函数(读多字节)

ucharRecString(ucharSlave,ucharSubaddr,uchar*Buffer,ucharN)

SendByte(Slave+1))return0;

//0xa1器件地址以及读取操作,0xa1即为10100001B

N-1;

Buffer[i]=Recbyte();

//接收数据

ACK();

//发送应答位

Buffer[N-1]=Recbyte();

//

NO_ACK();

//发送非应答位

//向24C04中写一个字节数据

//数据先通过指令完成移位再从SDA串行输出。

按照时序要求,

//数据在SCL低电平时变化,高电平时稳定,每个时钟脉冲传送一位。

voidWrite_A_Byte(ucharb)

b<

SDA=CY;

//反汇编可以看出左移是x

//SDA=(bit)(b&

0x80);

//通过按位“与”运算将最高位数据?

//因为传送时高位在前,低位在后

RACK();

//向指定地址写数据

voidWrite_IIC(ucharaddr,uchardat)

Write_A_Byte(0xa0);

//0xa0器件地址以及写入操作,0xa1即为10100000B

Write_A_Byte(addr);

//芯片内存寻址

Write_A_Byte(dat);

DeslayMS(10);

ucharRead_A_Byte()

uchari,b;

//可以不要

b|=SDA;

returnb;

//从任意地址读取数据

ucharRead_Current()

uchard;

Write_A_Byte(0xa1);

d=Read_A_Byte();

returnd;

ucharRandom_Read(ucharaddr)

returnRead_Current();

//--------------------------------------------------------

//中断发声换函数

voidT0_INT()interrupt1

BEEP=!

BEEP;

TH0=HI_LIST[sidx];

TL0=LO_LIST[sidx];

//IIC总线初始化

//-------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1