单片机课程设计动态密码的实时发送Word下载.docx
- 文档编号:19873683
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:18
- 大小:316.88KB
单片机课程设计动态密码的实时发送Word下载.docx
《单片机课程设计动态密码的实时发送Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计动态密码的实时发送Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
设计电路原理图
制作硬件
设计和调试程序
课程设计报告
二、单片机课程设计报告
1、设计项目简介
随着现代生活的推进,动态密码在人们的生活中已经普及,此动态密码的实时发送是一款基于单片机AT98C51
(2)的计时工具,它的工作原理是利用程序使甲机每60ms发送一组随机密码,用随机函数实现,每组密码有6位数字组成;
乙机接收到密码后,在LCD液晶屏上实时显示接收到的密码,在LCD液晶屏上设置接收密码的倒计时(60S)标志
2、电路原理图
图一:
电路原理图
3、系统功能描述
按下开始键以后,甲机发送开始信号‘B’给乙机,乙机接受到信号并开始显示60S倒计时,倒计时结束后乙机发送倒计时结束信号‘C’给甲机,甲机开始产生密码并发送密码给乙机,乙机等待接受密码并在1602上显示。
4、程序流程图
甲机:
乙机
N
Y
5、心得体会
单片机是我所学专业的主要课程之一,因此我认为单片机课程设计是十分必要而且十分重要的。
尽管刚刚拿到课程设计题目时有点迷惘,不知道如何着手,但通过上网和图书馆查阅相关资料,自己认真钻研以及虚心询问同学,终于解决了一个又一个的困难和障碍,成功完成了任务。
通过本次的单片机课程设计,不仅大大地丰富了我的理论知识,而且在实践过程中更令我学会了坚持、耐心和努力。
此次单片机课程设计需要运用到许多之前所学过的知识,令我认识到自己以前学习的一些不足之处,例如对以前所学知识的理解不够深刻,掌握得不够牢固,运用不够灵活。
这让我懂得了认真学习的重要性,以及要孜孜不倦地钻研所学过的知识,做得融会贯通,不能一览而过,不求甚解。
在边学习边动手的过程中,我对电子时钟的构造以及原理有了进一步的了解,同时也加深和巩固了我对单片机汇编语言的认识。
除此之外,由于是第一次做单片机,因此在此次课程设计的过程中,无论是电路绘制还是汇编语言编写都难免遇到了不少困难和障碍,例如汇编语言编写出错、电路元件无从入手等。
在面对困难和障碍时,我庆幸自己没有退缩和逃避,而是通过各种方法,迎难而上,以坚持、耐心和努力勇敢无畏地面对困难,克服困难,解决困难。
让我发现问题、分析问题、解决问题以及动手实践的能力都有了很大的提高,并了解到理论知识与实践相结合的重要意义。
从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高。
本次课程设计尽管时间不长,但从中所获,将令我受益终生。
6、参考文献
[1]张毅刚.单片机原理及应用.北京:
高等教育出版社,2013:
12-1,31
附件一:
仿真调试
附件二:
程序
甲机程序:
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitscl=P2^1;
//定义了AT24C02的sda脚
sbitsda=P2^0;
//定义了AT24C02的scl脚
/*********************************************************/
//用于简短的延时
voidDelayShort()
{
;
}
//毫秒级的延时函数,time是要延时的毫秒数
voidDelayMs(uinttime)
uinti,j;
for(i=time;
i>
1;
i--)
for(j=111;
j>
j--);
//IIC总线初始化
voidIIcInit()
scl=1;
DelayShort();
sda=1;
//IIC起始函数
voidIIcStart()
sda=0;
scl=0;
//IIC终止函数
voidIIcStop()
//IIC写一个字节
voidIIcWriteByte(uchardat)
{
uchari,temp;
temp=dat;
for(i=0;
i<
8;
i++)
{
temp=temp<
<
scl=0;
DelayShort();
sda=CY;
scl=1;
}
//IIC读一个字节
ucharIIcReadByte()
uchari,temp,dat=0;
for(i=0;
{
temp=sda;
dat=(dat<
1)|temp;
DelayShort();
}
return(dat);
//IIC总线响应
voidIIcRespons()
uchari=0;
//如果sda收到低电平,或者i自加255个数后还没收到低电平,都认为收到了
while((sda==1)&
&
(i<
255))
i++;
//IIC读出数据
ucharIIcReadDat(ucharaddr)
uchardat;
EA=0;
IIcStart();
//AT24C02的地址由7位构成,高四位固定为1010,低三位接了地,所以为000。
第8位
//如果为0表示则表示往芯片写数据,为1表示读出数据,所以芯片地址为0xa0或0xa1
IIcWriteByte(0xa0);
IIcRespons();
IIcWriteByte(addr);
IIcWriteByte(0xa1);
dat=IIcReadByte();
IIcStop();
DelayMs(5);
EA=1;
returndat;
//IIC写入数据
voidIIcWriteDat(ucharaddr,uchardat)
IIcWriteByte(dat);
DelayMs(10);
//串口初始化
voidTimerInit()
TMOD=0x21;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
TR0=1;
REN=1;
EA=1;
ES=1;
//通过串口发送一字节数据
voidUartSendByte(uchardat)
SBUF=dat;
while(!
TI);
TI=0;
DelayMs
(2);
//主函数
voidmain(void)
ucharSendBuf[6]={0};
//保存6个随机密码数字
chari,j;
uinttemp;
TH0=IIcReadDat(0);
//读取断电前最后一次保存的定时器0的值
TL0=IIcReadDat
(1);
TimerInit();
//定时器初始化
IIcInit();
//IIC接口初始化
while
(1)
for(i=60;
=0;
i--)
{
IIcWriteDat(0,TH0);
//每隔1秒,保存一次定时器0的值到芯片AT24C02
IIcWriteDat(1,TL0);
UartSendByte(i);
//每隔1秒,发送剩余的秒数给乙机
DelayMs(1000);
}
SendBuf[0]=(TH0+TL0)%10+0x30;
//随机密码的第1位为TH0+TL0的个位
temp=TH0*TL0;
SendBuf[1]=temp/10000+0x30;
//随机密码的第2位为TH0*TH0的万位
SendBuf[2]=temp%10000/1000+0x30;
//随机密码的第3位为TH0*TH0的千位
SendBuf[3]=temp%1000/100+0x30;
//随机密码的第4位为TH0*TH0的百位
SendBuf[4]=temp%100/10+0x30;
//随机密码的第5位为TH0*TH0的十位
SendBuf[5]=temp%10+0x30;
//随机密码的第6位为TH0*TH0的个位
UartSendByte(0xEF);
//发送每一组密码前,先发送0xEF
for(j=0;
j<
6;
j++)//将6位密码依次发送出去
UartSendByte(SendBuf[j]);
//串口中断服务程序
voidUartInt0(void)interrupt4
if(RI==1)
RI=0;
乙机程序:
sbitLcdRS=P1^3;
//1602液晶的RS控制脚
sbitLcdRW=P1^4;
//1602液晶的RW控制脚
sbitLcdEN=P1^5;
//1602液晶的EN控制脚
TMOD=0x20;
//1602液晶写命令函数,com就是要写入的命令
voidWriteCom(ucharcom)
P0=com;
LcdRS=0;
LcdRW=0;
LcdEN=0;
DelayMs
(1);
LcdEN=1;
//1602液晶写数据函数,dat就是要写入的命令
voidWriteData(uchardat)
P0=dat;
LcdRS=1;
//1602液晶初始化函数
voidLcdInit()
WriteCom(0x38);
WriteCom(0x0c);
WriteCom(0x06);
//液晶光标定位函数
voidLcdGotoXY(ucharline,ucharcolumn)
if(line==1)//第一行
WriteCom(0x80+column-1);
if(line==2)//第二行
WriteCom(0xC0+column-1);
//液晶输出字符串函数
voidLcdPrintStr(uchar*str)
while(*str!
='
\0'
)
WriteData(*str++);
//定时器初始化
LcdInit();
//液晶初始化
LcdGotoXY(1,1);
LcdPrintStr("
Code:
"
);
LcdGotoXY(2,1);
Count:
s"
while
(1);
uchartemp,i;
temp=SBUF;
if(temp==0xef)
EA=0;
LcdGotoXY(1,9);
for(i=0;
{
while(!
RI);
temp=SBUF;
RI=0;
WriteData(temp);
}
EA=1;
else
LcdGotoXY(2,11);
WriteData(temp/10+0x30);
WriteData(temp%10+0x30);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 动态 密码 实时 发送