单片机课程设计报告IC卡读写器设计 - 图文

更新时间:2024-04-03 08:47:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

南京工程学院

课程设计

课程名称单片机原理及应用B 课题名称IC卡读写器设计 院(系、部、中心)通信工程学院 专业通信工程 班级 姓名 学号 起止日期

设计地点微机原理与单片机实验室 指导老师岳俊生水恒华

单片机原理及应用B

摘要

IC卡在现代生活中应用非常广泛,IC卡读写器的设计方法有多种,其中,利用单片机外接芯片实现的IC卡读写器具有编程灵活,便于IC卡读写器功能的扩充,运算存储方便等优点。

本文主要介绍用单片机外接24C16EEPROM的方法,利用键盘对24C16进行模拟充值的方法。本设计由单片机P89V51RD2芯片、24C16EEPROM和LCD液晶显示为核心,辅以必要的电路,构成了一个IC卡读写器,使用起来很方便 此IC卡读写器严格按照要求设计,最终达到预期的效果,并且添加了进行挂失,修改密码,低值报警,透支报警等相关功能。

关键词IC卡读写器/单片机 /C51编程

The Principle and Application of Single ChipMicrocomputer

ABSTRACT

IC card is widely used in modern life。There are a variety of IC card reader design methods, which use an external chip microcontroller IC card reader with programming flexibility, ease of expansion IC card reader function, operation and easy storage。

This paper describes a method 24C16EEPROM external MCU, using the keyboard to simulate 24C16 recharge methods.Designed by the MCU chip P89V51RD2, 24C16EEPROM and LCD display as the core, supplemented by the necessary circuitry, constitute an IC card reader, easy to use。

This IC card reader in strict accordance with the requirements of the design, and ultimately achieve the desired effect, and add report the loss, change passwords, low alarm, alarm and other related functions overdraft.

KeywordsIC card reader /P89V51RD2 single-chip computer /C51 programming

目录

一、课程设计目的 ........................................................................................................................... 1 二、基本思路 ................................................................................................................................... 1 三、实验方案 ................................................................................................................................... 1 四、实验开发环境及元器件 ........................................................................................................... 1 1 、开发工具及开发环境简介 ....................................................................................................... 1 1.1 单片机 ....................................................................................................................................... 1 1.2 Proteus ........................................................................................................................................ 1 1.3 KEIL .............................................................................................................................................. 2 2、P89V51RD2 ................................................................................................................................. 2 3、24C16EEPROM ............................................................................................................................ 2 4.、LCD1602 ..................................................................................................................................... 3 (1)简介 .............................................................................................................................................. 3 (2)管脚功能 ...................................................................................................................................... 3 (3)16进制ASCII码表 ....................................................................................................................... 3 (4)特性 .............................................................................................................................................. 4 五、系统分析与设计 ....................................................................................................................... 4 1、系统框图..................................................................................................................................... 4 2、软件设计..................................................................................................................................... 4 (1)软件程序内容 .............................................................................................................................. 4 (2)软件设计流程图 .......................................................................................................................... 4 (3)程设计步骤 .................................................................................................................................. 8 (4)电路连线图 .................................................................................................................................. 9 六、具体程序设计及步骤 ............................................................................................................... 9 1、头文件:..................................................................................................................................... 9 2、各个。C文件: ....................................................................................................................... 11 3、程序调试及结果: ................................................................................................................... 26 ⑴调试步骤..................................................................................................................................... 26 ⑵实验现象..................................................................................................................................... 27 七、课程设计体会……………………………………………………………………………………………………………… 27 八、参考文献…………………………………………………………………………………………………………………… 28

一、课程设计目的

本课程设计是在《单片机原理及应用B》课程主要内容学习之后,通过一个单片机应用系统的设计和调试,训练学生综合运用本课程知识,独立解决工程实际问题的能力;使学生加深对单片机结构、工作原理的理解,提高学生综合应用知识的能力、分析解决问题的能力和单片机应用系统的设计技能;同时培养学生查阅科技资料和撰写科技报告的能力。

二、基本思路

通过此次课程设计掌握I2C总线的基本特点和通信协议,掌握24xx系列EEPROM的基本特点及总线控制协议,掌握单片机IO端口模拟I2C时序控制程序的编写方法。

