#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 intchar    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;}}}
}

51单片机 Proteus仿真 时钟 串口 发送时钟 整点报时相关推荐

  1. 51单片机Proteus仿真

    这里分享一些关于51单片机的Proteus仿真.部分仿真来源于网络整理.有需要可以看看. 51单片机Proteus仿真入门实验:https://mp.weixin.qq.com/s/6kgAWSqeY ...

  2. 51单片机Proteus仿真+Keil工程-实验7-单片机AD和DA实验

    实验7-单片机AD和DA实验   之前做的一次实验,51单片机AD和DA实验,数模使用芯片0832,模数转换使用0809.在做实验时曾经遇到一个问题,模数转换0809是不是只能输出0~ 5V,能不能输 ...

  3. 51单片机Proteus仿真+Keil工程-实验6-单片机扩展RAM6264实验

    实验6-单片机扩展RAM6264实验   之前做的一次实验,51单片机扩展RAM6264实验.如有问题欢迎指正. 实验目的:   掌握单片机扩展芯片的方法:掌握RAM6264的写入和读取: 实验内容: ...

  4. 51单片机Proteus仿真+Keil工程-实验2-按键-数码管

    实验2-单片机数码管和按键实验   之前做的一次实验,51单片机通过按键控制单个数码管.如有问题欢迎指正. 实验目标:   通过建立4x4矩阵按键在8段数码管上面显示0~F,十六个按键值. Prote ...

  5. matlab单片机仿真,51单片机proteus仿真实验设计

    描述 这个proteus仿真是一个网友做的,该仿真可以生成方波.正弦波.锯齿波和三角波,并且还可以用按键调整波形. 不过,对初学者来讲,可能有点复杂.对于本科生来说,这个仿真几乎可以作为毕业论文了吧. ...

  6. 51单片机:电脑向串口发送数据并控制LED灯

    电脑向串口发送数据后,控制LED灯,并返回发送的数据 程序如下 #include"regx52.h" #include"intrins.h" unsigned ...

  7. 51单片机 Proteus仿真 数码管 万年历 电子时钟 阴历阳历 星期 DS1302 修改时间

    做了个比较叼的,数码管显示出年月日时分秒星期以及阴历的月份和日期. 按键可以修改年月日时分秒,星期几是根据年月日计算的,阴历也是计算出来的,不用按键修改.

  8. 51单片机 Proteus仿真 基于单片机的篮球计分器设计 LCD

    基于单片机的篮球计分器设计 设计LCD显示篮球比分牌 通过加分按钮可以给A队或B队加分 设计对调功能,A队和B队分数互换,意味着中场交换场地 显示比赛倒计时功能 创新内容:如显示第几小节

  9. 51单片机 Proteus仿真 四路倒计时 定时器0.01S

最新文章

  1. UVA12299 线段树水水水,但别乱开空间= =
  2. leetcode 152. Maximum Product Subarry
  3. php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能
  4. 精通Server 2008多元密码策略之PowerShell篇
  5. BCH码(能纠正多个随机错误的循环码)
  6. 我的世界联机侠服务器文件夹,我的世界联机侠空岛服务器怎么建 | 手游网游页游攻略大全...
  7. 天地图API 调用影像底图 影像注记 全球境界
  8. Failed to process import candidates for configuration class :Annotation-specified bean name ‘XXX‘ fo
  9. android tv盒子哪个好用,电视盒子什么牌子好?内行人都选这五款好用又不贵的机型...
  10. 全国各地土特产一览表1
  11. 智能语音:好玩的语音控制是怎么实现的?学习笔记01
  12. 文本编辑器的制作(C#)
  13. uva 1362 区间DP
  14. Hello, World! 发明者布莱恩·W.克尼汉的传奇人生
  15. javaScript:实现倒计时定时器setInterval的开始计时、暂停计时、停止计时效果
  16. 《高等统计物理学》Cookbook(持续更新)
  17. C语言分别判断大小写英文字母,空格,数字和其他字符的个数
  18. python中的del
  19. 数据库存储过程语法总结
  20. 记一次Minecraft游戏服务器搭建实践经历

热门文章

  1. 【Web技术】1274- 深入浅出前端监控
  2. 医学图像——CT值(Hu值)
  3. 使用Visio画UML图(Java)
  4. python列表两两相减_Python数据分析实例一:医院药品销售数据
  5. 前端开发中需要用到的变换矩阵(2D游戏适用)
  6. urllib的parse模块
  7. 传统责任链模式和变种责任链模式
  8. 学习笔记:MAC协议 5GNR
  9. 本科计算机er如何入手一些项目?
  10. while循环和doWhile循环