单片机保险箱c语言课程方案_第1页
单片机保险箱c语言课程方案_第2页
单片机保险箱c语言课程方案_第3页
单片机保险箱c语言课程方案_第4页
单片机保险箱c语言课程方案_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#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"staticvoid 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。}unsignedchar__zyI2cBitReceive(void>{unsignedcharucRt。__ZY_I2C_DELAY(>。__ZY_I2C_SCL=1。__ZY_I2C_DELAY(>。ucRt=__ZY_I2C_SDA。__ZY_I2C_SCL=0。returnucRt。}staticvoid__zyI2cStartSend(void>__ZY_I2C_DELAY(>。__ZY_I2C_SDA=0。__ZY_I2C_DELAY(>。__ZY_I2C_SCL=0。}staticvoid__zyI2cStopSend(void>{__ZY_I2C_SDA=0。__ZY_I2C_DELAY(>。__ZY_I2C_SCL=1。__ZY_I2C_DELAY(>。__ZY_I2C_SDA=1。}staticvoid__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。}staticvoid__zyI2cAckSend(void>{__ZY_I2C_SDA=0。__ZY_I2C_DELAY(>。__ZY_I2C_SCL=1。__ZY_I2C_DELAY(>。__ZY_I2C_SCL=0。}staticvoid__zyI2cNakSend(void>{__ZY_I2C_SDA=1。__ZY_I2C_DELAY(>。__ZY_I2C_SCL=1。__ZY_I2C_DELAY(>。__ZY_I2C_SCL=0。}staticchar__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。return0。}__ZY_I2C_SCL=0。return1。}staticvoid__zyI2cByteSend(unsignedcharucData>{unsignedchari。i=8。do{__zyI2cBitSend(ucData>。ucData=ucData<<1。}while(--i!=0>。}staticunsignedchar__zyI2cBitReceive(void>{unsignedcharucRt。unsignedchari。ucRt=0。__ZY_I2C_SDA=1。i=8。do{ucRt=(ucRt<<1>+__zyI2cBitReceive。}while(--i!=0>。returnucRt。}voidzyLedDisplayScan(void>{staticunsignedcharucIndex=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(~GucZyLedDisplayShowBuf[ucIndex]>。switch(ucIndex>{case0:__ZY_LED_DIG1_ON(>。break。__ZY_LED_DIG2_ON(>。break。__ZY_LED_DIG3_ON(>。break。__ZY_LED_DIG4_ON(>。break。__ZY_LED_DIG5_ON(>。break。__ZY_LED_DIG6_ON(>。break。default:break。}/**准备显示下一位//点亮数码管1////点亮数码管1//点亮数码管2//点亮数码管3//点亮数码管4//点亮数码管5//点亮数码管6if(ucIndex>=6>{ucIndex=0。}}charzyI2cInit(void>{__ZY_I2C_SCL=0。__zyI2cStopSend(>。return0。}unsignedcharzyI2cWrite(unsignedcharucAddr,unsignedintuiRegAddr,unsignedcharucRegAddrLen,unsignedchar*pucData,unsignedcharucDataLen>unsignedchari。if(ucDataLen==0||pucData==0>{return0。}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>。}unsignedcharzyI2cRead(unsignedcharucAddr,unsignedintuiRegAddr,unsignedcharucRegAddrLen,unsignedchar*pucData,unsignedcharucDataLen>{unsignedchari。if(ucDataLen==0||pucData==0>{return0。}__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(>。}}}else{ucDataLen=0。}__zyI2cStopSend(>。returnucDataLen。}charzyLedDisplayInit(void>{return0。}voidzyLedDisplayScan(void>{staticunsignedcharucIndex=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口*/////点亮数码管1//点亮数码管2//点亮数码管3//点亮数码管4//点亮数码管5//点亮数码管6__ZY_LED_SEG(~GucZyLedDisplayShowBuf[ucIndex]>。switch(ucIndex>{case0:__ZY_LED_DIG1_ON(>。break。__ZY_LED_DIG2_ON(>。break。__ZY_LED_DIG3_ON(>。break。__ZY_LED_DIG4_ON(>。break。__ZY_LED_DIG5_ON(>。break。__ZY_LED_DIG6_ON(>。break。default:break。}/**准备显示下一位*/ucIndex++。if(ucIndex>=6>{ucIndex=0。}}/****延时驱动实现代码***/**全局变量定义********************************************************************************/staticunsignedint _GuiSum。 //32位定时器高16位staticvolatileunsignedchar_GucTimerFlg。 //32位定时器溢出标志**Description: 延时初始化********************************************************************************/chardelayInit(void>{TMOD=(TMOD&0xf0>|0x01。ET0=1。**Description: 延时初始化********************************************************************************/chardelayInit(void>{TMOD=(TMOD&0xf0>|0x01。ET0=1。return0。}****Description: 毫秒延时开始*/chardelayMsStart(unsignedintuiDly>。{unsignedlongulTmp1。unsignedintuiTmp2。/**获得定时器初始值*/ulTmp1=DELAY_CYCLES(uiDly>。ulTmp1=-ulTmp1。/**设置定时器初始值//计算需要的机器周期数//加计数,所以取负*/uiTmp2TL0TH0=ulTmp1%0x10000。=uiTmp2%256。=uiTmp2/256。//定时器低16位_GuiSum=ulTmp1/0x10000。_GueTimerFlg=0。TR0=1;return0;}//定时器高16位//清处溢出标志//启动定时器**Description:检查延时是否结束********************************************************************************/chardelayMslsEnd(void>。{return_GueTimerFlg。}**Description: 毫秒延时********************************************************************************/chardelayMs(unsignedintuiDly>{/**开始延时*/if(delayMsStart(uiDly><0>{return-1。}/**等待延时结束*/while(!delayMslsEnd(>>{DELAY_HOOK(>。}return0。}**Description:TimeO中断服务函数********************************************************************************/voidisrTimer0(void>_interrupt1{if(++_GuiSum==0>{_GuiTimerFlg=1。 //设置溢出标志TR0=0。 //停止定时器}}**Description:锁初始化********************************************************************************/charphyLockInit(void> //返回值:0成功;-1失败{_ZY_PHY_LOCK_INIT(>。return0。}**Description: 关锁********************************************************************************/charphyLockLock(void> //返回值:0成功;-1失败{_ZY_PHY_LOCK_LOCK(>。return0。 }**Description: 开锁********************************************************************************/charphyLockUnlock(void> //返回值:0成功;-1失败{_ZY_PHY_LOCK_UNLOCK(>。return0。}charvirMemInit(void>{returnzyCat1024Init(>}unsignedcharvirMemRead(unsignedintuiAddr.char*pcData,unsignedcharucLen>{if(uiAddr>=_ZY_VIR_MEMORY_SIZE>{return0。}/***虚拟键盘驱动实现代码***/charzyKeyGet(void>

charucRt。 //返回键值unsignedcharucKeySum。 //按键数目计数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。0if(_ZY_KEY_KC1_PIN==0>{明k1键已经按下ucRt=0。键为0ucKeySum++。}if(_ZY_KEY_KC2_PIN==0>{说明k5按键已经按下ucRt=1。值为1ucKeySum++。}if(_ZY_KEY_KC3_PIN==0>{说明k9按键已经按下ucRt=2。值为2ucKeySum++。}_ZY_KEY_KR1_PIN=1。描完毕,将kr1恢复为1/*〃将KR1〃将KR1清//如果kc1为0,说//按//如果kc2为0,则//键//如果kc3为0,则//键//第一行扫}}*/_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。}returnucRt。 //返回键值}staticcodechar_GcKeyTable[]={ //按键转换表‘#’,’0’,’*’,’9’,’8’,’7’,’6’,’5’,’4’,’3’,’2’,’1’,0}。**Description: 获得按键的ASCII码,没有按键一直等待**Returnedvalue:键的ASCII码*/staticchar_virKeyGet1(void>{charcTmp1,cTmp2。/**等待按键释放*/while(1>{while(zyKeyGet(>>=0>{delayMs(10>。〃返回值:键的ASCI码//无键闭合,退出//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=_GcKeyTable[cTmp1]。returncTmp1。}//获得按键状态//有按键闭合,退出//两次按键状态一样,去抖成功〃键码转换成ASCII码**Description: 在指定时间内获得按键的ASCII码********************************************************************************/staticchar_virKeyGet2(unsignedintuiDly>〃uiDly:以毫秒为单位,设定最大等待时间,0为无穷等待{charcTmp1,cTmp2。unsignedcharI。//4.13delayMsStart(uiDly>。/**等待按键释放*///无键闭合,退出////无键闭合,退出//代替延时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=_GcKeyTable[cTmp1]。 〃键码转换成ASCII码returncTmp1。}//4.14**Description: 虚拟键盘模块初始化********************************************************************************/charvirKeyInit(void>{returnzyKeyInit(>}**Description: 获得按键的ASCII码********************************************************************************/charvirKeyGet(unsignedintuiDly> //uiDly:以毫秒为单位,设定最大等待时间,0为无穷等待{if(uiDly==0>{return_virKeyGet1(>。}return_virKeyGet2(uiDly>。}charphyBuzzerInit(void>{TMOD=(TMOD%0x0f>|0x10。TR1=0。TF1=0。ET1=1。PT1=1。return0。}charphyBuzzerTweet(unsignedintuiFreq>{unsignedintuiTimer1Load。if(uiFreq<20>{uiFreq=20。}if(uiFreq>20000>{uiFreq=20000。}uiTimer1Load =0x10000-(OSC/12>/(uiFreq*2>。__GucTimerHightLoad=uiTimer1Load/0x100。__GucTimerlowtLoad=uiTimer1Load%0x100。TR1=0。TH1=uiTimer1Load/0X100。TL1=uiTimer1Load%0X100。TR1=1。return0。}charphyBuzzerStop(void>{TR1 =0。TF1=0。__ZY_BUZZER_PIN=1。return0。}/****虚拟蜂鸣器驱动实现代码******/**Description: 虚拟蜂鸣器初始化********************************************************************************/charvirBuzzerInit(void>{returnphyBuzzerInit(>。}**Description: 控制蜂鸣器鸣叫********************************************************************************/charvirBuzzerTweet(unsignedcharucMod>{switch(ucMod>{caseVIR_BUZZER_STOP。phyBuzzerStop(>。break。caseVIR_BUZZER_SHORT。phyBuzzerTweet(_ZY_BUZZER_HZ>。delayMs(100>。phyBuzzerStop(>。delayMs(100>。break。caseVIR_BUZZER_TWO_SHORT。phyBuzzerTweet(_ZY_BUZZER_HZ>。delayMs(100>。phyBuzzerStop(>。delayMs(100>。phyBuzzerTweet(_ZY_BUZZER_HZ>。delayMs(100>。phyBuzzerStop(>。delayMs(100>。break。caseVIR_BUZZER_LONG。phyBuzzerTweet(_ZY_BUZZER_HZ>。delayMs(500>。phyBuzzerStop(>。delayMs(100>。break。defaultbreak。}return0。}/****虚拟显示器驱动实现代码******/staticcodeunsignedchar__GucShowTable[][2]={ //显示字库{'0',0x3f},{'1',0x06},{'2',0x5b},{'3',0x4f},{'4',0x66},{'5',0x6d},{'6',0x7d},{'7',0x07},{'8',0x7f},{'9',0x6f},{'A',0x77},{'B',0x7c},{'C',0x39},{'D',0x5e},{'E',0x79},{'F',0x71},{'a',0x77},{'b',0x7c},{'c',0x39},{'d',0x5e},{'e',0x79},{'f',0x71},{'O',0x3f},{'R',0x50},{'P',0x73},{'N',0x37},{'-',0x40},{'o',0x3f},{'r',0x50},{'p',0x73},{'n',0x37},{'',0x00},{'\011',0x00},{0x00,0x00}}。**Description: 虚拟显示器初始化*/charvirShowInit(void>{returnzyLedDisplayInit(>。 }**Description: 输出字符串********************************************************************************/charvirShowPuts(char*pcStr>//将程序清单1.40拷贝在这里,仅需修改函数名{chari。unsignedcharj。if(pcStr==NULL>{return-1。}for(i=0。i<6。i++>{if(*pcStr==0>{GucZyLedDisplayShowBuf[i]=0。 //如果字符串中的字符为0,则将显示缓冲区清0continue。 //提前结束本次循环}/**小数点单独处理:在当前位置显示小数点*/if(*pcStr=='.'>{i--。GucZyLedDisplayShowBuf[i]=GucZyLedDisplayShowBuf[i]|0x80。}else{/**查找显示字库*/for(j=0。__GucShowTable用[0]!=0。j++>{if(*pcStr==(char>__GucShowTable[j][0]>{/**显示字符:将待显示字符的数值赋给显示缓冲区*///终GucZyLedDisplayShowBuf[i]=__GucShowTable[j][1]//终break。止循环,使流程跳出循环体}pcStr++。//指向字符串的下一个字符}return0。}**Description:清屏********************************************************************************/charvirShowClr(void> //将程序清单1.41拷贝在这里,仅需修改函数名即可{memset(GucZYLedDisplayShowBuf,0,6>。return0。}/***虚拟存储器驱动实现代码**********/charvirMemInit(void>{returnzyCat1024Init(>}unsignedcharvirMemRead(unsignedintuiAddr.char*pcData,unsignedcharucLen>{if(uiAddr>=_ZY_VIR_MEMORY_SIZE>{return0。}/**调整读取数据数目*/if((uiAddr+ucLen>>=_ZY_VIR_MEMORY_SIZE>{ucLen=_ZY_VIR_MEMORY_SIZE-uiAddr。}returnzyCat1024Read(uiAddr,(unsignedchar*>pcData,ucLen>。}charvirMemWrite(unsignedintuiAddr,char*pcData,unsignedcharucLen>{if(uiAddr>=_ZY_VIR_MEMORY_SIZE>{return0。}/*

