文章结构:

-项目概述-

以前的旧模块搁置很久没用,最近看到圈子很多倒腾电脑副屏的,咱虽然没钱,但是闲啊,刚好手头有这些东西,开干。

目的:

  • 显示电脑CPU占用
  • 内存占用等信息
  • 后台消息屏闪提示
  • 开机自启
  • 显示时间日期
  • 背光可调
  • 蓝牙断线重连

材料清单:LCD一块,HC-04蓝牙模块,10K可调电阻,杜邦线,PC,51单片机最小系统板一块(其余种类也可,有串口即可)

-成品预览-

        

-项目框架-

51单片机的STC8G系列完成硬件逻辑,蓝牙模块负责收发,项目框架如下:

-硬件资料,代码-

51接收端资料:

  1 #include <STC8.H>
2 #include "LCD1602.h"
3
4 // #include "Display1602.h"
5
6
7 #define uchar unsigned char
8 #define uint unsigned int
9
10 sbit res_vcc = P3^0;
11 sbit res_gnd = P3^1;
12
13 sbit back1_vcc = P3^2;
14 sbit back1_gnd = P3^3;
15
16 sbit Time_vcc = P1^0;
17 sbit Time_gnd = P1^4;
18
19 int Time[3] = {0, 55, 16}; //秒,分,时
20 uint Data[3] = {20,11,2022}; //年,月,日
21 uint Week[7] = {0 ,1, 2, 3, 4, 5, 6};
22 enum WEEK{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
23 uint count;
24 uchar num;
25 char sep = '-';
26
27 uchar i,flag,j,show_time;
28 uchar Info_buffer[16];
29 uchar Info_buffer1[16];
30
31
32 //uchar DS1302_Time_test[]={27,1,19,12,00,00,1};
33 //char DS1302_Time_test[] = "27,1,19,12,00,00,1";
34 uchar code Data_array[10] = "2022-06-14";
35 uchar code Week_array[3] = "WED";
36 uchar code Time_array[8] = "11:08:09";
37 uchar code Word_array[12] = "Starry";
38 uchar code Tem_array[] = "32.1 C";
39
40 //void Init_Timer0();
41 //void TimeShow(void);
42 void DataTransfer();
43
44 void Init_UART()
45 {
46 PCON &= 0x7F; //波特率不倍速
47 SCON = 0x50; //8位数据,可变波特率
48 AUXR &= 0xBF; //定时器时钟12T模式
49 AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
50 TMOD &= 0x0F; //设置定时器模式
51 TMOD |= 0x20; //设置定时器模式
52 TL1 = 0xFD; //设置定时初始值
53 TH1 = 0xFD; //设置定时重载值
54 ET1 = 0; //禁止定时器%d中断
55 TR1 = 1; //定时器1开始计时
56 EA = 1;
57 ES = 1;
58
59 }
60
61 void main()
62 {
63 P1M0 = 0;
64 P1M1 = 0;
65
66 P3M0 = 0;
67 P3M1 = 0;
68
69 P2M0 = 0;
70 P2M1 = 0;
71
72 res_vcc = 1;
73 back1_vcc = 1;
74 Time_vcc = 1;
75
76 res_gnd = 0;
77 back1_gnd = 0;
78 Time_gnd = 0;
79
80
81 LCD_set();
82 Init_UART();
83 // Init_Timer0();
84
85 while(1)
86 {
87 //TimeShow();
88 LCD_write_Chars(0,0,Info_buffer);
89 LCD_write_Chars(0,1,Info_buffer1);
90
91 if(flag == 1)
92 {
93 //LCD_write_com(0x01);
94 LCD_write_Chars(0,0,Info_buffer);
95 LCD_write_Chars(0,1,Info_buffer1);
96 for(i=0;i<16;i++)
97 Info_buffer[i]=0x00;
98 for(i=0;i<16;i++)
99 Info_buffer1[i]=0x00;
100 flag = 0;
101 }
102
103 }
104 }
105
106 void Init_Timer0()
107 {
108 EA = 1;
109 ET0 = 1;
110 TMOD = 0x01;
111 TH0 = (65536-10000)/256;
112 TL0 = (65536-10000)%256;
113 TR0 = 1;
114 }
115
116 void TimeShow(void)
117 {
118 LCD_writ_Number(0, 1, 2, Time[2]); // 显示小时
119 lcd_delay(1);
120
121 LCD_writ_Char(2, 1, '-');
122 lcd_delay(1);
123
124 LCD_writ_Number(3, 1, 2, Time[1]); // 显示分钟
125 lcd_delay(1);
126
127 LCD_writ_Char(5 ,1 , '-');
128 lcd_delay(1);
129
130 LCD_writ_Number(6, 1, 2, Time[0]); // 显示秒钟
131 lcd_delay(1);
132 //-----------------------------------------------------
133 LCD_writ_Number(0, 0, 4, Data[2]); // 显示日期
134 lcd_delay(1);
135
136 LCD_writ_Char(4, 0, '-');
137 lcd_delay(1);
138
139 LCD_writ_Number(5, 0, 2, Data[1]); // 显示月份
140 lcd_delay(1);
141
142 LCD_writ_Char(7 ,0 , '-');
143 lcd_delay(1);
144
145 LCD_writ_Number(8, 0, 2, Data[0]); // 显示年份
146 lcd_delay(1);
147 }
148
149 void UART_Interrupt() interrupt 4
150 {
151 ES = 0;
152 for(j=0;SBUF!=0X0A;j++)
153 {
154 while(!RI);
155 if(SBUF==0X0A)
156 goto A;
157 if(j<16)
158 Info_buffer[j]= SBUF;
159 else
160 Info_buffer1[j-16]= SBUF;
161 RI = 0;
162 }
163 A: RI=0;
164 flag = 1;
165 ES = 1;
166 }

电脑发送端资料:

  1 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
2 #include <stdio.h>
3 #include <Windows.h>
4 #include<time.h>
5 #include <tchar.h>
6 #include "readport.h"
7
8 #define DIV 1024
9 #define WIDTH 7
10 #define GB(x) (((x).HighPart << 2) + ((DWORD)(x).LowPart) / 1024.0 / 1024.0 / 1024.0)
11
12 #pragma warning(disable: 4996)
13
14 #define true 1
15 typedef unsigned char U_CHAR;
16
17 //获取系统时间
18 void getSystemTime(char* buffer) {
19
20 char buf[128];
21 time_t rawtime;
22 struct tm * timeinfo;
23 time(&rawtime);
24 timeinfo = localtime(&rawtime);
25 strftime(buf, sizeof(buf), " %m-%d %H:%M:%S", timeinfo);
26 strcpy(buffer, buf);
27 }
28
29 //CPU利用率
30 FILETIME m_preidleTime;
31 FILETIME m_prekernelTime;
32 FILETIME m_preuserTime;
33
34 __int64 CompareFileTime2(FILETIME time1, FILETIME time2)
35 {
36 __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
37 __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;
38
39
40 return b - a;
41 }
42
43 void GetCpuUseage()
44 {
45 GetSystemTimes(&m_preidleTime, &m_prekernelTime, &m_preuserTime);
46 Sleep(1000);
47 }
48
49 double CpuUseage()
50 {
51 FILETIME idleTime;
52 FILETIME kernelTime;
53 FILETIME userTime;
54 GetSystemTimes(&idleTime, &kernelTime, &userTime);
55
56
57 int idle = CompareFileTime2(m_preidleTime, idleTime);
58 int kernel = CompareFileTime2(m_prekernelTime, kernelTime);
59 int user = CompareFileTime2(m_preuserTime, userTime);
60
61
62 if (kernel + user == 0)
63 return 0.0;
64 //(总的时间-空闲时间)/总的时间=占用cpu的时间就是使用率
65 double cpu = abs((kernel + user - idle) * 100 / (kernel + user));
66
67 m_preidleTime = idleTime;
68 m_prekernelTime = kernelTime;
69 m_preuserTime = userTime;
70 return cpu;
71 }
72
73 //读取操作系统的名称
74 void GetSystemName(char* osname)
75 {
76 char buf[128];
77 SYSTEM_INFO info; //用SYSTEM_INFO结构判断64位AMD处理器
78 GetSystemInfo(&info); //调用GetSystemInfo函数填充结构
79 OSVERSIONINFOEX os;
80 os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
81
82 strcpy(buf, "unknown OperatingSystem.");
83
84 if (GetVersionEx((OSVERSIONINFO *)&os))
85 {
86 //下面根据版本信息判断操作系统名称
87 switch (os.dwMajorVersion)//判断主版本号
88 {
89 case 4:
90 switch (os.dwMinorVersion)//判断次版本号
91 {
92 case 0:
93 if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
94 strcpy(buf, "Microsoft Windows NT 4.0"); //1996年7月发布
95 else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
96 strcpy(buf, "Microsoft Windows 95");
97 break;
98 case 10:
99 strcpy(buf, "Microsoft Windows 98");
100 break;
101 case 90:
102 strcpy(buf, "Microsoft Windows Me");
103 break;
104 }
105 break;
106
107 case 5:
108 switch (os.dwMinorVersion) //再比较dwMinorVersion的值
109 {
110 case 0:
111 strcpy(buf, "Microsoft Windows 2000"); //1999年12月发布
112 break;
113
114 case 1:
115 strcpy(buf, "Microsoft Windows XP"); //2001年8月发布
116 break;
117
118 case 2:
119 if (os.wProductType == VER_NT_WORKSTATION
120 && info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
121 {
122 strcpy(buf, "Microsoft Windows XP Professional x64 Edition");
123 }
124 else if (GetSystemMetrics(SM_SERVERR2) == 0)
125 strcpy(buf, "Microsoft Windows Server 2003"); //2003年3月发布
126 else if (GetSystemMetrics(SM_SERVERR2) != 0)
127 strcpy(buf, "Microsoft Windows Server 2003 R2");
128 break;
129 }
130 break;
131
132 case 6:
133 switch (os.dwMinorVersion)
134 {
135 case 0:
136 if (os.wProductType == VER_NT_WORKSTATION)
137 strcpy(buf, "Microsoft Windows Vista");
138 else
139 strcpy(buf, "Microsoft Windows Server 2008"); //服务器版本
140 break;
141 case 1:
142 if (os.wProductType == VER_NT_WORKSTATION)
143 strcpy(buf, "Microsoft Windows 7");
144 else
145 strcpy(buf, "Microsoft Windows Server 2008 R2");
146 break;
147 }
148 break;
149 }
150 }//if(GetVersionEx((OSVERSIONINFO *)&os))
151
152 strcpy(osname, buf);
153 }
154
155 int main() {
156
157 WZSerialPort w;
158 //这里是选择端口号,其他波特率信息可在头文件修改,或者在下面重新赋值。
159 if (w.open("COM6"))
160 {
161 //cout << "打开成功" << endl;
162 //cout << "在这里我发送:恭喜发财" << endl;
163
164 //w.send("恭喜发财");
165 //w.close();
166 }
167 else
168 {
169 cout << "打开失败" << endl;
170 }
171
172 //获取系统时间
173 char buffer[128];
174 getSystemTime(buffer);
175 //puts(buffer);
176
177 //系统运行时间
178 clock_t start, finish;
179 double duration;
180
181 start = clock();
182
183
184 //系统版本名称
185 char osname[20];
186 GetSystemName(osname);
187 //printf("%s\n", osname);
188
189 while (true)
190 {
191 //
192
193 //CPU利用率
194 U_CHAR sysStateCpu[5];
195 double cpu = CpuUseage();
196 sprintf((char*)sysStateCpu, "%.lf", cpu);
197 //printf("CPU:%s%%\n", sysStateCpu);
198
199 //系统时间
200 char buffer[128];
201 getSystemTime(buffer);
202 puts(buffer);
203
204 // 系统运行时间
205 finish = clock();
206 duration = (double)(finish - start) / CLOCKS_PER_SEC;
207 //printf("%.0f 秒\n", duration);
208
209 //内存使用率
210 char bufPreCPU[10];
211 MEMORYSTATUSEX statex;
212 statex.dwLength = sizeof(statex);
213 GlobalMemoryStatusEx(&statex);
214 sprintf(bufPreCPU, "MEM:%ld%% CPU:%2s%% %s%\n", statex.dwMemoryLoad, sysStateCpu, buffer);
215
216
217
218 //puts(bufPreCPU);
219 w.send(bufPreCPU);
220 Sleep(1000);
221 }
222 printf("hello world!\n");
223 system("pause");
224
225 }

项目全部文件:

个人博客下方私信领取

http://potatoworld.top:5800/

-项目槽点-

  • 为了实现开机自启,最开始可谓是煞费苦心,想了很多办法,什么计划任务,看门狗等等......最后,最方便最直接的方法还是把上位机直接扔进开机自启文件夹.....

    启动文件夹开机自启:https://blog.csdn.net/misterdo/article/details/106898689

  • HC-04蓝牙模块在win10系统下,怎么通过程序给它发消息?这个问题加起来快赶上写程序的时间了,网上也没有找到满意的答案。

  

   上述图示过后,得到了蓝牙模块的端口,那就一切好说了,直接电脑打开串口软件,往里面丢东西便是。

  • 串口软件发送hex数据,在选中确认为hex模式后,无需再添加0X,否则会有几个乱码。

LCD副屏-CPU,内存,时显,日期显示的更多相关文章

  1. Shell----监控CPU/内存/负载高时的进程

    Shell----监控CPU/内存/负载高时的进程 1.编写脚本 vim cpu-warning.sh #!/bin/bash #监控系统cpu的情况脚本程序 #取当前空闲cpu百份比值(只取整数部分 ...

  2. 痞子衡嵌入式:降低刷新率是定位LCD花屏显示问题的第一大法(i.MXRT1170, 1280x480 LVDS)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170上LCD花屏显示问题的分析解决经验. 痞子衡最近这段时间在参与一个基于i.MXRT1170的大项目(先保个密),需要 ...

  3. linux系统CPU,内存,磁盘,网络流量监控脚本

    前序 1,#cat /proc/stat/ 信息包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累积到当前时刻 2,#vmstat –s 或者#vmstat 虚拟内存统计 3, #cat ...

  4. Zabbix通过SNMP监控多核CPU使用率时, 计算CPU平均使用率

    环境:没有Agent,只能通过SNMP监控时,需要获取多核CPU的平均使用率. ZABBIX的使用SNMP监控CPU使用率时,由于设备都是多核CPU,监控的都是单独某一核心的使用率,但单独某一核使用率 ...

  5. Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数)

    [转]Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数) 作为一个系统工程师来说,要看懂监控的数据至关重要,关系着优化和分析出现的问题.我是在运维过程中要用到的.因此,今天给出Wind ...

  6. Linux 性能监控之CPU&内存&I/O监控Shell脚本2

    Linux 性能监控之CPU&内存&I/O监控Shell脚本2   by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...

  7. centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息

    1.系统 1.1版本 uname -a 能确认是64位还是32位,其它的信息不多 [root@localhost ~]# uname -a Linux localhost.localdomain 3. ...

  8. python glances来监控linux服务器CPU 内存 IO使用

    什么是 Glances? Glances 是一个由 Python 编写,使用 psutil 库来从系统抓取信息的基于 curses 开发的跨平台命令行系统监视工具. 通过 Glances,我们可以监视 ...

  9. free如何知道释放内存长度:vs与glibc分配内存时编译器内部处理

    鉴于网上这个资料实在太少,将以前整理过却未完全的一篇文章贴出来,希望大牛指正vs下内存管理方式.可联系gaoshiqiang1987@163.com vs分配内存 vs没有源码,编译器在分配内存时,分 ...

  10. Windows系统CPU内存网络性能统计第一篇 内存

    最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...

