首页 > 其他分享 >24 基于51单片机的公交车报站仿真(LCD12864、DS1302、串口)

24 基于51单片机的公交车报站仿真(LCD12864、DS1302、串口)

时间:2024-09-26 10:49:03浏览次数:3  
标签:24 info ShowChina 02d 串口 DS1302 time TIME 0x0f

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,采用DS1302时钟模块读取时间,通过LCD12864显示实时时间,然后两个按键,一个按下表示到站,一个按下表示没到站。
到达站点,蜂鸣器发出声音,屏幕显示到站,通过串口发送信息
如果没到站,屏幕显示未到站,通过串口发送信息

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

#include <reg51.h>#include "DS18B20.h"#include "DS1302.h"#include "LCD12864.h"#include <stdio.h>sbit beep=P2^7;char a;
sbit key1 = P3^6;
sbit key2 = P3^7;void ajpd();/***按键触发标志位***/bit  flag=1; //进入/退出设置标志void ckdy();// 定义一个结构体来存储时间信息typedef struct {    int year;    int month;    int day;    int hour;    int minute;    int second;	  int weekend;
} TimeInfo;TimeInfo convert\_to\_time_info(int time\[\]);/***按键触发实现函数***/void delay10(void) //延时10ms{    unsigned char i,j;    for(i=0; i<255; i++)        for(j=0; j<200; j++);
}void delay5ms(void)   //误差 0us{    unsigned char a,b;    for(b=19; b>0; b--)        for(a=130; a>0; a--);
}//设置时ds1302寄存器值循环 如秒寄存器59时加一变为00unsigned char conver(unsigned char a,unsigned char b,unsigned char c){    if((a&0x0f)==0x0a) a=a+6;    if(a==b)  a=c;    return a;
}void digplay() {    //时间
    ShowNumber16_32(2,0,TIME\[2\]>>4&0x03); //时 十位
    ShowNumber16_32(2,16, TIME\[2\]&0x0f);//时  个位
    ShowNumber16_32(2,48,TIME\[1\]>>4&0x07);//分  十位
    ShowNumber16_32(2,64, TIME\[1\]&0x0f);//分  个位
    ShowNumber16_32(2,96,TIME\[0\]>>4&0x07);//秒 十位
    ShowNumber16_32(2,112, TIME\[0\]&0x0f);//秒  个位


    //日期
    ShowNumber(0,0,2);    ShowNumber(0,8,0);    ShowNumber(0,16,TIME\[6\]>>4&0x0f);    ShowNumber(0,24, TIME\[6\]&0x0f);//年

   ShowNumber(0,40,TIME\[4\]>>4&0x01);    ShowNumber(0,48, TIME\[4\]&0x0f);//月

    ShowNumber(0,64,TIME\[3\]>>4&0x03);    ShowNumber(0,72, TIME\[3\]&0x0f);//日

    ShowChina(0,112,(TIME\[5\]&0x07)-1);//周}void digplaystart() {//开机显示
    uchar i=0;    ShowChina(2,64-16\*1.5,19);    ShowChina(2,64-16\*0.5,20);    ShowChina(2,64+16\*0.5,21);    ShowChina(2,64+16\*1.5,22);    for (i=0; i<10; i++) {        ShowNumber(4,32+8*i,16);        delay5ms();        delay5ms();
    }    ClearScreen(0);//清屏}void Com0_Init(void){
 	TMOD =0x20;		   //设T0为方式1,GATE=1;
	SCON=0x50;        //开启串口
	TH1=0xFD;          //波特率是9600bps
	TL1=0xFD;
	TR1=1;			   //开启定时器
	TI=1;
	EA=1;
}

TimeInfo time_info; // 在 main 函数外部声明 TimeInfo 结构体实例void main(void){    InitLCD();	  //初始化LCD12864
	  Com0_Init();//串口初始化 
    digplaystart();    delay5ms();    ShowNumber(0,32,11);//-
    ShowNumber(0,56,11);//-
    ShowChina(0,96,7);//汉字周
    ShowNumber16_32(2,32,10);//:
    ShowNumber16_32(2,80,10);//:
    beep = 0;    while(1)
    {    
        if(flag==1)            Ds1302ReadTime();        //读取DS1302的时间
        else
				{            Ds1302WriteTime();
				}				
				ajpd();//按键判断
        digplay();
				
  time\_info = convert\_to\_time\_info(TIME); // 将 TIME 数组中的时间信息转换为 TimeInfo 结构体

				
				
    }
}// 函数将 TIME 数组中的时间信息转换为 TimeInfo 结构体TimeInfo convert\_to\_time_info(int time\[\]) {
    TimeInfo info;
    info.year = 2000+(TIME\[6\] >> 4 & 0x0f) * 10 + (TIME\[6\] & 0x0f);
    info.month = (TIME\[4\]>>4&0x01)*10 + (TIME\[4\]&0x0f);
    info.day = (TIME\[3\]>>4&0x03)*10 + (TIME\[3\]&0x0f);
    info.hour = (TIME\[2\]>>4&0x03)*10 + (TIME\[2\]&0x0f);
    info.minute = (TIME\[1\]>>4&0x07)*10 + (TIME\[1\]&0x0f);
    info.second = (TIME\[0\]>>4&0x07)*10 + (TIME\[0\]&0x0f);    return info;
}void ajpd(){	if(!key1)
	{//		InitLCD();
		ShowChina(6,0,26);//已
		ShowChina(6,16,23);//到
		ShowChina(6,32,24);//站
		beep = 1;		   // 使用 PRINTF 函数打印时间信息
     printf("当前时间是:%04d-%02d-%02d %02d:%02d:%02d ",
           time\_info.year, time\_info.month, time_info.day,
           time\_info.hour, time\_info.minute, time_info.second);		printf("周四\\n");			printf("已到站\\n");		while(!key1);
	}	
	if(!key2)
	{//		InitLCD();
		ShowChina(6,0,25);//未
		ShowChina(6,16,23);//到
		ShowChina(6,32,24);//站
		beep = 0;		   // 使用 PRINTF 函数打印时间信息
     printf("当前时间是:%04d-%02d-%02d %02d:%02d:%02d ",
           time\_info.year, time\_info.month, time_info.day,
           time\_info.hour, time\_info.minute, time_info.second);		printf("周四\\n");			printf("未到站\\n");		while(!key2);
	}
}

