2024-09-01
售卖作品
00

在这里插入图片描述

c
#include "reg52.h" #include <intrins.h> #include <string.h> #include <stdio.h> #include <stdlib.h> /* * 大概就是,做一个电子时钟,然后加四个独立按键, * K1按一次设置闹钟的秒,两次设置闹钟的分,三次设置闹钟的时, * 然后四次修改时间的秒,五次修改时间的分,六次改时间的时这样 * * K2是加一,K3是减一 * * K4是关闹钟 定时器实现时钟送PC机显示独立键盘设置时间 要求; 筒易时钟。并送PC机上湿示,当前时间可以通过独立键盘来没置;整点提醒、定时闹钟 需要keil c语言程序(注释),proteus仿真图 * */ #define uchar unsigned char #define uint unsigned int #define u8 unsigned char #define u16 unsigned int char rtc_hour = 23; char rtc_min = 59; char rtc_sec = 55; char rtc_hour_al = 1; /* 闹钟 */ char rtc_min_al = 0; char rtc_sec_al = 1; unsigned char num2 = 0; /* 计数 */ u8 ItemsNum = 0; /*按键改变项目 */ char *ALLtime[] = { &rtc_hour, &rtc_min, &rtc_sec, &rtc_hour_al, &rtc_min_al, &rtc_sec_al }; /* 指针便于调用 */ u8 openAlarm = 1; /* 打开或者关闭闹钟 */ u8 alarmifg = 0; u8 alarm_shijian = 0; sbit key_01 = P2 ^ 1; sbit key_02 = P2 ^ 2; sbit key_03 = P2 ^ 3; sbit key_04 = P2 ^ 4; sbit key_05 = P2 ^ 5; sbit BEEP = P3 ^ 6; /********************************************************************************* * 【函 数 名】: void send_cmd(unsigned char dat) * 【功 能】: 串口发送数据命令 **********************************************************************************/ void send( unsigned char dat ) { SBUF = dat; /* 发送指令到SBUF */ while ( !TI ) ; /* 等待发送结束 */ TI = 0; /* 清除结束标志,以便再发送数据 */ } /********************************************************************************* * 【函 数 名】: Print_Str(unsigned char *s) * 【功 能】: 串口发送 一个字符串 **********************************************************************************/ void Print_Str( unsigned char *s ) { while ( *s != '\0' ) { send( *s++ ); } } #define FSOC 11059200L //晶振 #define BAUD 9600 //波特率 /********************************************************************************* * 【函 数 名】: void SerInit(void) * 【功 能】: 串口初始化程序 设置波特率为9600 **********************************************************************************/ void SerInit( void ) { SCON = 0x50; /* 010 1 0000B,工作方式1, 8位UART,波特率可变,允许接收 */ TMOD = 0x20; /* T1工作于方式2 */ TCON = 0x40; /* 定时器1开始计数 */ TH1 = -(FSOC/BAUD/12/16); /* T1计数初值 */ TL1 = -(FSOC/BAUD/12/16); PCON = 0x80; /* SMOD置1,双倍速率 */ RI = 0; TI = 0; ES = 0; /* 关闭串口中断 */ } /* 闹钟函数 */ void BeepAlarm() { unsigned char beeptime = 0; int cycl = 1000; while ( cycl-- ) { BEEP = !BEEP; for ( beeptime = 0; beeptime < 5; beeptime++ ) ; } BEEP = 1; } /* 延时函数 */ void delay_ms_key( unsigned char t ) /* 延时xms */ { unsigned char ttt; while ( t-- ) { for ( ttt = 0; ttt < 125; ttt++ ) ; } } /* * 四个按键的检测函数 * 按键则返回1 2 3 4 * 无按键则返回0xff */ unsigned char KeySscan( void ) { unsigned char keyvaluee = 0xff; if ( key_01 == 0 ) { delay_ms_key( 10 ); if ( key_01 == 0 ) { while ( key_01 == 0 ) ; return(1); } } if ( key_02 == 0 ) { delay_ms_key( 10 ); if ( key_02 == 0 ) { while ( key_02 == 0 ) ; return(2); } } if ( key_03 == 0 ) { delay_ms_key( 10 ); if ( key_03 == 0 ) { while ( key_03 == 0 ) ; return(3); } } if ( key_04 == 0 ) { delay_ms_key( 10 ); if ( key_04 == 0 ) { while ( key_04 == 0 ) ; return(4); } } if ( key_05 == 0 ) { delay_ms_key( 10 ); if ( key_05 == 0 ) { while ( key_05 == 0 ) ; return(5); } } return(0xff); } /* 显示时间 */ void displaytime() { u8 disp[15]; u8 count = 0; disp[count++] = rtc_hour / 10 + '0'; disp[count++] = rtc_hour % 10 + '0'; disp[count++] = ':'; disp[count++] = rtc_min / 10 + '0'; disp[count++] = rtc_min % 10 + '0'; disp[count++] = ':'; disp[count++] = rtc_sec / 10 + '0'; disp[count++] = rtc_sec % 10 + '0'; disp[count++] = 0; Print_Str( disp ); Print_Str("\r\n");//发送换行符号 便于看 } /* 显示闹钟 */ void displayAlarm() { u8 disp[15]; u8 count = 0; disp[count++] = rtc_hour_al / 10 + '0'; disp[count++] = rtc_hour_al % 10 + '0'; disp[count++] = ':'; disp[count++] = rtc_min_al / 10 + '0'; disp[count++] = rtc_min_al % 10 + '0'; disp[count++] = ':'; disp[count++] = rtc_sec_al / 10 + '0'; disp[count++] = rtc_sec_al % 10 + '0'; disp[count++] = 0; Print_Str( disp ); Print_Str("\r\n");//发送换行符号 便于看 } /********************************************************************************* * * 定时器中断 **********************************************************************************/ void T1_time() interrupt 1 { TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; num2++; if ( num2 == 20 ) { displaytime(); /* 发送时间显示 */ num2 = 0; rtc_sec++; /* 闹钟响声判定 */ if ( openAlarm == 1 ) /* 打开了闹钟 */ { if ( *ALLtime[0] == *ALLtime[3] ) /* 判定时间一样不一样 */ { if ( *ALLtime[1] == *ALLtime[4] ) { if ( *ALLtime[2] == *ALLtime[5] ) { alarmifg = 1; } } } } if ( alarmifg == 1 ) /* 闹钟开始响了 */ { alarm_shijian++; } if ( rtc_sec == 60 ) { rtc_sec = 0; rtc_min++; if ( rtc_min == 60 ) { rtc_min = 0; //整点报时 //alarmifg = 1;//打开蜂鸣器 Print_Str("zheng dian bao shi "); Print_Str("\r\n");//发送换行符号 便于看 rtc_hour++; if ( rtc_hour == 24 ) { rtc_hour = 0; } } } } } void delay_ms( unsigned int t ) /* 延时xms */ { unsigned char ttt; while ( t-- ) { for ( ttt = 0; ttt < 125; ttt++ ) ; } } /********************************************************************************* * * 主函数 **********************************************************************************/ void main( void ) { u8 key = 0xff; SerInit(); TMOD |= 0x01; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; EA = 1; ET0 = 1; TR0 = 1; /* LCD_write_com(0x0c); //关光标,闪烁 */ while ( 1 ) { key = KeySscan(); if ( key != 0xff ) { if ( key == 1 ) { ItemsNum = (ItemsNum + 1) % 7; if(ItemsNum==0) { Print_Str("Settings have been saved and exited\r\n"); }else if(ItemsNum==1) { Print_Str("Set Clock hours\r\n"); }else if(ItemsNum==2) { Print_Str("Set Clock minutes, \r\n"); }else if(ItemsNum==3) { Print_Str("Set Clock seconds\r\n"); }else if(ItemsNum==4) { Print_Str("Set Alarm clock hours \r\n"); }else if(ItemsNum==5) { Print_Str("Set Alarm clock minutes, \r\n"); }else if(ItemsNum==6) { Print_Str("Set Alarm clock seconds\r\n"); } } else if ( key == 2 ) /* 加法 */ { *ALLtime[ItemsNum - 1] = *ALLtime[ItemsNum - 1] + 1; } else if ( key == 3 ) /* 减法 */ { *ALLtime[ItemsNum - 1] = *ALLtime[ItemsNum - 1] - 1; } else if ( key == 4 ) /* 关闭或者打开闹钟 */ { openAlarm = !openAlarm; if ( openAlarm == 0 ) /* 恢复闹钟功能 */ { alarmifg = 0; alarm_shijian = 0; } } else if ( key == 5 ) /* 保存并退出设置 */ { ItemsNum=0; Print_Str("Settings have been saved and exited\r\n"); } /* 增加时间界限 */ if ( *ALLtime[0] == 24 ) { *ALLtime[0] = 0; } else if ( *ALLtime[1] == 60 ) { *ALLtime[1] = 0; } else if ( *ALLtime[2] == 60 ) { *ALLtime[2] = 0; } if ( *ALLtime[0] == -1 ) { *ALLtime[0] = 23; } else if ( *ALLtime[1] == -1 ) { *ALLtime[1] = 59; } else if ( *ALLtime[2] == -1 ) { *ALLtime[2] = 59; } /* 增加闹钟界限 */ if ( *ALLtime[3] == 24 ) { *ALLtime[3] = 0; } else if ( *ALLtime[4] == 60 ) { *ALLtime[4] = 0; } else if ( *ALLtime[5] == 60 ) { *ALLtime[5] = 0; } if ( *ALLtime[3] == -1 ) { *ALLtime[3] = 23; } else if ( *ALLtime[4] == -1 ) { *ALLtime[4] = 59; } else if ( *ALLtime[5] == -1 ) { *ALLtime[5] = 59; } /* 无论按哪一个按键 我们都要刷新显示 */ if ( ItemsNum <= 3 ) { displaytime(); } else { displayAlarm(); } /* 控制游标 */ if ( ItemsNum == 0 ) { TR0 = 1; /* 开启时钟 */ } else { TR0 = 0; /* 关闭时钟 */ } key = 0xff; } /* 闹钟 */ if ( alarmifg == 1 ) { BeepAlarm(); /* 闹钟想 */ if ( alarm_shijian > 5 ) /* 响一会后关闭闹钟 alarm_shijian在定时器中自加 */ { alarmifg = 0; alarm_shijian = 0; } } } }
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!