Last active
January 29, 2021 15:48
-
-
Save fish-404/a0b438ef508941dfe66fc0c712129a3a to your computer and use it in GitHub Desktop.
Code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <reg51.h> | |
/* | |
* Author: Fish__404 | |
* 51单片机简易时钟 | |
*/ | |
#define uint unsigned int | |
#define uchar unsigned char | |
#define DIG 6 | |
#define COL 3 | |
/* 独立按键定义 */ | |
sbit KEY_SURE = P3^2; // 确认键/关闭闹钟键/清零 | |
sbit KEY_ALARM = P3^6; // 调节闹钟数值按键 | |
sbit KEY_TIME = P3^7; // 调节时钟数值按键 | |
sbit KEY_HOURADD = P1^0; // 小时+ | |
sbit KEY_HOURDEC = P1^1; // 小时- | |
sbit KEY_MINADD = P1^2; // 分钟+ | |
sbit KEY_MINDEC = P1^3; // 分钟- | |
sbit KEY_SECONDADD = P1^4; // 秒钟+ | |
sbit KEY_SECONDDEC = P1^6; // 秒钟- | |
/* LED定义 */ | |
sbit LED_BEEP = P3^4; // 闹钟时间到指示灯 | |
sbit LED_ALARM = P3^1; // 闹钟数值调节状态指示灯 | |
sbit LED_CLOCK = P3^0; // 时钟数值调节状态指示灯 | |
/* 蜂鸣器定义 */ | |
sbit BEEP = P3^3; | |
uchar alarm = 0; // 闹钟标志 | |
uint count = 0; // 定时器计数 | |
uchar min = 0; | |
uchar hour = 0; | |
uchar second = 0; | |
uchar time[] = {0, 0, 0, 0, 0, 0}; | |
uchar minA = 0; | |
uchar hourA = 0; | |
uchar secondA = 0; | |
uchar alarmTime[] = {0, 0, 0, 0, 0, 0}; | |
uchar flag = 0; // 调整状态标志 | |
unsigned char code table[] = { | |
0X3F, 0X06, 0X5B, 0X4F, 0X66, | |
0X6D, 0X7D, 0X07, 0X7F, 0X6F | |
}; // 段码表,数字0-9 | |
unsigned char code segment[] = { | |
0XFE, 0XFD, 0XFB, 0XF7, 0XEF, 0XDF | |
}; // 位选表 | |
/* 延时函数 */ | |
void delay(uint x) | |
{ | |
uint i, j; | |
for (i = 0; i < x; i++) | |
for (j = 0; j < 101; j++); | |
} | |
/* 时间显示 */ | |
void clockDisplay(uchar time[]) | |
{ | |
uint i; | |
for (i = 0; i < DIG; i++) { | |
P2 |= 0X3F; // 清除位选 | |
P0 = 0X00; // 消影 | |
P2 = segment[i]; // 位选 | |
P0 = table[time[i]]; // 段选 | |
delay(3); | |
} | |
} | |
/* 定时器初始化 */ | |
void timerInit() | |
{ | |
TMOD = 1 << TMOD; // TIME0定时器,方式1(16位) | |
TH0 = 0X3C; | |
TL0 = 0XB0; // 3CB0H = 15536,50ms | |
EA = 1; // 开启总中断 | |
ET0 = 1; // 使能定时器中断 | |
TR0 = 1; // 使能定时器 | |
} | |
/* 时间分割 */ | |
void timeDivide() | |
{ | |
time[0] = hour / 10; | |
time[1] = hour % 10; | |
time[2] = min / 10; | |
time[3] = min % 10; | |
time[4] = second / 10; | |
time[5] = second % 10; | |
} | |
void alarmDivide() | |
{ | |
alarmTime[0] = hourA / 10; | |
alarmTime[1] = hourA % 10; | |
alarmTime[2] = minA / 10; | |
alarmTime[3] = minA % 10; | |
alarmTime[4] = second / 10; | |
alarmTime[5] = second % 10; | |
} | |
/* 闹钟时间判断 */ | |
void alarmJudge() | |
{ | |
if (alarm == 1) { | |
if ((hour == hourA) && (min == minA) && (second == secondA)) { | |
BEEP = 1; | |
LED_BEEP = 1; | |
} | |
} | |
} | |
/* 定时器中断 */ | |
void timeInterrup() interrupt 1 | |
{ | |
count++; | |
TH0 = 0X3C; | |
TL0 = 0XB0; // 0.05s重新送数 | |
if (count == 20) { | |
second++; | |
count = 0; | |
if (second == 60) { | |
second = 0; | |
min++; | |
if (min == 60) { | |
min = 0; | |
hour++; | |
if (hour == 24) | |
hour = 0; | |
} | |
} | |
} | |
timeDivide(); | |
if (flag == 0) | |
clockDisplay(time); | |
alarmJudge(); // 判断闹钟到否 | |
} | |
/* 外设初始化 */ | |
void deviceInit() | |
{ | |
LED_BEEP = 0; | |
LED_ALARM = 0; | |
LED_CLOCK = 0; | |
BEEP = 0; | |
} | |
/* 键盘扫描 */ | |
void keyScan() | |
{ | |
if (KEY_TIME == 0) { | |
LED_CLOCK = 1; | |
flag = 1; | |
TR0 = 0; | |
clockDisplay(time); | |
if (KEY_HOURADD == 0) { | |
delay(10); | |
if (KEY_HOURADD == 0) { | |
hour++; | |
if (hour == 24) | |
hour = 0; | |
} | |
timeDivide(); | |
clockDisplay(time); | |
} | |
if (KEY_HOURDEC == 0) { | |
delay(10); | |
if (KEY_HOURDEC == 0) { | |
hour--; | |
if (hour == -1) | |
hour = 23; | |
} | |
timeDivide(); | |
clockDisplay(time); | |
} | |
if (KEY_MINADD == 0) { | |
delay(10); | |
if (KEY_MINADD == 0) { | |
min++; | |
if (min == 60) | |
min = 0; | |
} | |
timeDivide(); | |
clockDisplay(time); | |
} | |
if (KEY_MINDEC == 0) { | |
delay(10); | |
if (KEY_MINDEC == 0) { | |
min--; | |
if (min == -1) | |
min =59; | |
} | |
timeDivide(); | |
clockDisplay(time); | |
} | |
if (KEY_SECONDADD == 0) { | |
delay(10); | |
if (KEY_SECONDADD == 0) { | |
second++; | |
if (second == 60) | |
second = 0; | |
} | |
timeDivide(); | |
clockDisplay(time); | |
} | |
if (KEY_SECONDDEC == 0) { | |
delay(10); | |
if (KEY_SECONDDEC == 0) { | |
second--; | |
if (second == -1) | |
second =59; | |
} | |
timeDivide(); | |
clockDisplay(time); | |
} | |
} | |
if (KEY_ALARM == 0) { | |
LED_ALARM = 1; | |
flag = 2; | |
clockDisplay(alarmTime); | |
if (KEY_HOURADD == 0) { | |
delay(10); | |
if (KEY_HOURADD == 0) { | |
hourA++; | |
if (hourA == 24) | |
hourA = 0; | |
} | |
alarmDivide(); | |
clockDisplay(alarmTime); | |
} | |
if (KEY_HOURDEC == 0) { | |
delay(10); | |
if (KEY_HOURDEC == 0) { | |
hourA--; | |
if (hourA == -1) | |
hourA = 23; | |
} | |
alarmDivide(); | |
clockDisplay(alarmTime); | |
} | |
if (KEY_MINADD == 0) { | |
delay(10); | |
if (KEY_MINADD == 0) { | |
minA++; | |
if (minA == 60) | |
minA = 0; | |
} | |
alarmDivide(); | |
clockDisplay(alarmTime); | |
} | |
if (KEY_MINDEC == 0) { | |
delay(10); | |
if (KEY_MINDEC == 0) { | |
minA--; | |
if (minA == -1) | |
minA =59; | |
} | |
alarmDivide(); | |
clockDisplay(alarmTime); | |
} | |
if (KEY_SECONDADD == 0) { | |
delay(10); | |
if (KEY_SECONDADD == 0) { | |
secondA++; | |
if (secondA == 60) | |
secondA = 0; | |
} | |
alarmDivide(); | |
clockDisplay(alarmTime); | |
} | |
if (KEY_SECONDDEC == 0) { | |
delay(10); | |
if (KEY_SECONDDEC == 0) { | |
secondA--; | |
if (secondA == -1) | |
secondA =59; | |
} | |
alarmDivide(); | |
clockDisplay(alarmTime); | |
} | |
} | |
} | |
void keyIntterupt() interrupt 0 | |
{ | |
if (flag != 0) { | |
clockDisplay(time); | |
if (flag == 1) { | |
LED_CLOCK = 0; | |
TR0 = 1; | |
} | |
else if (flag == 2) { | |
LED_ALARM = 0; | |
alarm = 1; // 使能闹钟 | |
} | |
flag = 0; | |
} | |
else if (BEEP == 1) { // 关闭闹钟 | |
BEEP = 0; | |
LED_BEEP = 0; | |
} | |
else { // 时钟清零 | |
hour = 0; | |
min = 0; | |
second = 0; | |
} | |
} | |
void main() | |
{ | |
timerInit(); | |
deviceInit(); | |
IT0 = 1; // 开外部中断 | |
EX0 = 1; | |
while(1) { | |
keyScan(); | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 用于确认单精度浮点数表示方法的C语言程序(摘自《程序是怎样跑起来的》),做了一点改动 */ | |
#include <stdio.h> | |
#include <string.h> | |
int main() | |
{ | |
float data; | |
unsigned long buff; | |
int i; | |
char s[34]; | |
scanf("%f", &data); | |
// 把数据复制到 4 字节长度的整数变量 buff 中以逐个提取出每一位 | |
memcpy(&buff, &data, 4); | |
// 逐一提取出每一位 | |
for (i = 33; i >= 0; i--) { | |
if (i == 1 || i == 10) | |
// 加入破折号来区分符号部分、指数部分和尾数部分 | |
s[i] = '-'; | |
else { | |
if (buff % 2 == 1) | |
s[i] = '1'; | |
else | |
s[i] = '0'; | |
buff /= 2; | |
} | |
} | |
s[33] = '\0'; | |
printf("%s\n", s); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- | |
* Author: Fish__404 | |
* Create Date: 2021-01-27 | |
* Modify Date: 2021-01-29 | |
* Description: 处理SMS log文件,统计数量 (由于还不熟悉CSS和HTML,排版有点乱...) | |
* Log 样例: | |
* 12/19/2019 1:43:33 PM | |
* XXXXXXXXX发送至 12341234 成功! | |
* 12/19/2019 3:45:32 PM | |
* XXXXXXXXX发送至 11111234; 成功! | |
* 12/19/2019 4:00:13 P12341234M | |
* XXX处理完毕发送SMS至 +8612345678912 成功!Succeed to send single SMS! | |
* XXX处理完毕发送至 11111111 成功! | |
* XXX处理完毕抄送至 test@test.com; 成功! | |
--> | |
<html> | |
<head> | |
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script> | |
<style> | |
h1 { | |
text-align: center; | |
margin: 10px; | |
} | |
body { | |
margin: 10px; | |
} | |
table { | |
margin: 10px; | |
margin-left: 100px; | |
width: fit-content; | |
} | |
#tables { | |
display: inline-flex; | |
text-align: center; | |
} | |
td { | |
padding: 3 10 3 10; | |
width: fit-content; | |
text-align: center; | |
} | |
#userInput { | |
margin: 10px; | |
text-align: center; | |
} | |
button { | |
height: auto; | |
} | |
</style> | |
</head> | |
<body> | |
<div id="userInput"> | |
<h1>Vehicle Plan SMS Log Analysis</h1> | |
<label for="fileInput"> | |
Select a log file: | |
<input type="file" id="fileInput"> | |
</label> | |
<label for="begDate"> | |
Begin Date: | |
<input id="begDate" type="date"> | |
</label> | |
<label for="endDate"> | |
End Date: | |
<input id="endDate" type="date"> | |
</label> | |
<button id="alyBut">Analysis</button> | |
<button id="reset">Reset</button> | |
</div> | |
<hr> | |
<div id="tables"> | |
<table> | |
<thead> | |
<tr> | |
<th>Vehicle Log Analysis</th> | |
</tr> | |
<tr> | |
<td>Total SMS | |
<p id="totalSMS"></p> | |
</td> | |
<td>Fail | |
<p id="Fail"></p> | |
</td> | |
</tr> | |
<tr id="datarow"> | |
<td>Date</td> | |
<td>Phone</td> | |
<td>Status</td> | |
</tr> | |
</thead> | |
<tbody id="databody"> | |
</tbody> | |
</table> | |
<table id="monthlytb"> | |
<thead> | |
<tr> | |
<th>Analysis result by month</th> | |
</tr> | |
<tr> | |
<td>Month</td> | |
<td id="month"></td> | |
<td>Total</td> | |
<td id="mtotal"></td> | |
</tr> | |
</thead> | |
<tbody id="mdatabody"> | |
</tbody> | |
</table> | |
</div> | |
<div id="logtext" hidden="true"></div> | |
<script type="text/javascript"> | |
// 正则匹配Log中的日期类型 | |
var dateformat = /((\d{1,2}\/){2}\d{4}\s(\d{1,2}:){2}\d{1,2}\s[AP]M)|(\d{4}(\/\d{1,2}){2}\s(\d{1,2}:){2})\d{1,2}/; | |
var phoneFormat = /(\+86\d{11})|(\+852\d{11})|(\d{4}-\d{8})|(\d{3}-\d{4}-\d{4})|(\d{5})/g; | |
var dateOptions = { | |
year: "numeric", | |
month: "2-digit", | |
day: "2-digit", | |
hour: "2-digit", | |
minute: "2-digit", | |
second: "2-digit", | |
hour12: false | |
}; // 用于格式化日期显示 | |
var alyBut = document.getElementById('alyBut'); | |
var fileInput = document.getElementById('fileInput'); | |
var datarow = document.getElementById('datarow'); | |
var databody = document.getElementById('databody'); | |
var logtext = document.getElementById('logtext').textContent; | |
var mdatabody = document.getElementById('mdatabody'); | |
$('#alyBut').on('click', function() { | |
var begDate = new Date($('#begDate').val() != "" ? $('#begDate').val() : '1970-01-01'); | |
var endDate = new Date($('#endDate').val() != "" ? $('#endDate').val() : Date()); | |
clearTdbody(); | |
selectLogByDate(begDate, endDate); | |
}) | |
$('#reset').on('click', function() { | |
document.getElementById('begDate').value = ""; | |
document.getElementById('endDate').value = ""; | |
clearTdbody(); | |
}) | |
function exportSMSLog(text) { | |
var dateDate; | |
text = text.slice(184); // 处理掉前面的无效字符 | |
var logdata = text.split('\n'); | |
var newText = ""; | |
for (let element of logdata) { | |
if (element.match(dateformat)) { | |
dateDate = element; | |
} else { | |
if (element.match(/SMS/)) { | |
newText += new Intl.DateTimeFormat('en-US', dateOptions).format(new Date(dateDate)) + ';'; | |
newText += element.match(phoneFormat) + ';'; | |
if (element.match("Succeed")) { | |
newText += "Success"; | |
} else { | |
newText += "Fail"; | |
} | |
newText += '\n'; | |
} | |
} | |
} | |
logtext = newText.slice(0, -1); | |
} | |
function createTd(Text) { | |
return String('<td>' + Text + '</td>'); | |
} | |
function clearTdbody() { | |
databody.innerHTML = ""; | |
mdatabody.innerHTML = ""; | |
document.getElementById('totalSMS').innerText = ""; | |
document.getElementById('Fail').innerText = ""; | |
} | |
function dateJudge(date, begDate, endDate) { | |
if (date < begDate) | |
return 0; | |
else if (date > endDate) | |
return -1; | |
else | |
return 1; | |
} | |
function selectLogByDate(begDate, endDate) { | |
var total = 0, | |
fail = 0; | |
var logdata = logtext.split('\n'); | |
var month = -1; | |
var year = -1; | |
var mtotal = 0; | |
for (let record of logdata) { | |
cells = record.split(';'); | |
date = new Date(cells[0]); | |
if (dateJudge(date, begDate, endDate) == 0) { | |
continue; | |
} else if (dateJudge(date, begDate, endDate) == -1) | |
return; | |
total++; | |
if (cells[2] == "Fail") | |
fail++; | |
var tr = document.createElement('tr'); | |
tr.innerHTML += createTd(cells[0]) + createTd(cells[1]) + createTd(cells[2]); | |
databody.appendChild(tr); | |
if (date.getFullYear() != year) { | |
showMonthData(mtotal, year, month + 1); | |
year = date.getFullYear(); | |
month = date.getMonth(); | |
mtotal = 1; | |
} else if (date.getMonth() != month) { | |
showMonthData(mtotal, year, month + 1); | |
month = date.getMonth(); | |
mtotal = 1; | |
} else | |
mtotal += 1; | |
} | |
showMonthData(mtotal, year, month + 1); | |
document.getElementById("Fail").innerText = fail; | |
document.getElementById("totalSMS").innerText = total; | |
} | |
function showMonthData(mtotal, year, month) { | |
if (year != -1) { | |
var tr = document.createElement('tr'); | |
tr.innerHTML += createTd(year + '.' + month) + createTd(mtotal); | |
mdatabody.appendChild(tr); | |
} | |
} | |
// The function below is from https://stackoverflow.com/questions/27522979/read-a-local-text-file-using-javascript | |
fileInput.addEventListener('change', function() { | |
var file = fileInput.files[0]; | |
var textType = /text.*/; | |
if (file.type.match(textType)) { | |
var reader = new FileReader(); | |
reader.readAsText(file); | |
reader.onload = function() { | |
exportSMSLog(reader.result); | |
} | |
} else { | |
document.getElementById('logtext').hidden = false; | |
logtext = "File Not Supported!"; | |
} | |
}); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment