基于单片机的秒表设计.docx_第1页
基于单片机的秒表设计.docx_第2页
基于单片机的秒表设计.docx_第3页
基于单片机的秒表设计.docx_第4页
基于单片机的秒表设计.docx_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

/* 操作描述:* 1.按Switch键可以启动或停止秒表走表,首次按会清零记录次数* 2.秒表走表期间,按RecorRead按键可以记录当前时间(不影响秒表走表)* 3.按Reset键,表值清零,按RecordRead键可以回读此前记录的对应次数与时间* 4.按TimeMove进入秒表时间设置模式,连按可以移动光标到对应位(限秒以上),* 只在该模式下按TimeUp键才可以累加数值,该模式下按Switch可以开始计时,* 按Reset可以退出,计时到设定值后声光提示* 时间:2016-04-19*/* 硬件描述:* 主芯片:stc89c51* 显示器件:lcd1602* 时间:2016-04-19*/#include #include #define uchar unsigned char#define uint unsigned int #define DelayNOP() _nop_();_nop_();_nop_();_nop_();#define timer0_DISABLE() TR0 = 0 /关闭定时器0#define timer0_ENABLE() TR0 = 1/开启定时器0bit LCD_Busy_Check();void LCD_Initialize();void LCD_Set_POS(uchar);void LCD_Write_Command(uchar);void LCD_Write_Data(uchar);void Display_String(uchar*str,uchar LineNo);void LCD1602_Display(); sbit Key_Switch = P10;/秒表启动与停止按键sbit Key_Reset = P11;/秒表复位清零按键sbit Key_RecordRead = P12;/记录时间与回读sbit Key_TimeMove = P13;/时间设置光标移动sbit Key_TimeUp = P14;/时间设置增加sbit LCD_RS = P20;sbit LCD_RW = P21;sbit LCD_EN = P22;sbit BEEP_LED = P27;bit KeySwitch = 0;bit TimeSetMode = 0;bit TimeMode = 0;uchar KeyRecord = 0;/uchar KeyTimeNum =0;uint KeyTimeSet = 0;uint onems = 0;const uchar code msg11016 =Record Mum 0,Record Mum 1,Record Mum 2,Record Mum 3,Record Mum 4,Record Mum 5,Record Mum 6,Record Mum 7,Record Mum 8,Record Mum 9,;const uchar code msg216 = TimerMode ;uchar Time_Buffer = 0,0,0,0;uchar TimeSet_Buffer = 0,0,0,0,;uchar LCD_Display_Buffer = 00:00:00:00; /该数组有7个元素4个00+3个:/* | | | | | |1hour_ | | |1min_ | |1s_ |10ms_ 数组排列与显示顺序相反*/uchar Time_Read104= 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,;/*毫秒延时函数*/void DelayMS(uint ms) uchar t; while(ms-) for (t=0;t 5) TimeSet_Buffer1 = TimeSet_Buffer1 % 10;/十位数清零,保留个位数 break;/*min设置*/ case 3: TimeSet_Buffer2 = TimeSet_Buffer2 + 1; if(TimeSet_Buffer2 % 10 = 0 ) TimeSet_Buffer2 = TimeSet_Buffer2 % 10;break; case 4: TimeSet_Buffer2 = TimeSet_Buffer2 + 10;if(TimeSet_Buffer2 / 10 5) TimeSet_Buffer2 = TimeSet_Buffer2 % 10; break; /*hour设置*/ case 5: TimeSet_Buffer3 = TimeSet_Buffer3 + 1;if(TimeSet_Buffer3 % 10 = 0 ) TimeSet_Buffer3 = TimeSet_Buffer3 % 10; break;case 6: TimeSet_Buffer3 = TimeSet_Buffer3 + 10;if(TimeSet_Buffer3 / 10 9) TimeSet_Buffer3 = TimeSet_Buffer3 % 10; break; default: break; for(i=0;i4;i+) Time_Bufferi = TimeSet_Bufferi; void main() uchar i,KeyReset; uchar times; IE =0x82; TMOD = 0x01; TH0 = (65536- 1000) / 256; TL0 = (65536- 1000) % 256; LCD_Initialize(); Display_String(msg10,0x00); while(1) /*开关键*/ if( Key_Switch = 0 ) DelayMS(10); KeySwitch = KeySwitch; KeyReset = 0; if(TimeSetMode=1) KeyTimeSet = 0; TimeSetMode= 0; TimeMode = 1; for(i=0;i4;i+) Time_Bufferi = 0; DelayMS(1); if(KeySwitch = 0 ) timer0_DISABLE(); else timer0_ENABLE(); while (Key_Switch = 0); /*复位键*/ else if(Key_Reset = 0) DelayMS(10); timer0_DISABLE(); times = KeyRecord; KeyReset = 1; KeyRecord = 0; KeySwitch = 0; TimeSetMode= 0; KeyTimeSet = 0; BEEP_LED = 1; for(i=0;i4;i+) Time_Bufferi = 0; Display_String(msg1times,0); while (Key_Reset = 0); /*记录及回读键*/ else if(Key_RecordRead = 0) if(KeySwitch = 1) for(i=0;i4;i+) Time_ReadKeyRecordi = Time_Bufferi; KeyRecord+; if(KeyRecord = 10) KeyRecord = 0; else if(KeySwitch = 0) DelayMS(10); if(KeyReset = 1) for(i=0;i times) KeyRecord = 0;if(KeyRecord = 10) KeyRecord = 0; Display_String(msg1KeyRecord,0);while (Key_RecordRead = 0); /*光标移动键*/ else if(Key_TimeMove = 0) DelayMS(10); TimeSetMode = 1;/ KeyTimeSet+; if(KeyTimeSet 6) KeyTimeSet = 1; Display_String(msg2,0); while (Key_TimeMove = 0); /*时间值设定键*/ else if(Key_TimeUp = 0) DelayMS(10); if(TimeSetMode = 1) TimeChange(); while (Key_TimeUp = 0); TimeSet(); LCD1602_Display(); /*lcd1602显示当前时间函数*/void LCD1602_Display() uchar i; LCD_Set_POS(0x40); for(i=3;i != 0xff;i-) LCD_Display_Buffer2*i+1 = Time_Bufferi / 10 + 0; LCD_Display_Buffer2*i = Time_Bufferi % 10 + 0; LCD_Write_Data( LCD_Display_Buffer2*i+1 ); LCD_Write_Data( LCD_Display_Buffer2*i );if(i0) LCD_Write_Data(:); /*LCD1602初始化*/void LCD_Initialize() DelayMS(5); LCD_Write_Command(0x38); DelayMS(5); LCD_Write_Command(0x0c); DelayMS(5); LCD_Write_Command(0x06); DelayMS(5); LCD_Write_Command(0x01); DelayMS(5);/*LCD1602显示位置*/void LCD_Set_POS(uchar Position) LCD_Write_Command(Position | 0x80);/*LCD1602显示字符串*/void Display_String(uchar*str,uchar LineNo) uchar k; LCD_Set_POS(LineNo); for (k=0;k16;k+) LCD_Write_Data (strk); /*LCD1602忙状态检测*/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;/*LCD1602写命令*/void LCD_Write_Command(uchar cmd) while (LCD_Busy_Check(); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_

温馨提示

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

评论

0/150

提交评论