单片机通过P1.0和P1.1分别连接24C16的SDA和SCL,编写单片机通过IO端口模拟I2C时序控制24C16读写的程序。通过键盘对24C16EEPROM进行模拟充值,通过LED/LCD实时显示卡内实际金额。

三、实验方案

在进行头文件配置完之后,建立一个while(1),死循环,在这个死循环中不断检测键盘输入,检测到键盘输入后,根据键盘的值,执行相应的子函数。并通过1602LCD显示出来相应的过程。

四、实验开发环境及元器件

1 、开发工具及开发环境简介

1.1 单片机

单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。

1.2 Proteus

Proteus软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过Proteus软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。

1.3 KEIL

单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势

2、P89V51RD2

P89V51RD2是Philips公司生产的一款80C51微控制器,包含64KB Flash和1024字节的数据RAM。P89V51RD2的典型特性是它的X2方式选项。利用该特性,设计者可使应用程序以传统的80C51时钟频率(每个机器周期包含12个时钟)或X2 方式(每个机器周期包含6个时钟)的时钟频率运行,选择X2方式可在相同时钟频率下获得2倍的吞吐量。从该特性获益的另一种方法是将时钟频率减半来保持特性不变,这样可以极大地降低EMI。Flash程序存储器支持并行和串行在系统编程(ISP),ISP允许在软件控制下对成品中的器件进行重复编程。应用固件的产生/更新能力实现了ISP的大范围应用。 5V的工作电压,操作频率为0~40MHz。 3、24C16EEPROM

EEPROM(带电可擦写可编程只读存储器)是用户可更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。在一个EEPROM中,当计算机在使用的时候可频繁地反复编程,因此EEPROM的寿命是一个很重要的设计考虑参数。EEPROM是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程。

4.、LCD1602

(1)简介

1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

(2)管脚功能

1602采用标准的16脚接口,其中:

第1脚:VSS为电源地 第2脚:VDD接5V电源正极

第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端。 第7~14脚:D0~D7为8位双向数据端。

第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。

(3)16进制ASCII码表

字符集 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。 在单片机编程中还可以用字符型常量或变量赋值,如'A?。因为CGROM储存的字符代码与我们PC中的字符代码是基本一致的,因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1=?A?这样的方法。PC在编译时就把'A'先转换为41H代码了。 (4)特性

3.3V或5V工作电压,对比度可调 内含复位电路 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能 有80字节显示数据存储器DDRAM 内建有192个5X7点阵的字型的字符发生器CGROM 8个可由用户自定义的5X7的字符发生器CGRAM 五、系统分析与设计

1、系统框图

24C16EEPROM LCD 中央处理器 89C51 键盘

2、软件设计

(1)软件程序内容

本设计的软件程序包括主程序、充值子程序、消费子程序、挂失子程序、 修改密码程序和报警子程序等等。另外,还设计了LCD显示子程序。

(2)软件设计流程图

开始键盘有键按下当键盘输入为ADD则执行充值程序当键盘输入为SUB则执行消费程序当键盘输入为LOSS则执行挂失程序当键盘输入为DEL则执行修改密码程序

主程序框图

键盘输入为ADD输入需要充值的金额与SUM现有的值相加,并作为新的SUM的值返回主程序

充值子程序 消费子程序

键盘输入为SUB键盘输入需要消费的金额输入金额小于SUM现有值NYSUM值减去输入金额,并作显示sub fail为新的SUM值显示sub 蜂鸣器报警success返回主程序键盘输入为LOSS键盘输入密码密码输入正确yn显示Locked!显示Locked fail!返回主程序

挂失子程序

键盘输入密码密码输入正确YN显示use up in success显示use up in fail返回主程序 解锁子程序

键盘输入为DEL输入密码正确Y输入新密码N再次输入密码N两次输入密码相同Y返回主程序

修改密码子程序

(3)程设计步骤

①进行头文件配置,设置相应的端口名 ②采用死循环,通过查询方式检测是否有键按下 ③根据键盘的值执行相应的子程序 ④在执行过程中控制LCD显示相应的内容 ⑤在子程序执行完后返回主程序 ⑥在子程序中进行相应的数值运算

