51单片机 Proteus仿真 时钟 串口 发送时钟 整点报时
#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仿真 时钟 串口 发送时钟 整点报时相关推荐
- 51单片机Proteus仿真
这里分享一些关于51单片机的Proteus仿真.部分仿真来源于网络整理.有需要可以看看. 51单片机Proteus仿真入门实验:https://mp.weixin.qq.com/s/6kgAWSqeY ...
- 51单片机Proteus仿真+Keil工程-实验7-单片机AD和DA实验
实验7-单片机AD和DA实验 之前做的一次实验,51单片机AD和DA实验,数模使用芯片0832,模数转换使用0809.在做实验时曾经遇到一个问题,模数转换0809是不是只能输出0~ 5V,能不能输 ...
- 51单片机Proteus仿真+Keil工程-实验6-单片机扩展RAM6264实验
实验6-单片机扩展RAM6264实验 之前做的一次实验,51单片机扩展RAM6264实验.如有问题欢迎指正. 实验目的: 掌握单片机扩展芯片的方法:掌握RAM6264的写入和读取: 实验内容: ...
- 51单片机Proteus仿真+Keil工程-实验2-按键-数码管
实验2-单片机数码管和按键实验 之前做的一次实验,51单片机通过按键控制单个数码管.如有问题欢迎指正. 实验目标: 通过建立4x4矩阵按键在8段数码管上面显示0~F,十六个按键值. Prote ...
- matlab单片机仿真,51单片机proteus仿真实验设计
描述 这个proteus仿真是一个网友做的,该仿真可以生成方波.正弦波.锯齿波和三角波,并且还可以用按键调整波形. 不过,对初学者来讲,可能有点复杂.对于本科生来说,这个仿真几乎可以作为毕业论文了吧. ...
- 51单片机:电脑向串口发送数据并控制LED灯
电脑向串口发送数据后,控制LED灯,并返回发送的数据 程序如下 #include"regx52.h" #include"intrins.h" unsigned ...
- 51单片机 Proteus仿真 数码管 万年历 电子时钟 阴历阳历 星期 DS1302 修改时间
做了个比较叼的,数码管显示出年月日时分秒星期以及阴历的月份和日期. 按键可以修改年月日时分秒,星期几是根据年月日计算的,阴历也是计算出来的,不用按键修改.
- 51单片机 Proteus仿真 基于单片机的篮球计分器设计 LCD
基于单片机的篮球计分器设计 设计LCD显示篮球比分牌 通过加分按钮可以给A队或B队加分 设计对调功能,A队和B队分数互换,意味着中场交换场地 显示比赛倒计时功能 创新内容:如显示第几小节
- 51单片机 Proteus仿真 四路倒计时 定时器0.01S
最新文章
- UVA12299 线段树水水水,但别乱开空间= =
- leetcode 152. Maximum Product Subarry
- php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能
- 精通Server 2008多元密码策略之PowerShell篇
- BCH码(能纠正多个随机错误的循环码)
- 我的世界联机侠服务器文件夹,我的世界联机侠空岛服务器怎么建 | 手游网游页游攻略大全...
- 天地图API 调用影像底图 影像注记 全球境界
- Failed to process import candidates for configuration class :Annotation-specified bean name ‘XXX‘ fo
- android tv盒子哪个好用,电视盒子什么牌子好?内行人都选这五款好用又不贵的机型...
- 全国各地土特产一览表1
- 智能语音:好玩的语音控制是怎么实现的?学习笔记01
- 文本编辑器的制作(C#)
- uva 1362 区间DP
- Hello, World! 发明者布莱恩·W.克尼汉的传奇人生
- javaScript:实现倒计时定时器setInterval的开始计时、暂停计时、停止计时效果
- 《高等统计物理学》Cookbook(持续更新)
- C语言分别判断大小写英文字母,空格,数字和其他字符的个数
- python中的del
- 数据库存储过程语法总结
- 记一次Minecraft游戏服务器搭建实践经历