C51单片机_LCD电子时钟

可以手动设置初始时间和修改时间,可以设置闹钟时间,响应时蜂鸣器会响,步进电机会转动

#include <intrins.h>
#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
//定义步进电机连接端口
sbit A1=P2^0;
sbit B1=P2^1;
sbit C1=P2^2;
sbit D1=P2^3;sbit RS = P2 ^ 4; //定义端口
sbit RW = P2 ^ 5;//定义读写端口
sbit EN = P2 ^ 6;//数据读写操作总控位
sbit keystop = P1 ^ 0; //停止输入
sbit keyh = P1 ^ 1;//定义修改小时按键
sbit keym = P1 ^ 2;//定义修改分钟按键
sbit keys = P1 ^ 3;//定义修改秒钟按键
sbit SPK = P1 ^ 4;//设置蜂鸣器端口
sbit en_SPK = P1 ^ 5;//停止蜂鸣器端口
sbit led = P1 ^ 6;//设置小灯端口#define RS_CLR RS = 0
#define RS_SET RS = 1#define RW_CLR RW = 0
#define RW_SET RW = 1#define EN_CLR EN = 0
#define EN_SET EN = 1#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电#define DataPort P0
int year = 2019, month = 6, day = 4;
unsigned char time[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
unsigned char count = 0;
unsigned char hour = 0, min = 0, sec = 0;
unsigned char hour_s_clock = 0;
unsigned char hour_g_clock = 0;
unsigned char min_s_clock = 0;
unsigned char min_g_clock = 0;
unsigned char sec_s_clock = 0;
unsigned char sec_g_clock = 0;int month_s = 0;
int month_g = 0;
int day_s = 0;
int day_g = 0;
unsigned char flag = 0;
unsigned char flag2 = 0;
unsigned char mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//12个月份的天数
unsigned char hour_alarm = -1;
unsigned char min_alarm = -1;
unsigned char sec_alarm = -1;unsigned char hour_s_alarm = 0;
unsigned char hour_g_alarm = 0;
unsigned char min_s_alarm = 0;
unsigned char min_g_alarm = 0;
unsigned char sec_s_alarm = 0;
unsigned char sec_g_alarm = 0;
unsigned char Speed;//步进电机转动频率
unsigned char num = 0;//控制LED小灯闪烁频率
//精确延时
void DelayUs2x(unsigned char t) {while (--t);
}
void DelayMs(unsigned char t) {while (t--) {//大致延时1mSDelayUs2x(245);DelayUs2x(245);}
}
//延时程序
void delay(unsigned char z)
{unsigned char x, y;for (x = z; x > 0; x--)for (y = 110; y > 0; y--);
}
//判忙函数
bit LCD_Check_Busy(void) {DataPort = 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);
}
//写入命令函数
void LCD_Write_Com(unsigned char com) {// while(LCD_Check_Busy()); //忙则等待DelayMs(5);RS_CLR;RW_CLR;EN_SET;DataPort = com;_nop_();EN_CLR;
}
//写入数据函数
void LCD_Write_Data(unsigned char Data) {// while(LCD_Check_Busy()); //忙则等待DelayMs(5);RS_SET;RW_CLR;EN_SET;DataPort = Data;_nop_();EN_CLR;
}
//清屏函数
void LCD_Clear(void) {LCD_Write_Com(0x01);DelayMs(5);
}
//写入字符串函数
void LCD_Write_String(unsigned char x, unsigned char y, unsigned char *s) {if (y == 0) {LCD_Write_Com(0x80 + x);} else {LCD_Write_Com(0xC0 + x);}while (*s) {LCD_Write_Data(*s);s++;}
}
//写入字符函数
void LCD_Write_Char(unsigned char x, unsigned char y, unsigned char Data) {if (y == 0) {LCD_Write_Com(0x80 + x);} else {LCD_Write_Com(0xC0 + x);}LCD_Write_Data(Data);
}
//LCD初始化函数
void LCD_Init(void) {LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/
}
//中断初始化
void interript_init()
{count = 0;hour = 0;min = 0;sec = 0;TMOD = 0x01;//16位定时器TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;TR0 = 1;//定时器T0启动控制位ET0 = 1;EA = 1;//中断总控位EX0 = 1;//外部中断0中断允许位EX1 = 1;//外部中断1中断允许位IT0 = 1;PX0 = 1;//外部中断0中断优先级控制位PX1 = 1;//外部中断1中断优先级控制位
}
//显示时钟
void display() {hour_s_clock = hour / 10;hour_g_clock = hour % 10;min_s_clock = min / 10;min_g_clock = min % 10;sec_s_clock = sec / 10;sec_g_clock = sec % 10;LCD_Write_Char(0, 1, 't');LCD_Write_Char(1, 1, 'i');LCD_Write_Char(2, 1, 'm');LCD_Write_Char(3, 1, 'e');LCD_Write_Char(4, 1, ':');LCD_Write_Char(5, 1, ' ');LCD_Write_Char(6, 1, time[hour_s_clock]);LCD_Write_Char(7, 1, time[hour_g_clock]);LCD_Write_Char(8, 1, '-');LCD_Write_Char(9, 1, time[min_s_clock]);LCD_Write_Char(10, 1, time[min_g_clock]);LCD_Write_Char(11, 1, '-');LCD_Write_Char(12, 1, time[sec_s_clock]);LCD_Write_Char(13, 1, time[sec_g_clock]);
}
//显示闹钟
void display2() {hour_s_alarm = hour_alarm / 10;hour_g_alarm = hour_alarm % 10;min_s_alarm = min_alarm / 10;min_g_alarm = min_alarm % 10;sec_s_alarm = sec_alarm / 10;sec_g_alarm = sec_alarm % 10;LCD_Write_Char(0, 1, 't');LCD_Write_Char(1, 1, 'i');LCD_Write_Char(2, 1, 'm');LCD_Write_Char(3, 1, 'e');LCD_Write_Char(4, 1, ':');LCD_Write_Char(5, 1, ' ');LCD_Write_Char(6, 1, time[hour_s_alarm]);LCD_Write_Char(7, 1, time[hour_g_alarm]);LCD_Write_Char(8, 1, '-');LCD_Write_Char(9, 1, time[min_s_alarm]);LCD_Write_Char(10, 1, time[min_g_alarm]);LCD_Write_Char(11, 1, '-');LCD_Write_Char(12, 1, time[sec_s_alarm]);LCD_Write_Char(13, 1, time[sec_g_alarm]);LCD_Write_Char(14, 1, ' ');LCD_Write_Char(15, 1, ' ');
}void clock(void) {while (1) {DelayMs(5);SPK = !SPK;num++;if (num >= 50) {led = ~led;num = 0;}Speed=2; //调整速度Coil_A1                 //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替DelayMs(Speed);         //改变这个参数可以调整电机转速, 数字越小, 转速越大, 力矩越小Coil_B1DelayMs(Speed);Coil_C1DelayMs(Speed);Coil_D1DelayMs(Speed);if (!en_SPK)return;}
}
//主函数
void main(void) {LCD_Init();month_s = month / 10;month_g = month % 10;day_s = day / 10;day_g = day % 10;LCD_Write_Char(2, 0, '2');LCD_Write_Char(3, 0, '0');LCD_Write_Char(4, 0, '1');LCD_Write_Char(5, 0, '9');LCD_Write_Char(6, 0, '-');LCD_Write_Char(7, 0, time[month_s]);LCD_Write_Char(8, 0, time[month_g]);LCD_Write_Char(9, 0, '-');LCD_Write_Char(10, 0, time[day_s]);LCD_Write_Char(11, 0, time[day_g]);LCD_Write_Char(0, 1, 't');LCD_Write_Char(1, 1, 'i');LCD_Write_Char(2, 1, 'm');LCD_Write_Char(3, 1, 'e');LCD_Write_Char(4, 1, ':');LCD_Write_Char(5, 1, ' ');LCD_Write_String(6, 1, "00-00-00");interript_init();while (1) {if (flag == 1) {display();if (hour_alarm == hour && min_alarm == min && sec_alarm == sec) {display();hour_alarm = -1;min_alarm = -1;sec_alarm = -1;clock();}}}
}
//随时修改时间
void outer_ser(void) interrupt 0 {flag = 1;while (1) {display();if (keyh == 0) //实现小时加一{delay(5);if (keyh == 0) {if (hour != 23)hour++;elsehour = 0;}while (!keyh);delay(5);while (!keyh);}if (keym == 0){ //实现分钟加一delay(5);if (keym == 0){if (min != 59){min++;}else{min = 0;}}while (!keym); //松手检测delay(5);while (!keym);}if (keys == 0){ //实现秒加一delay(5);if (keys == 0) {if (sec != 59) {sec++;} else {sec = 0;}}while (!keys);delay(5);while (!keys);}if (keystop == 0){break;}}
}
//计时器/定时器0,时钟运行
void count0() interrupt 1 {TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;count++;if (count == 20){count = 0;sec++;if (sec == 60){sec = 0;min++;if (min == 60){min = 0;hour++;if (hour == 24){hour = 0;day++;if (day == mon[month - 1]){day = 0;month++;}}}}}
}
//计时器/定时器1,设定闹钟
void outer_ser2(void) interrupt 2 {flag2 = 1;hour_alarm = hour;min_alarm = min;sec_alarm = sec;while (1) {display2();if (keyh == 0){ //实现小时加一delay(5);if (keyh == 0){if (hour_alarm != 23)hour_alarm++;elsehour_alarm = 0;}while (!keyh);delay(5);while (!keyh);}if (keym == 0){ //实现分钟加一delay(5);if (keym == 0){if (min_alarm != 59){min_alarm++;}else{min_alarm = 0;}}while (!keym); //松手检测delay(5);while (!keym);}if (keys == 0){ //实现秒加一delay(5);if (keys == 0){if (sec_alarm != 59){sec_alarm++;} else {sec_alarm = 0;}}while (!keys);delay(5);while (!keys);}if (keystop == 0) {break;}}
}

C51单片机_LCD电子时钟相关推荐

  1. C51单片机的电子时钟(数码管显示)

    C51单片机的电子时钟 硬件环境: 相关开发板原理图解析 正式代码: 效果预览图 硬件环境: 普中科技51单片机开发板STC89C52 相关开发板原理图解析 查看这两个原理图,我们可以发现控制这8个数 ...

  2. 基于单片机的电子时钟

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87453487 源码获取 摘要 本次设 ...

  3. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  4. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  5. 基于单片机的电子时钟设计(keil+protues仿真,含代码及原理图)

    本学期单片机课程要求做课程设计,我选取的课题如下: 基于单片机的电子时钟设计,要求: (1)实时显示当前时间: (2)能够对时间进行设置: (3)包括年月日,小时,分钟,秒. (4)整点提醒功能. 经 ...

  6. 微型计算机系统电子时钟程序设计,基于单片机的电子时钟设计 普通单片机电子时钟的设计的分析...

    摘要:随着电子科技的飞速发展,尤其是超大规模集成电路的出现,给我国的经济带来了实质性的改变.其中,对于单片机的使用已经在很多领域都有出现,比如说在工业自动化控制房间.在智能仪器仪表方面以及各种家用电器 ...

  7. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

  8. 【036】基于51单片机的电子时钟与秒表Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的电子时钟与秒表proteus仿真设计一份: (2).基于51单片机的电子时钟与秒表proteus仿真设计keli源代码一份: (3).基于51单片机的电子时 ...

  9. 数字电子计算机处理信号shi,余洪伟 基于单片机数字电子时钟设计(led显示).doc...

    余洪伟 基于单片机数字电子时钟设计(led显示) 沈阳航空航天大学 课 程 设 计 (论文) 题目 基于单片机的数字电子时钟设计 (LED显示) 班 级 学 号 2013040701060 学 生 姓 ...

  10. 基于8051单片机实现电子时钟+数字秒表设计

    电子时钟+数字秒表设计 概述 设计任务的基本要求 整体方案 电路设计原理 软件设计 元件清单 项目下载地址 概述 电子时钟是一种利用数字电路来显示秒.分.时的计时装置,与传统的机械钟相比,它具有走时准 ...

最新文章

  1. 人民币升值与美元贬值
  2. 互联网基础知识_数字化工业网络—工业互联网的网络技术.pptx
  3. 学习在网页中应用大图片背景的20个精美案例
  4. 我终将失去了你,我的MSN君
  5. Source Insight常用快捷键
  6. 第五课 路由之初识路由
  7. java setdaemon_Java ThreadGroup setDaemon()方法
  8. Educational Codeforces Round 15 套题
  9. 【MVC 过滤器的应用】ASP.NET MVC 如何统计 Action 方法的执行时间
  10. Spring Boot 返回 XML 数据,一分钟搞定!
  11. plantuml 流程图_画流程图你还在用鼠标拖吗
  12. python的jieba分词
  13. 学习了1!+...10!
  14. shell历史命令记录功能
  15. 空心心形图案的c语言程序,C语言写的各种心形图案_6583
  16. SolidWorks2016 从入门到入坟 下载安装+画图
  17. 有人喜欢有人嫉妒,竟然因为这上了互联网热搜
  18. 经典算法分析:n与lgn
  19. 校友故事|我在科大感受理工科“严谨的浪漫主义”
  20. python runtime错误_使用Django框架遇到RuntimeError: populate() isn't reentrant错误

热门文章

  1. 《中国人工智能学会通讯》——3.25 康复机器人的人机交互控制研究综述
  2. curve25519-c++调用,...转换成椭圆曲线上的一个点。
  3. 天载杠杆炒股指数迎来技术性调整
  4. python简介_Python合奏简介
  5. @ConfigurationProperties 注解使用姿势
  6. 秩为1的矩阵的幂规律
  7. 微信《跳一跳》超高分攻略,轻松排行榜首
  8. 计算机教室在哪儿英语,电脑教室,computer teaching room,音标,读音,翻译,英文例句,英语词典...
  9. 自掘Java----②java基础定义
  10. How to Build a Decentralized Exchange With Solidity