⑦挂失和修改密码的子程序将改变存储在存储器中的密码值,使之从主程序中跳出来,待重新启用成功购在回到主循环中

(4)电路连线图

六、具体程序设计及步骤

1、头文件: at24co2.h

#ifndef __AT24C02__ #define __AT24C02__ #include \#include sbit SCL=P1^7; sbit SDA=P1^6; sbitbuz=P3^7;

void start_at24c02(); void stop_at24c02(); bit wait_at24c02_ack(); void at24c02_ack(bit ck);

void write_at24c02_byte(uchardat);

uchar read_at24c02_byte();

bit read_at24c02(ucharadd,uchar *buf); bit write_at24c02(ucharadd,uchardat);

bit read_at24c02_buf(ucharadd,uchar *buf,uchar length); bit write_at24c02_buf(ucharadd,uchar *buf,uchar length); #endif

Key.h

#ifndef __KEY__ #define __KEY__ #include \#include #define CANCEL 15 #define ENTER 14 #define ADD 13 #define SUB 12 #define LOSS 11 #define DEL 10 bit keytest(void);

uchargetkeynum(void); #endif

Lcd1602.h

#ifndef __LCD1602__ #define __LCD1602__ #include\#define LINE1 0x80 #define LINE2 0xC0 sbit RW=P1^1; sbit RS=P1^0; sbit BUSY=P0^7; sbit EN=P1^2; sbit LCMBLC=P1^3; void wait_lcd1602();

void write_lcd1602_cmd(ucharcmd); void write_lcd1602_dat(uchardat); void init_lcd1602();

void write_string(ucharadd,uchar *buf); #endif

main.h

#ifndef __MAIN__ #define __MAIN__

#define uchar unsigned char #define uint unsigned int #define SECRET_ADD 0x03 #define LOW_ADD 0x00 #define HIGH_ADD 0x01 void delay(uintdtime); #endif

proce.h

#ifndef __PROCE__ #define __PROCE__ #include #include \#include \#include \

#include \ void display_sum(void); void sub_pro(void); void add_pro(void); bit lose_pro(void); bit change_pro(void); #endif Serve.h

#ifndef __SERVE__ #define __SERVE__ //sbitbuz=P3^7; bit add(void); bit sub(void); bit lose(void); bit unlose(void);

bit change_first(void); bit change_second(void); #endif

2、各个.C文件:

at24c02.c

#include #include\#include void delay(uintdt) {while(dt--);}

void start_at24c02() {SCL=0;_nop_();

SDA=1;_nop_(); SCL=1;_nop_(); SDA=0;_nop_(); }

void stop_at24c02() {SCL=0;_nop_(); SDA=0;_nop_(); SCL=1;_nop_(); SDA=1;_nop_(); }

