欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    基于单片机的保险箱c语言课程设计报告书.doc

    • 资源ID:43059378       资源大小:82.50KB        全文页数:31页
    • 资源格式: DOC        下载积分:9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于单片机的保险箱c语言课程设计报告书.doc

    #include <8051.h> #include <string.h> #include "vir_buzzer_cfg.h" #include"vir_buzzer.h" #include"vir_key_cfg.h" #include"vir_key.h" #include"vir_lock_cfg.h" #include"vir_lock.h" #include"vir_memory_cfg.h" #include"vir_memory.h" #include"vir_show.h" #include"buzzer.h" #include "delay_cfg.h" #include "delay.h" #include "lock.h" /* #include "i2c.h" */ #include"delay_cfg.h" #include"delay.h"#include"led_display_cfg.h"#include"led_display.h"#include"I2C_cfg.h" static void _zyI2cBitSend(void)if(ucData&0x80)_ZY_I2C_SDA=1;else_ZY_I2C_SDA=0;_ZY_I2C_DELAY();_ZY_I2C_SCL=1;_ZY_I2C_DELAY();_ZY_I2C_SCL=0;unsigned char _zyI2cBitReceive(void)unsigned char ucRt;_ZY_I2C_DELAY();_ZY_I2C_SCL=1;_ZY_I2C_DELAY();ucRt=_ZY_I2C_SDA;_ZY_I2C_SCL=0;return ucRt;static void _zyI2cStartSend(void)_ZY_I2C_DELAY();_ZY_I2C_SDA=0;_ZY_I2C_DELAY();_ZY_I2C_SCL=0;static void _zyI2cStopSend(void)_ZY_I2C_SDA=0;_ZY_I2C_DELAY();_ZY_I2C_SCL=1;_ZY_I2C_DELAY();_ZY_I2C_SDA=1; static void _zyI2cRestartSend(void)_ZY_I2C_SDA=1;_ZY_I2C_DELAY();_ZY_I2C_SCL=1;_ZY_I2C_DELAY();_ZY_I2C_SDA=0;_ZY_I2C_DELAY();_ZY_I2C_SCL=0;static void _zyI2cAckSend(void)_ZY_I2C_SDA=0;_ZY_I2C_DELAY();_ZY_I2C_SCL=1;_ZY_I2C_DELAY();_ZY_I2C_SCL=0;static void _zyI2cNakSend(void)_ZY_I2C_SDA=1;_ZY_I2C_DELAY();_ZY_I2C_SCL=1;_ZY_I2C_DELAY();_ZY_I2C_SCL=0;static char _zyI2cIsAck(void)_ZY_I2C_SDA=1;_ZY_I2C_DELAY();_ZY_I2C_SCL=1;_ZY_I2C_DELAY();if(_ZY_I2C_SDA=1)_ZY_I2C_SCL=0;return 0;_ZY_I2C_SCL=0;return 1;static void_zyI2cByteSend(unsigned char ucData)unsigned char i;i=8;do_zyI2cBitSend(ucData);ucData=ucData<<1;while(-i!=0);static unsigned char _zyI2cBitReceive(void)unsigned char ucRt;unsigned char i;ucRt=0;_ZY_I2C_SDA=1;i=8; do ucRt=(ucRt<<1)+_zyI2cBitReceive; while(-i!=0); return ucRt;void zyLedDisplayScan(void)static unsigned char ucIndex=0;/定义扫描位置索引静态变量/* * 关闭显示*/_ZY_LED_DIG1_OFF();/关闭数码管_ZY_LED_DIG2_OFF();_ZY_LED_DIG3_OFF();_ZY_LED_DIG4_OFF();_ZY_LED_DIG5_OFF();_ZY_LED_DIG6_OFF();/* *显示ucIndex位:将待显示数字字符的数值送到段选位控制I/O口*/_ZY_LED_SEG(GucZyLedDisplayShowBufucIndex);switch (ucIndex)case 0:_ZY_LED_DIG1_ON();/点亮数码管 1break;case 1:_ZY_LED_DIG2_ON();/点亮数码管 2break;case 2:_ZY_LED_DIG3_ON();/点亮数码管 3break;case 3:_ZY_LED_DIG4_ON();/点亮数码管 4break;case 4:_ZY_LED_DIG5_ON();/点亮数码管 5break;case 5:_ZY_LED_DIG6_ON();/点亮数码管 6break;default:break;/* * 准备显示下一位*/ucIndex+;if (ucIndex>=6)ucIndex=0;char zyI2cInit(void)_ZY_I2C_SCL=0;_zyI2cStopSend();return 0;unsigned char zyI2cWrite(unsigned char ucAddr, unsigned int uiRegAddr,unsigned char ucRegAddrLen,unsigned char *pucData,unsigned char ucDataLen)unsigned char i;if(ucDataLen=0|pucData=0)return 0;i=ucDataLen;_zyI2cStartSend();_zyI2cByteSend(ucAddr&0xfe);if(_zyI2IsAck()while(ucRegAddrLen>0)_zyI2cByteSend(uiRegAddr);if(!_zyI2IsAck()break;ucRegAddrLen-;uiRegAddr=uiRegAddr>>8;if(ucRegAddrLen=0)do_zyI2cByteSend(*pucData+);if(!_zyI2IsAck)break;while(-i!=0);_zyI2cStopSend();return(ucDataLen-i);unsigned char zyI2cRead(unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen, unsigned char *pucData, unsigned char ucDataLen)unsigned char i;if (ucDataLen=0|pucData=0)return 0;_zyI2cStartSend();_zyI2cByteSend(ucAddr&0xfe);if(_zyI2cIsAck()while(ucRegAddrLen>0)_zyI2cByteSend(uiRegAddr);if(!_zyI2cIsAck()break;ucRegAddrLen-;uiRegAddr=uiRegAddr>>8;if(ucRegAddrLen=0)_zyIc2RestartSend();_zyI2cByteSend(ucAddr|0x01);if(_zyI2cIsAck()i=ucDataLen-1;while(i-1=0)*pucData+=_zyI2cByteReceive();_zyI2cAckSend();*pucData=_zyI2cByteReceive();_zyI2cNakSend();elseucDataLen=0;_zyI2cStopSend();return ucDataLen; char zyLedDisplayInit(void)return 0;void zyLedDisplayScan(void)static unsigned char ucIndex=0;/定义扫描位置索引静态变量/* * 关闭显示*/_ZY_LED_DIG1_OFF();/关闭数码管_ZY_LED_DIG2_OFF();_ZY_LED_DIG3_OFF();_ZY_LED_DIG4_OFF();_ZY_LED_DIG5_OFF();_ZY_LED_DIG6_OFF();/* *显示ucIndex位:将待显示数字字符的数值送到段选位控制I/O口*/_ZY_LED_SEG(GucZyLedDisplayShowBufucIndex);switch (ucIndex)case 0:_ZY_LED_DIG1_ON();/点亮数码管 1break;case 1:_ZY_LED_DIG2_ON();/点亮数码管 2break;case 2:_ZY_LED_DIG3_ON();/点亮数码管 3break;case 3:_ZY_LED_DIG4_ON();/点亮数码管 4break;case 4:_ZY_LED_DIG5_ON();/点亮数码管 5break;case 5:_ZY_LED_DIG6_ON();/点亮数码管 6break;default:break;/* * 准备显示下一位*/ucIndex+;if (ucIndex>=6)ucIndex=0;/*延时驱动实现代码*/ /* * 全局变量定义 */ static unsigned int _GuiSum; /32位定时器高16位 static volatile unsigned char _GucTimerFlg; /32位定时器溢出标志 /* * Description: 延时初始化 */ char delayInit(void) TMOD=(TMOD & 0xf0)|0x01; ET0=1; return 0; /* * Description: 毫秒延时开始 */ char delayMsStart(unsigned int uiDly); unsigned long ulTmp1; unsigned int uiTmp2; /* * 获得定时器初始值 */ ulTmp1 =DELAY_CYCLES(uiDly); /计算需要的机器周期数 ulTmp1 = -ulTmp1; /加计数,所以取负 /* * 设置定时器初始值 */ uiTmp2 =ulTmp1 % 0x10000; /定时器低16位 TL0 = uiTmp2 % 256; TH0 = uiTmp2 / 256; _GuiSum =ulTmp1 / 0x10000; /定时器高16位 _GueTimerFlg=0; /清处溢出标志 TR0=1; /启动定时器 return 0; /* * Description: 检查延时是否结束 */ char delayMslsEnd(void); return _GueTimerFlg; /* * Description: 毫秒延时 */ char delayMs(unsigned int uiDly) /* * 开始延时 */ if (delayMsStart(uiDly)<0) return -1; /* * 等待延时结束 */ while (!delayMslsEnd() DELAY_HOOK(); return 0; /* * Description: Time0中断服务函数 */ void isrTimer0(void)_interrupt 1 if (+_GuiSum=0) _GuiTimerFlg=1; /设置溢出标志 TR0=0; /停止定时器 /* * Description: 锁初始化 */ char phyLockInit (void) /返回值:0成功;-1失败 _ZY_PHY_LOCK_INIT(); return 0; /* * Description: 关锁 */ char phyLockLock (void) /返回值:0成功;-1失败 _ZY_PHY_LOCK_LOCK(); return 0; /* * Description: 开锁 */ char phyLockUnlock (void) /返回值:0成功;-1失败 _ZY_PHY_LOCK_UNLOCK(); return 0; char virMemInit(void) return zyCat1024Init() unsigned char virMemRead(unsigned int uiAddr.char *pcData,unsigned char ucLen) if (uiAddr>=_ZY_VIR_MEMORY_SIZE) return 0; /*虚拟键盘驱动实现代码*/ char zyKeyGet(void) char ucRt; /返回键值unsigned char ucKeySum; /按键数目计数ucRt =-1;ucKeySum =0; /* * 将所有“列线”设置为输入状态 */_ZY_KEY_KC1_PIN=1;_ZY_KEY_KC2_PIN=1;_ZY_KEY_KC3_PIN=1;/* * 将所有“列线”设置为高电平 */ _ZY_KEY_KR1_PIN=1;_ZY_KEY_KR2_PIN=1;_ZY_KEY_KR3_PIN=1;_ZY_KEY_KR4_PIN=1;/* *扫描第一行*/_ZY_KEY_KR1_PIN=0;/将KR1清0if(_ZY_KEY_KC1_PIN=0)/如果kc1为0,说明k1键已经按下ucRt=0;/按键为0ucKeySum+;if(_ZY_KEY_KC2_PIN=0)/如果kc2为0,则说明k5按键已经按下ucRt=1;/键值为1ucKeySum+;if(_ZY_KEY_KC3_PIN=0)/如果kc3为0,则说明k9按键已经按下ucRt=2;/键值为2ucKeySum+;_ZY_KEY_KR1_PIN=1;/第一行扫描完毕,将kr1恢复为1/* * 扫描第二行*/_ZY_KEY_KR2_PIN=0;if(_ZY_KEY_KC1_PIN=0)ucRt=3;ucKeySum+;if(_ZY_KEY_KC2_PIN=0)ucRt=4;ucKeySum+;if(_ZY_KEY_KC3_PIN=0)ucRt=5;ucKeySum+;_ZY_KEY_KR2_PIN=1;/* * 扫描第三行*/_ZY_KEY_KR3_PIN=1;if(_ZY_KEY_KC1_PIN=0)ucRt=6;ucKeySum+;if(_ZY_KEY_KC2_PIN=0)ucRt=7;ucKeySum+;if(_ZY_KEY_KC3_PIN=0)ucRt=8;ucKeySum+;_ZY_KEY_KR3_PIN=1;/* * 扫描第四行*/_ZY_KEY_KR4_PIN=1;if(_ZY_KEY_KC1_PIN=0)ucRt=9;ucKeySum+;if(_ZY_KEY_KC2_PIN=0)ucRt=10;ucKeySum+;if(_ZY_KEY_KC3_PIN=0)ucRt=11;ucKeySum+;_ZY_KEY_KR4_PIN=1;/* * 超过一个按键,返回-1*/if(ucKeySum!=1)return-1;return ucRt; /返回键值 static code char_GcKeyTable= /按键转换表 #,0,*,9,8,7,6,5,4,3,2,1,0 ; /* * Description: 获得按键的ASC码,没有按键一直等待 * Returned value: 键的ASC码 */ static char _virKeyGet1(void) /返回值:键的ASC码 char cTmp1,cTmp2; /* *等待按键释放 */ while (1) while (zyKeyGet()>=0) /无键闭合,退出 delayMs(10);/4.12 /* *去抖 */ delayMs(10); if (zyKeyGet()<0) /两次状态一致,去抖成功 break; /* *等待按键闭合 */ while (1) while(1) cTmp1=zyKeyGet() /获得按键状态 if (cTmp1>=0) /有按键闭合,退出 break; delayMs(10); /* *去抖 */ delayMs(10); cTmp2=zyKeyGet(); /两次按键状态一样,去抖成功 if (cTmp2=cTmp1) break; cTmp1=_GcKeyTablecTmp1; /键码转换成ASC码 return cTmp1; /* * Description: 在指定时间获得按键的ASC码 */ static char _virKeyGet2(unsigned int uiDly) /uiDly:以毫秒为单位,设定最大等待时间,0为无穷等待 char cTmp1,cTmp2; unsigned char I;/4.13 delayMsStart(uiDly); /* *等待按键释放 */ while (1) while (zyKeyGet()>=0) /无键闭合,退出 zyLedDisplayScan(); /代替延时 if(delayMslsEnd() /超时则返回 return -1; /* *去抖 */ for(i=0;i<50;i+) zyLedDisplayScan(); /代替延时 if (delayMslsEnd() /超时则返回 return -1; if (zyKeyGet()<0) /两次状态一致,去抖成功 break; /* *等待按键闭合 */ while (1) while(1) cTmp1=zyKeyGet() /获得按键状态 if (cTmp1>=0) /有按键闭合,退出 break; zyLedDisplayScan(); /代替延时 if (delayMslsEnd() /超时则返回 return -1; /* *去抖 */ for(i=0;i<50;i+) zyLedDisplayScan(); /代替延时 if (delayMslsEnd() /超时则返回 return -1; cTmp2=zyKeyGet(); /两次按键状态一样,去抖成功 if (cTmp2=cTmp1) break; cTmp1=_GcKeyTablecTmp1; /键码转换成ASC码 return cTmp1; /4.14 /* * Description: 虚拟键盘模块初始化 */ char virKeyInit(void)

    注意事项

    本文(基于单片机的保险箱c语言课程设计报告书.doc)为本站会员(知****量)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开