单片机/MCU论坛
直播中

cdy_shenhua

13年用户 22经验值
擅长:模拟与电源
私信 关注
[问答]

基于51的电子密码锁的实验,但程序出错,求高手

#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Delay4us() {_nop_();_nop_(); _nop_();_nop_();}
***it SCL =P3^2;
***it SDA =P3^3;
//上次按键和当前按键序号,该矩阵中序号范围0-15,16表示无按键
uchar Pre_KeyNo = 16,KeyNo = 16;
uchar code title_Test[] ="Your Password..."; //标题字符串
uchar DSY_BUFFER[10] ="";  //显示缓冲
uchar UserPassword[10] =""; //用户输入的密码
void LCD_Init();  //液晶初始化
void Display_String(uchar *str,uchar LineNo); //液晶指定行显示字符串
void IIC_24C04_Init(); //IIC初始化
void Beep(); //蜂鸣器

QQ截图20120106155732.jpg
uchar RecString(uchar Slave,uchar Subaddr,uchar *Buffer,uchar N); //从IIC读取数据
uchar SendString(uchar Slave,uchar Subaddr,uchar *Buffer,uchar N); //向IIC写入数据
uchar Keys_Scan(); //键盘扫描,返回键盘号0-15
***it LED_OPEN =P2^7;  //开锁亮灯
***it BEEP=P3^7;
***it LCD_RS= P2^0;
***it LCD_RW= P2^1;
***it LCD_EN= P2^2;