void at24c02_ack(bit ck) {

if (ck)

SDA = 0; //发送ack else

SDA = 1; //不发送ack SCL = 1; delay(100); SCL = 0; delay(100); SDA = 1; delay(100); }

bit wait_at24c02_ack() {

SDA=1;

delay(100); SCL=1;

delay(100); if(SDA) {

SCL=0;

stop_at24c02();

return 1; //没收到ack } else {

SCL=0;

return 0; //收到ack }}

void write_at24c02_byte(uchardat) {

uchari; SCL=0;

for(i=0;i<8;i++) {

if(0x80&dat) SDA=1; else

SDA=0; dat<<=1; SCL=1; SCL=0; } }

uchar read_at24c02_byte() {

uchartemp,i; SCL=0;

for(i=0;i<8;i++) {

temp<<=1; if(SDA)

temp=temp|0x01; SCL=1; SCL=0; }

return temp; }

bit read_at24c02(ucharadd,uchar *buf) {

start_at24c02();

write_at24c02_byte(0xA0); if(wait_at24c02_ack()) return 1;

write_at24c02_byte(add); if(wait_at24c02_ack()) return 1; start_at24c02();

write_at24c02_byte(0xA1); if(wait_at24c02_ack()) return 1;

*buf=read_at24c02_byte(); at24c02_ack(0); stop_at24c02(); delay(1000); return 0; }

bit write_at24c02(ucharadd,uchardat) {

start_at24c02();

write_at24c02_byte(0xA0); if(wait_at24c02_ack()) return 1;

write_at24c02_byte(add); if(wait_at24c02_ack()) return 1;

write_at24c02_byte(dat); if(wait_at24c02_ack()) return 1; stop_at24c02(); delay(1000); return 0; }

return 0; }

Key.c

#include #include \

ucharkey_tab[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; bit keytest(void) {uchar temp = 0; P2 =0x0f;

temp = P2&0x0f; if(temp != 0x0f) {

P2 =0x0f;

temp = P2&0x0f; if(temp != 0x0f) return 1;} return 0; }

uchargetkeynum(void) {

uchar j = 0x01; uchari ,temp = 0; i = 16;

delay(2000); if(keytest())

{for(i = 0; i< 4; i++)

{

P2 = ~j;

temp = P2&0xf0; if(temp == 0xf0) j = j << 1; else

break; }

while((P2 & 0xf0) != 0xf0); temp = temp | ((~j)&0x0f) ; for(i = 0; i< 16 ; i++) {if(temp == key_tab[i]) break; } }

return i;}

lcd1602.c

#include #include\void wait_lcd1602() {do

{ RS=0; RW=1; EN=1;

}while(BUSY==1); EN=0; }

void lcd1602_clear() {wait_lcd1602(); EN = 0; RS = 0; RW = 0; P0 = 0x01; EN = 1; delay(1); EN = 0; }

void write_lcd1602_cmd(ucharcmd) {wait_lcd1602(); EN=0; RS=0; RW=0;

P0=cmd; EN=1;

delay(100); EN=0; }

void write_string(ucharadd,uchar *buf) {

write_lcd1602_cmd(add); while(*buf!='\\0')

{write_lcd1602_dat(*buf); buf ++; } }

void init_lcd1602() {

write_lcd1602_cmd(0x38); write_lcd1602_cmd(0x38); write_lcd1602_cmd(0x38); write_lcd1602_cmd(0x0C); write_lcd1602_cmd(0x06); write_lcd1602_cmd(0x01); LCMBLC = 0; }

main.c

#include #include #include #include \#include \#include \#include \#include %ucharinit(void) { ucharbuf[4]=\ uchard_buf[4]={0}; uchari,add; init_lcd1602(); read_at24c02_buf(0xAA,d_buf,4); add=0x40; i=0; if(strncmp(buf,d_buf,4)!=0) write_at24c02_buf(0xAA,\

write_string(LINE2,\ welcom \ delay(10000); i=20; write_at24c02_buf(SECRET_ADD,\ write_at24c02(0X00,0); write_at24c02(0X01,0); } write_string(LINE1+9,\ return i; }

ucharrst(void) { ucharbuf[4]=\ uchard_buf[4]={0}; uchari; init_lcd1602(); write_at24c02_buf(0xAA,\ write_string(LINE2,\ reset MCU !! \ i=20; write_at24c02_buf(SECRET_ADD,\ write_at24c02(0X00,0); write_at24c02(0X01,0); write_string(LINE1+9,\ return i; }

void main(void) { ucharkeynum = 16; uchari=0; ucharlose_err = 0; uchar flag=1; i = init(); read_at24c02(0xff,&lose_err); lcd1602_clear(); while(1) { display_sum(); if(keytest()) { keynum = getkeynum(); } if(keynum==CANCEL) { i = rst();

keynum=16; }

/*充值*/

if(keynum == ADD) { add_pro(); i=30; keynum=16; }

/*sub*/

if(keynum == SUB) { sub_pro(); i=30; keynum=16; }

/*挂失*/

if(keynum == LOSS) { lose_err=lose_pro(); i=30; keynum=16; }/**change secret**/ if(keynum == DEL) { change_pro(); i=30; keynum=16; }

if(lose_err == 1)

{ write_at24c02(0xff,1); write_string(LINE1,\ while(1) { write_string(LINE2,\ if(keytest()) { keynum = getkeynum(); if(keynum != 16) lose_err=unlose(); else continue; if(lose_err == 1) {

\ \

}

lose_err = 0; write_at24c02(0xff,0); write_string(LINE2,\ i=30; break; } else {write_string(LINE2,\ i=30; } } keynum = 16; } write_string(LINE1,\ \ write_string(LINE1+9,\ keynum = 16; }

if(i==0 && flag==1) {flag = 0; write_string(LINE2,\ 208110327 \ write_string(LINE1+9,\}

if(i>0) { flag = 1; i-- ; }

proce.c

#include \void display_sum(void) {uint sum = 0; ucharlow,high;

read_at24c02(LOW_ADD,&low);delay(300); read_at24c02(HIGH_ADD,&high);delay(300); sum = (high)<<8 | low;

write_string(LINE1,\ if(sum<10) {

write_string(LINE2,\ }

if(sum/100!=0)

{

write_lcd1602_cmd(LINE1+4);

write_lcd1602_dat(sum/100+'0'); }

if(sum/100!=0 || sum/10!=0) {

write_lcd1602_cmd(LINE1+5);

write_lcd1602_dat(sum/10+'0'); }

write_lcd1602_cmd(LINE1+6); write_lcd1602_dat(sum+'0'); write_string(LINE1+9,\ write_string(LINE2+13,\}

void add_pro(void) {bit flag;

write_string(LINE2,\ flag=add(); if(flag) {

write_string(LINE2,\ } else {

write_string(LINE2,\ } }

bit lose_pro(void) {bit flag;

write_string(LINE2,\ flag=lose(); if(flag) {

write_string(LINE2,\ write_string(LINE1,\ write_string(LINE1+9,\ return 1; } else {

write_string(LINE2,\ write_string(LINE1,\

write_string(LINE1+9,\ return 0;

} } }

serve .c

#include \#include \#include \#include \#include bit add(void) {

ucharkey_buf = 16;

ucharpos = 0,dis_pos=0; uint money=0; ucharlow,high; uint temp=0;

write_string(LINE1,\

read_at24c02(LOW_ADD,&low);//delay(1000); read_at24c02(HIGH_ADD,&high);//delay(1000); money = (high<<8)|(low); while(1)

{if(keytest()) {

key_buf = getkeynum(); }

if(key_buf<= 9 &&key_buf>= 0) {

if(key_buf==0 &&pos==0) {

dis_pos++; goto dis; }

pos++;

dis_pos++; temp = temp*10+key_buf;

dis: write_lcd1602_cmd(LINE1+4+dis_pos); write_lcd1602_dat(key_buf+'0'); key_buf=16; }

if(key_buf == DEL) {

write_lcd1602_cmd(LINE1+4+dis_pos); write_lcd1602_dat(' ');

if(dis_pos!=0) {

pos--; dis_pos--;

temp = temp/10; }

key_buf=16; }

if(key_buf == CANCEL) {

write_string(LINE1,\ return 0; }

if(key_buf == ENTER) {

money=money + temp;

write_at24c02(LOW_ADD,money%6); write_at24c02(HIGH_ADD,money/256); write_string(LINE1,\ return 1; } } }

bit sub(void) {

// buz = 1;

ucharkey_buf = 16;

ucharpos = 0,dis_pos=0; int money=0; ucharlow,high; uint temp=0;

write_string(LINE1,\

read_at24c02(LOW_ADD,&low);delay(1000); read_at24c02(HIGH_ADD,&high);delay(1000); money = (high<<8)|(low); while(1) {

if(keytest()) {

key_buf = getkeynum(); }

if(key_buf<= 9 &&key_buf>= 0) {

if(key_buf==0 &&pos==0)

{

dis_pos++; goto dis; }

pos++;

dis_pos++; temp = temp*10+key_buf;

dis: write_lcd1602_cmd(LINE1+4+dis_pos); write_lcd1602_dat(key_buf+'0'); key_buf=16; }

if(key_buf == DEL) {

write_lcd1602_cmd(LINE1+4+dis_pos); write_lcd1602_dat(' '); if(dis_pos!=0) {

pos--; dis_pos--;

temp = temp/10; }

key_buf=16; }

if(key_buf == CANCEL) {

write_string(LINE1,\ return 0; }

if(key_buf == ENTER) {

if(temp > money) {

write_string(LINE1,\ buz = 0;

delay(100000); buz = 1; return 0; }

money=money-temp;

write_at24c02(LOW_ADD,money%6);delay(1000); write_at24c02(HIGH_ADD,money/256);delay(1000); write_string(LINE1,\ return 1;

} } }

bit lose(void) {

ucharkey_buf = 16; ucharpos = 0; ucharbuf[6]={0}; ucharsec_buf[6]={0};

write_string(LINE1,\ read_at24c02_buf(SECRET_ADD,buf,6); while(1) {

if(keytest()) {

key_buf = getkeynum(); }

if(key_buf<= 9 &&key_buf>= 0) {

sec_buf[pos] = key_buf+'0'; write_lcd1602_cmd(LINE2+pos); write_lcd1602_dat('*'); pos++;

key_buf=16; }

if(key_buf == CANCEL) {

//write_string(LINE1,\ return 0; }

if(key_buf == ENTER) {

if(!strncmp(buf,sec_buf,6)) //=0,equ return 1; else

return 0; }

if(key_buf == DEL) {

if(pos!=0) pos--; key_buf=16;

write_lcd1602_cmd(LINE2+pos); write_lcd1602_dat(' ');

} } }

bit change_first(void) {

ucharkey_buf = 16; ucharpos = 0; ucharbuf[6]={0}; ucharsec_buf[6];

write_string(LINE1,\ write_string(LINE2,\ read_at24c02_buf(SECRET_ADD,buf,6); while(1) {

if(keytest()) {

key_buf = getkeynum(); }

if(key_buf<= 9 &&key_buf>= 0) {

sec_buf[pos] = key_buf+'0'; write_lcd1602_cmd(LINE2+pos); write_lcd1602_dat('*'); pos++;

key_buf=16; }

if(key_buf == CANCEL) {

write_string(LINE1,\ return 0; }

if(key_buf == ENTER) {

if(!strncmp(buf,sec_buf,6)) //=0,equ return 1; else

return 0; }

if(key_buf == DEL) {

if(pos!=0) pos--;

write_lcd1602_cmd(LINE2+pos); write_lcd1602_dat(' ');

key_buf=16; } } }

bit change_second(void) {ucharkey_buf = 16,i; ucharpos = 0; ucharbuf[6]={0}; bit flag=0;

ucharsec_buf[6];

write_string(LINE1,\ write_string(LINE2,\ while(1) {

if(keytest()) {

key_buf = getkeynum(); }

if(key_buf<= 9 &&key_buf>= 0) {

sec_buf[pos] = key_buf+'0'; write_lcd1602_cmd(LINE2+pos); write_lcd1602_dat('*'); pos++;

key_buf=16; }

if(key_buf == CANCEL) {

write_string(LINE1,\ return 0; }}}

3、程序调试及结果:

⑴调试步骤

①打开软件后,在Project菜单中选择New Project命令,打开一个新项目。保存此项目,输入工程文件名后,并保存工程文件的目录。 ②为项目文件选择一个目标器件,即选择8051的类型。

③上述设置好后,创建源程序文件并输入程序代码。输入好代码后点击“文件/保存”。

④把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的文件。

⑤开始编译,对项目文件进行编译。若没有错误后进行硬件调试

⑵实验现象

运行成功会,会在试验箱上看到如下现象

七、课程设计体会

通过为期一周的课程设计,我学到了很多。首先我巩固了从课堂上学到的知识,对单片机与键盘接口,单片机与存储器接口,单片机与LCD显示屏的连接有了更加深刻的认识。第二,为期一周的课程设计培养了我写程序代码的能力,培养了我调试程序的耐心和找错的能力。第三,通过加功能,锻炼了我的拓展性思维和创新思维。第四,通过写设计报告,锻炼了我写论文的能力。总之,通过单片机课程设计我收获颇多,对我今后的学习有很大的帮助。

八、参考文献

1.单片机原理与应用及C51程序设计(第二版),谢维成等 编著,清华大学出版社,2009.7.

2.单片机原理及应用实验与课程设计指导书,岳俊生 宗慧编,南京工程学院,2013.8.

本文来源:https://www.bwwdw.com/article/rbfr.html

Top