四、实现现象

具体动态效果看B站演示视频:

2d851c1bc120f74fa21ced3be39fb029.jpeg

基于51单片机的公交车报站

全部资料(源程序、仿真文件、安装包、演示视频、串口演示视频和串口资料):
链接:https://pan.baidu.com/s/11AnOZLdbq16o84nyJ52ZRQ?pwd=1i0i 
提取码:1i0i

标签:24,info,ShowChina,02d,串口,DS1302,time,TIME,0x0f
From: https://blog.csdn.net/szq0419/article/details/142550201

相关文章

  • 20240925
    2集合間距離有两种方法,我选择了更劣的做法,呜呜呜!我是暴力枚举每个点,然后对与另一个集合里的点枚举横坐标,用二分找到纵坐标上距离最小的点,\(xhr\)写的是直接多源广搜,我的时间复杂度为\(O(n*1000)\),他的时间复杂度为\(O(n)\),在线膜拜#include<bits/stdc++.h>usin......
  • 【2024潇湘夜雨】WIN10_LTSC2021_21H2.19044.4957软件选装纯净特别版9.26
    【系统简介】=============================================================1.本次更新母盘来自WIN10_LTSC2021_21H2.19044.4957.2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能部分优化不适用。3.OS版本号为19044.49......
  • CCF CSP-S 2024 提高组初赛解析
    CertifiedSoftwareProfessional-Senior非专业级软件能力认证测试本解析不提供阅读程序与完善程序题目的代码,如有需要请通过luogu.com.cn相关链接下载如有谬误烦请指正答案AACBBBDABDACBCD✓××BC✓✓✓BCC✓×✓CACAAAAAAABAA单项选择1在Linux系统中,如......
  • 都2024了!AI绘画赚钱的机会多如牛毛!普通人可轻松上手实操!
    AI绘画的赚钱机会真的是太多了,多如牛毛!很多做自媒体的朋友觉得AI绘画可能最赚钱的还是卖教程,卖课程,这种想法是很浅薄的。教人赚钱确实可以赚不少钱,但是教人成功赚到钱的概率是很低的,一个好的项目如果有5-10%的学员可以做出成绩,那么这个副业赚钱导师就算是很牛逼了,付费买......
  • 电脑桌面管理|电脑桌面太乱如何整理?2024年七款好用的电脑桌面管理软件分享
    电脑桌面太乱如何整理?在日常工作和学习中,电脑桌面常常成为我们存放各种文件和快捷方式的“仓库”,随着时间的推移,桌面可能会变得杂乱无章,不仅影响美观,还降低了工作效率。那么,如何有效整理电脑桌面呢?本文将分享一些实用的整理方法,并推荐七款2024年好用的电脑桌面管理软件,帮助你打......
  • 2024牛客暑期多校训练营1——A,B
    题解:更新:k=1的时候要乘n代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=5e3+5;typedeflonglongll;typedefpair<int,int>PII;intT;intn,m,mod;intfac[N][N];intdp[N][N];intper[N];intpower(inta,int......
  • ShiftAddAug:基于乘法算子训练的最新无乘法网络方案 | CVPR'24
    不包含乘法的运算符,如移位和加法,因其与硬件的兼容性而日益受到重视。然而,采用这些运算符的神经网络(NNs)通常表现出比具有相同结构的传统NNs更低的准确性。ShiftAddAug利用成本较高的乘法来增强高效但功能较弱的无乘法运算符,从而在没有任何推理开销的情况下提高性能。将一个ShiftAd......
  • 2024.9.25训练记录
    上午whk下午noip模拟T1:结论题。考场想不出来。只需要顺序做第一个1前的数。原因:考虑三个数时的情况。顺序是\((a^b)^c\)或者\(a^{(b^c)}\)。相当于,比较\(b^c\)和\(bc\)的大小。显然有:\(b,c\geq2\)时,\(b^c\geqbc\)。所以按照正常顺序做,在\(A_i\geq2\)时......
  • 精通Java并发锁机制:24种锁技巧+业务锁匹配方案(第一部分)
    在Java并发编程中,锁是确保线程安全、协调多线程访问共享资源的关键机制。从基本的synchronized同步关键字到高级的ReentrantLock、读写锁ReadWriteLock、无锁设计如AtomicInteger,再到复杂的同步辅助工具如CountDownLatch、CyclicBarrier和Semaphore,每种锁都针对......
  • QBXT 4242.小葱拿糖
    统计五个数组,\(v_i\)\(i\)点的美味值(权值),f_i当前节点到根节点的权值和,\(m_{i,0/1}\)i的最大/次大向下走的路径权值和(不包括点\(i\)),\(g_{i,0/1}\)从i点向上走的,或者走其他子树的最大路径(0/1=包含/不包含\(m_{i,0}\))。\(st_i\)i在不在fa的\(m_{i,0}\)上。其中除......