文章结构:

-项目概述-

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

目的:

  • 显示电脑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. Vue学习之--------列表排序(ffilter、sort、indexOf方法的使用)、Vue检测数据变化的原理(2022/7/15)

    文章目录 1.列表排序 1.1 .代码实例 1.2 .测试效果 1.3.需要掌握的前提知识 2.Vue监测数据变化的原理 2.1.代码实例 2.2 .测试效果 3.Vue检测数据的原理 3.1 基本知 ...

  2. java 新特性之 Stream API

    强大的 Stream API 一.Stream API 的概述 Stream到底是什么呢? 是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. "集合讲的是数据,Stream讲的是 ...

  3. 基于vite3+tauri模拟QQ登录切换窗体|Tauri自定义拖拽|最小/大/关闭

    前两天有给大家分享tauri+vue3快速搭建项目.封装桌面端多开窗口.今天继续来分享tauri创建启动窗口.登录窗口切换到主窗口及自定义拖拽区域的一些知识.希望对想要学习或正在学习的小伙伴有些帮助. ...

  4. AT24C02

    AT24C02是一款拥有256bytes(32Page)的EEPROM. 一 :特点(部分) 1:双线接口: 2:双向数据传输协议: 3:400KHz波特率: 4:硬件写保护: 5:最大5ms写入同步 ...

  5. C#中ref和out关键字的应用以及区别(参数修饰符)

    ref ref的定义 ref是reference的缩写,通过引用来传递参数的地址,ref基本上是服务于值类型的 ref的使用 //不使用 ref; void Method(int myRefInt) ...

  6. VUE v-model 语法糖

    v-model 语法糖 描述:弹出利用v-model语法糖 父组件 子组件

  7. 华为云 MRS 基于 Apache Hudi 极致查询优化的探索实践

    背景 湖仓一体(LakeHouse)是一种新的开放式架构,它结合了数据湖和数据仓库的最佳元素,是当下大数据领域的重要发展方向. 华为云早在2020年就开始着手相关技术的预研,并落地在华为云 Fusio ...

  8. 将自己的组件打包发布到npm

    在项目中有些组件在各个项目中都会调用,那么将组件发布到npm ,用到的项目去下载,这样会省去一些不必要的麻烦. 将组件发布到npm 中的步骤 做个记录 1.项目的创建,我这里使用 vue init w ...

  9. vulnhub靶场之DOUBLETROUBLE: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:DOUBLETROUBLE: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub ...

  10. (C++) std::move std::forward及使用

    概念 std::ref :针对std::thread,需要把实参显式转换为引用类型: std::move :无条件把参数转换为右值:但是右值赋值给新变量时,实际还要看是否满足右值条件,如const s ...