Skip to content

Instantly share code, notes, and snippets.

@fish-404
Last active January 29, 2021 15:48
Show Gist options
  • Save fish-404/a0b438ef508941dfe66fc0c712129a3a to your computer and use it in GitHub Desktop.
Save fish-404/a0b438ef508941dfe66fc0c712129a3a to your computer and use it in GitHub Desktop.
Code
#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();
};
}
/* 用于确认单精度浮点数表示方法的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;
}
<!--
* 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