*/if((uiAddr+ucLen>>=_ZY_VIR_MEMORY_SIZE>{ucLen=_ZY_VIR_MEMORY_SIZEuiAddr。}returnzyCat1024Write(uiAddr,(uisignedchar*>pcData,ucLen>。}*全局变量定义//缓冲区////缓冲区//密码staticchar _GePassword[7]。**Description: 打开保险箱*Returnedvalue:0——密码输入正确* 1——超时* -1——密码输入错误********************************************************************************/staticchar_hmiBoxOpen(void>{unsignedchari,j。charcTmp1。for(i=0。i<3。i++>{/**显示初始画面*/stcpy(_GeHmiBuf,” ”>。 //C标准库函数virShowPuts(_GetHmiBuf>。/**输入密码*/j=0。while(1>{cTmp1=virKeyGet(15*1000>。if(cTmp1<0>{/**超时*/return1。

if(cTmp1==‘*’if(cTmp1==‘*’>{if(j>0>{j--。}_GeHmiBuf[j]=‘-’。}else{_GeHmiBuf[j]=cTmp1。j++。}if(cTmp1==‘#’>{break。}/**第7个字符必须为‘#’*/if(j==7&&cTmp1!=‘#’>{j--。_GeHmiBuf[6]=0。continue。}/**提示用户字符输入完成*/virShowPuts(_GeHmiBuf>。//‘*’为删除键//保存输入的字符//密码输入完毕virBuzzerTweet(VIR_BUZZER_SHORT>。}/**校验密码*/virMemRead(USER_PASSWORD_ADDR,_GePassword,7>。if(_GePassword[0]==(char>0xff>{//cat1024未保存密码memcpy(_GePassword,“123456#”,7>。 //默认密码为“123456}if(memcmp(_GePassword,_GeHmiBuf,j>==0>{ //比较密码/**开锁*/virShowPuts(“OPEN”>。virBuzzerTweet(VIR_BUZZER_LOGN>。virLockUnlock(0>。return0。}/**密码错误*/if(i<2>{virShowPuts(“error”>。virBuzzerTweet(VIR_BUZZER_TWO_SHORT>。delay

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论