基於AT89C52做秒錶0~99秒
1、應網友要求做了個秒錶。
2、定期器採用10毫秒,數碼管後2位顯示的是毫秒,故100毫秒進1秒,100毫秒*定時器10毫秒故就是1秒。
3、使用3個獨立按鍵,按鍵2表示啟動秒錶,按鍵3表示暫停秒錶,按鍵4表示清除秒錶且暫停秒錶。
4、已在我的清翔51開發板上實現,表現良好(只是按鍵的時候數碼管會滅),這個我就不解了,需要用定時器做按鍵判斷。
main.c
#include "Time.h"
#include "key.h"
#include <reg52.h>
#include "dt.h"
void main(void)
{
unsigned char dt_state=1;//數碼管標誌位
Timer0_16bit(10);//配置初始化定時器0為10毫秒
convert_data(9999,4);//初始化數碼管
while(1)
{
if(dt_state)//主程式驅動數碼管標誌位
{
dt_display(4);//使用主程式驅動數碼管
}
switch(key2345())
{
case 2:TR0=1;dt_state=0;break;//啟動秒錶,且使用定時器驅動數碼管
case 3:TR0=0;dt_state=1;break;//暫停秒錶,且使用主程式驅動數碼管
case 4:TR0=0;TIME=0;convert_data(TIME,4);dt_state=1;break;//清除時間,且暫停計時器,且使用主程式驅動數碼管
break;
}
}
}
delay.h
//這是一個延遲函式為毫秒級//
#ifndef __DELAY_H__
#define __DELAY_H__
void delay_ms(unsigned char ms);//最大輸入255,ms=1,最小1ms時間
#endif // !__DELAY_H__
delay.c
//軟體延遲ms級別
void delay_ms(unsigned char ms) //設定毫秒級別延遲函式,z最大輸入65535
{
unsigned char x;
for (; ms > 0; ms--)
for (x = 114; x > 0; x--);
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include <reg52.h>
#include "delay.h"
//獨立按鍵
sbit key_S2 = P3^0;
sbit key_S3 = P3^1;
sbit key_S4 = P3^2;
sbit key_S5 = P3^3;
#define key_all P3
//按鍵佔用P3口
unsigned char key2345(void); //函式返回值為2、3、4、5分別對應按鍵2、按鍵3、按鍵4、按鍵5,本函式只迴圈一次
#endif // !__KEY_H__
key.c
//獨立按鍵 S2 S3 S4 S5
//分別對應 P30 P31 P32 P33
#include"key.h"
//獨立按鍵使用switch語句
unsigned char key2345(void) //函式返回值為2、3、4、5分別對應按鍵2、按鍵3、按鍵4、按鍵5,本函式只迴圈一次
{
key_all |= 0x0f;
if ((key_all&0x0f) != 0x0f) //&運算子沒有!=高,故需要加()括號
{
delay_ms(10);
if ((key_all & 0x0f) != 0x0f)
{
switch (key_all & 0x0f)
{
case 0x0e:while ((key_all & 0x0f) != 0x0f);return 2; //while在這裡進行鬆手檢測
case 0x0d:while ((key_all & 0x0f) != 0x0f);return 3; //while在這裡進行鬆手檢測
case 0x0b:while ((key_all & 0x0f) != 0x0f);return 4; //while在這裡進行鬆手檢測
case 0x07:while ((key_all & 0x0f) != 0x0f);return 5; //while在這裡進行鬆手檢測
}
}
}
return 0;//沒有按鍵按下時返回0
}
Time.h
#ifndef __TIME_H__
#define __TIME_H__
#include <REG52.h>
extern unsigned int TIME;
//定時器0初始化,並設定ms毫秒且工作方式1,16位模式
void Timer0_16bit(unsigned char time0_16_bit_ms);
#endif // !__TIME_H__
Time.c
#include "Time.h"
#include "dt.h"
static unsigned char H0 = 0, L0 = 0;
unsigned int TIME=0;
//定時器0初始化,設定ms毫秒且工作方式1,16位模式
void Timer0_16bit(unsigned char time0_16_bit_ms)
{
TMOD |= 0x01;
TH0 =(65536 - (unsigned int)(time0_16_bit_ms * 921.6)) / 256;//需將計算的小數轉換整形
TL0 =(65536 - (unsigned int)(time0_16_bit_ms * 921.6)) % 256;//需將計算的小數轉換整形
H0 = TH0;
L0 = TL0;
EA = 1;//開啟總中斷
ET0 = 1;//允許定時器0溢位進入中斷
TR0 = 0;//先關閉定時器
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = H0;
TL0 = L0;
dt_display(4);//每隔10毫秒重新整理一下4個數碼管
convert_data(TIME,4);//每隔10毫秒轉換一下時間
if(TIME++==9999)//數碼管最大顯示99.99秒
{
TIME=0;
}
}
相關文章
- JavaScript 秒錶效果JavaScript
- 如何基於R包做GO分析?實現秒出圖Go
- JavaScript 秒錶效果詳解JavaScript
- 【Java】Java計時器(秒錶)Java
- 如何使用Python 實現秒錶功能?Python
- Win10系統怎麼開啟秒錶 win10系統秒錶的使用教程Win10
- 【實戰】基於OpenCV的水錶字元識別(OCR)OpenCV字元
- 基於redis分散式鎖實現“秒殺”Redis分散式
- 基於redis做分散式鎖Redis分散式
- 秒殺最佳化-基於阻塞佇列實現秒殺最佳化佇列
- 《驚奇劍士》:0基礎做遊戲”的完美案例遊戲
- 基於雲原生的秒殺系統設計思路
- 基於RBAC做資料許可權
- Just for fun——基於Swoole做個小框架框架
- JDK原始碼閱讀(十二) : 基於跳錶的併發容器——ConcurrentSkipListMapJDK原始碼
- 基於區塊鏈究竟可以做什麼?區塊鏈
- 基於DataLakeAnalytics做跨地域的資料分析
- iOS網路層封裝(基於AFNetworking3 0)iOS封裝
- 基於 Serverless+OSS 分分鐘實現圖片秒變素描Server
- 如何低投入0基礎做少兒程式設計?(開源乾貨!)程式設計
- Android基於fms的視屏通訊咋做Android
- 為基於意圖的網路做準備
- Java程式猿筆記——基於redis分散式鎖實現“秒殺”Java筆記Redis分散式
- 基於Drone實現CI/CD【0到1架構系列】架構
- 實戰 | 0~1基於模板開發問卷小程式
- 想轉行做IT!0基礎應該要學習哪個技術啊?
- PHP 中基於 Casbin 做 RBAC + RESTful 許可權控制PHPREST
- 優效學院 基於微服務的秒殺專案實戰 Spring Boot 2.0基礎微服務Spring Boot
- 基於Google earth engine python API做基於影像的定量反演——步驟及問題總結GoPythonAPI
- 0基礎轉行做網際網路運營你需要做到哪些
- [譯] Flutter 到底有多快?我開發了秒錶應用來弄清楚。Flutter
- 7.5 使用binary log 做基於時間點的恢復
- 從0到1構建基於自身業務的前端工具庫前端
- 基於JDK9的Spring核心爆RCE 0-day漏洞 - CyberJDKSpring
- 基於Jenkins+Maven+Gitea+Nexus從0到1搭建CICD環境JenkinsMavenGit
- 推薦系統實踐 0x09 基於圖的模型模型
- DevOPS實戰:從0到1搭建基於Docker的Gitlab CI/CDdevDockerGitlab
- 基於物聯網閘道器的水電錶感測器資料採集系統