//起始位//
void Start()
{
SDA = 1;
SCL = 1;
Delay4us();
SDA = 0;
Delay4us();
SCL = 0;
}
//停止位//
void Stop()
{
SDA = 0;
SCL = 1;
Delay4us();
SDA = 1;
Delay4us();
SCL = 0;
}
//IIC总线初始化//
void IIC_24C04_Init()
{
SCL = 0; Stop();
}
//发送应答信号//
void ACK()
{
SDA = 0; SCL = 1; Delay4us(); SCL = 0; SDA = 1;
}
//发送非应答信号//
void NO_ACK()
{
SDA = 1; SCL = 1; Delay4us(); SCL = 0; SDA = 0;
}
//从芯片读取1字节//
uchar RecByte()
{
uchar i,rd;
rd = 0x00;
SDA = 1;
for(i = 0; i<8; i++)
{
SCL = 1; rd <<=1; rd|= SDA; Delay4us(); SCL = 0; Delay4us();
}
SCL = 0;
Delay4us();
return rd;
}
//向芯片发送1字节//
uchar SendByte(uchar wd)
{
uchar i;
bit ack0;
for(i = 0; i<8; i++)
{
SDA = (bit)(wd & 0x80 );
_nop_(); _nop_(); SCL = 1; Delay4us(); SCL = 1; wd <<= 1;
}
Delay4us();
SDA = 1;
SCL = 1;
Delay4us();
ack0 = !SDA;
SCL = 0;
Delay4us();
return ack0;
}
//发送多字节数据函数//
uchar SendString(uchar Slave,uchar Subaddr,uchar *Buffer,uchar N)
{
uchar i;
Start();
if(!SendByte(Slave)) return 0;
if(!SendByte(Subaddr)) return 0;
for(i = 0; i {
if (!SendByte(Buffer)) return 0;
}
Stop();
return 1;
}
//接收多字节数据函数//
uchar RecString(uchar Slave,uchar Subaddr,uchar *Buffer,uchar N)
{
uchar i;
Start();
if(!SendByte(Slave)) return 0;
if(!SendByte(Subaddr)) return 0;
Start();
if(!SendByte(Slave + 1)) return 0;
for(i = 0; i {
  Buffer = RecByte();
  ACK();
}
Buffer[N-1] = RecByte();
NO_ACK();
Stop();
return 1;
}
void DelayMS(uint x);
uchar Keys_Scan()
{
uchar Tmp,KeyNo = 0;
P1 = 0x0F;
DelayMS(1);
Tmp = P1^ 0x0F;
switch(Tmp)
{
case 1: KeyNo = 0;break;
case 2: KeyNo = 1;break;
case 4: KeyNo = 2;break;
case 8: KeyNo = 3;break;
default: KeyNo = 16;
}
P1 = 0xF0;
DelayMS(1);
Tmp = P1 >> 4^ 0x0F;
switch(Tmp)
{
case 1: KeyNo += 0;break;
case 2: KeyNo += 4;break;
case 4: KeyNo += 8;break;
case 8: KeyNo += 12;
}
return KeyNo;
}
         //延时//
void DelayMS(uint x)
{
uchar i;
while (x--) for (i=0;i<120;i++);
}
//蜂鸣器子程序//
void Beep()
{
uchar i;
for(i = 0;i<100;i++)
{
DelayMS(1);
BEEP= ~BEEP;
}
BEEP =0;
}
//清除密码//
void Clear_Password()
{
UserPassword[0]='';
DSY_BUFFER[0]='';
}
//主程序//
void main()
{
uchar i=0;
uchar IIC_Password[10];
uchar IS_Valid_User =0;
P0=P1=P2=0xFF;
TMOD=0x02;
TH0=175;
TL0=175;
TR0=1;
DelayMS(10);
LCD_Init();
IIC_24C04_Init();
Display_String(Title_Test,0x00);
RecString(0xa0, 0,IIC_Password,6);
IIC_Password[6]='';
while(1)
{
P1=0xF0;
if(P1 !=0xF0) KeyNo=Keys_Scan();
if(Pre_KeyNo !=KeyNo);
{
if (i<10)
{
switch (KeyNo)
{
case 0: case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8: case 9:
if(i==0)Display_String("     ",0x40);
UserPassword =KeyNo+ '0';
UserPassword[i+1] = '';
DSY_BUFFER ='*';
DSY_BUFFER[i+1] ='';
Display_String(DSY_BUFFER,0x40);
i++;
break;
case 10:
if (strcmp(UserPassword,IIC_Password) ==0)
{
LED_OPEN = 0;
Clear_Password();
Display_String("Unlock OK!   ",0X40);
IS_Valid_User = 1;
}
else
{
LED_OPEN = 1;
Clear_Password();
Display_String("ERROR!   ",0X40);
IS_Valid_User = 0;
}
i = 0;
break;
case 11:
LED_OPEN = 1;
Clear_Password();
Display_String(Title_Test,0x00);
Display_String("  ",0X40);
i = 0;
IS_Valid_User = 0;
break;
case 12:
if ( !IS_Valid_User ) Display_String("No rights !",0x40);
else
{
i = 0;
Display_String("New Password:   ",0x00);
Display_String("  ",0X40);
}
break;
case 13:
if ( !IS_Valid_User ) Display_String("No rights !",0x40);
else
{
SendString(0xa0, 0, UserPassword,6);
RecString(0xa0, 0,IIC_Password,6);
IIC_Password[6] ='';
i = 0;
Display_String(Title_Test,0x00);
Display_String("Password Saved!   ",0X40);
}
break;
case 14:
i = 0;
Clear_Password();
Display_String("  ",0X40);
}
}
Beep();
Pre_KeyNo = KeyNo;
}
DelayMS(100);
}
}
//LCD显示驱动函//

bit LCD_Busy_Check();
void LCD_Initialize();
void LCD_Set_POS(uchar);
void LCD_Write_Command(uchar);
void LCD_Write_Data(char);
//延时//
void DelayMS(uint ms)
{
uchar t;
while(ms--) for (t=0;t<120;t++);
}
//忙检查//
bit LCD_Busy_Check()
{
bit Result;
LCD_RS=0;LCD_RW=1;LCD_EN=1;DelayNOP();
Result =(bit)(P0&0x80);
LCD_EN=0;
return Result;
}
//向LCD写指令//
void void LCD_Write_Command(uchar cmd)
{
while (LCD_Busy_Check());
LCD_RS_=0;LCD_RW_=0;LCD_EN_=0;
_nop_(); _nop_();
P0=cmd; DelayNOP();
LCD_EN_=1;DelayNOP();
LCD_EN_=0;
}
//向LCD写数据//
void LCD_Write_Data(uchar str)
{
while (LCD_Busy_Check());
LCD_RS_=1;LCD_RW_=0;LCD_EN_=0;
_nop_(); _nop_();
P0=str; DelayNOP();
LCD_EN_=1;DelayNOP();
LCD_EN_=0;
}
//初始化LCD//
void LCD_Initialize()
{
DelayMS(5); LCD_Write_Command(0x38);
DelayMS(5); LCD_Write_Command(0xoC);
DelayMS(5); LCD_Write_Command(0x06);
DelayMS(5); LCD_Write_Command(0x01);
DelayMS(5);
}
//设置显示位置//
void LCD_Set_POS(uchar Position)
{
LCD_Write_Command(Position | 0x80);
}
//显示函数,在LCD指定行上显示字符串//
void Display_String(uchar * str, uchar LineNo)
{
uchar k;
LCD_Set_POS(LineNo);
for(k=0;k<16;k++)
LCD_Write_Data(str[k]);
}

回帖(16)

清水河

2012-1-6 15:57:05
最不喜欢的就是代码
举报

w7851435

2012-1-8 09:39:53
不懂、、、、
举报

w7851435

2012-1-8 09:41:11
.....
举报

w7851435

2012-1-8 09:42:06
0.0................
举报

电工师

2012-1-9 13:35:16
基于51的电子密码锁的实验,但程序出错,请问楼主程序出错,错在哪里?说楼主给指出来,不然大家怎么帮楼主啊/
举报

张永

2012-1-10 16:15:00
代码没有注析,不好分析!
举报

li.sunny

2012-1-10 16:29:31
编译出错?把错误信息和错误代码贴出来吧
举报

sky520147

2012-1-14 22:22:20
这个思路那么长,看得懂的是一部分,看不懂的是大部分,独立能设计出这个程序的水平大概是到哪个层次?刚才复制了编译是出现几个错误亦不懂其意思“TEXT4.C(108): warning C214: 'Argument': conversion: pointer to non-pointer
TEXT4.C(124): error C214: illegal pointer conversion
TEXT4.C(289): error C237: '_DelayMS': function already has a body
Target not created
举报

薛佳铭

2012-1-17 09:50:13
楼主你这样大家看的眼花啊。注释呢。遇到的问题也说的不明白啊。哪里出错?
举报

cdy_shenhua

2012-1-17 12:35:44
我已经通过实验自己解决了,谢谢大家的帮忙,主要问题是键盘抖动问题,我已经通过松手检测实现了,谢谢大家!
举报

320875

2012-1-19 12:25:20
还是流程图 直观~~~~~~~~~~~~~~~~~~~
举报

NIMADEa

2012-2-27 19:16:35
??看不懂
举报

邓明星

2012-2-29 21:05:49
楼主又是代码流 谁都不愿意看  查看错误大致在什么地方 然后再上传吧
举报

张工

2013-5-30 17:10:45
引用: cdy_shenhua 发表于 2012-1-17 12:35
我已经通过实验自己解决了,谢谢大家的帮忙,主要问题是键盘抖动问题,我已经通过松手检测实现了,谢谢大家 ...

程序能给我一个吗? 能用的程序,我也在做,我也和你一样,程序编辑结束,但是就是不能工作
举报

h1654155870.9452

2015-6-20 00:12:21
引用: 104458584 发表于 2013-5-30 17:10
程序能给我一个吗? 能用的程序,我也在做,我也和你一样,程序编辑结束,但是就是不能工作

能发我下程序吗  或者指点下改哪里我也遇到了同样的问题
举报

h1654155870.9452

2015-6-20 00:13:11
能发我下程序吗  或者指点下改哪里我也遇到了同样的问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分