随机推荐

  1. SQL语句编写的练习(MySQL)

    SQL语句编写的练习(MySQL) 一.建表 1.学生表(Student) 学号 | 姓名 | 性别 | 出生年月 | 所在班级 create table Student( sno varchar(2 ...

  2. 一、Go语言开篇介绍

    Go语言开篇介绍 Go语言 是Google公司 在2007开发一种静态强类型.编译型语言,并在 2009 年正式对外发布. Go语言以其近C的执行性能和近解析型语言的开发效率,以及近乎于完美的编译速度 ...

  3. OpenMP 入门

    OpenMP 入门 简介 OpenMP 一个非常易用的共享内存的并行编程框架,它提供了一些非常简单易用的API,让编程人员从复杂的并发编程当中释放出来,专注于具体功能的实现.openmp 主要是通过编 ...

  4. 剑指offer20题表示数值的字符串:这题实在是太优雅了

    目录 前言 一.憨憨初解 1.思路 2.代码 3.战绩 4.反思 二.看懂再解 1.思路 2.代码 3.C++版战绩 总结 前言 题目来源:https://leetcode.cn/problems/b ...

  5. Java环境搭建(推荐jdk8)

    本人使用的Windows10操作系统 1.Jdk8下载和安装 下载地址:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-d ...

  6. java学习之SpringMVC

    0x00前言 Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet. Spring MVC 是结构最清晰的 Servlet+ ...

  7. 【Virt.Contest】CF1155(div.2)

    CF 传送门 T1:Reverse a Substring 只有本身单调不减的字符串不能转换为字典序更小的字符串.否则肯定会出现 \(s_i>s_{i+1}\) 的情况. 所以只要从头到尾扫一遍 ...

  8. 【Java集合框架002】原理层面:HashMap全解析

    一.前言 二.HashMap 2.1 HashMap数据结构 + HashMap线程不安全 + 哈希冲突 2.1.1 HashMap数据结构 学习的时候,先整体后细节,HashMap整体结构是 底层数 ...

  9. Bigkey问题的解决思路与方式探索

    作者:vivo 互联网数据库团队- Du Ting 在Redis运维过程中,由于Bigkey 的存在,会影响业务程序的响应速度,严重的还会造成可用性损失,DBA也一直和业务开发方强调 Bigkey 的 ...

  10. 把Mybatis Generator生成的代码加上想要的注释

    作者:王建乐 1 前言 在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件.但是Mybatis Generator默认生成的代码中,注释并不是我 ...