欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機精確計時的秒表程序
[打印本頁]
作者:
jkla
時間:
2020-4-5 22:07
標題:
單片機精確計時的秒表程序
這個秒表目前可實現:開始計時、停止計時和清零三個功能。這個秒表的設計思路是這樣的:首先需要一個8位數碼管(因為要顯示分、秒、毫秒),用3-8譯碼器位選。再任選一個8位IO口進行段碼傳輸;按鍵的控制是使用74HC165芯片對鍵盤數據讀入單片機(并行轉串行);主要是使用定時器及其中斷,我使用的是Timer0,它配置見程序中的Timer0Init()函數。
單片機源程序如下:
#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71}; //共陰
u8 code clear[8] = {0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f}; //8位數碼管歸零
u8 Digdisplay[8]; //儲存分 秒 毫秒
//全局變量
u8 ssec, sec, min;
u16 num;
//3-8譯碼器控制引腳
sbit LSA = P1^0;
sbit LSB = P1^1;
sbit LSC = P1^2;
//74HC165芯片引腳
sbit SF_LD = P1^3;
sbit CLK = P1^4;
sbit IN_data = P1^5;
/****************************************
延時函數,延時大約10μs
****************************************/
void delay(u16 i)
{
while(i--);
}
/****************************************
74HC165芯片讀獨立按鍵數據函數
****************************************/
u8 Read74HC165()
{
u8 i;
u8 indata = 0x00;
SF_LD = 0;
_nop_();
SF_LD = 1;
for(i = 0; i < 8; i++)
{
indata = indata << 1;
CLK = 0;
_nop_(); //低電平一段時間,寫入數據
indata |= IN_data; //寫數據
CLK = 1;
}
return indata;
}
/****************************************
秒表控制函數
用于秒表的開始、暫停和歸零
****************************************/
void KeyPros()
{
u8 hc = Read74HC165();
if(hc == 0xfe) //開始計時
{
TR0 = 1;
}
else if(hc == 0xfd)
{
TR0 = 0;
}
else if(hc == 0xfb)
{
ssec = 0;
sec = 0;
min = 0;
}
}
/****************************************
數碼管掃描函數(使用3-8譯碼器)
****************************************/
void DigPros()
{
u8 i;
for(i = 0; i < 8; i++)
{
switch(i)
{
case 0: LSA = 0; LSB = 0; LSC = 0; break;
case 1: LSA = 1; LSB = 0; LSC = 0; break;
case 2: LSA = 0; LSB = 1; LSC = 0; break;
case 3: LSA = 1; LSB = 1; LSC = 0; break;
case 4: LSA = 0; LSB = 0; LSC = 1; break;
case 5: LSA = 1; LSB = 0; LSC = 1; break;
case 6: LSA = 0; LSB = 1; LSC = 1; break;
case 7: LSA = 1; LSB = 1; LSC = 1; break;
}
P0 = Digdisplay[i]; //發送段碼
delay(100); //隔一段時間掃描
P0 = 0x00; //防止重影,清空數碼管
}
}
/****************************************
分、秒、毫秒數據寫入全局數組
****************************************/
void DigtalPros()
{
Digdisplay[0] = smgduan[min/10];
Digdisplay[1] = smgduan[min%10];
Digdisplay[2] = 0x40;
Digdisplay[3] = smgduan[sec/10];
Digdisplay[4] = smgduan[sec%10];
Digdisplay[5] = 0x40;
Digdisplay[6] = smgduan[ssec/10];
Digdisplay[7] = smgduan[ssec%10];
}
/****************************************
Timer0定時器配置
****************************************/
void Timer0Init()
{
TMOD |= 0x01; //選擇定時器T0
TH0 = 0xd8;
TL0 = 0xf0; //設定初值55536 計時10ms
ET0 = 1; //允許T0中斷
EA = 1; //開啟總中斷
//TR0 = 1; //開啟定時器T0
// TR0 = 0; //關閉定時器T0
}
/****************************************
分、秒、毫秒處理函數
****************************************/
void M_SEC_SSEC()
{
if(ssec >= 100)
{
ssec = 0; //清零
sec++;
if(sec >= 60)
{
sec = 0; //清零
min++;
if(min >= 60)
{
min = 0; //清零
}
}
}
}
void main(void)
{
// GPIO_LED = 1; //初始化LED
Timer0Init(); //初始化定時器T0
while(1)
{
KeyPros(); //控制秒表函數
M_SEC_SSEC();
DigtalPros();
DigPros(); //掃描數碼管
}
}
/****************************************
Timer0中斷處理函數
****************************************/
void Time0() interrupt 1
{
TH0 = 0xd8;
TL0 = 0xf0; //重裝載初值
ssec++; //中斷一百次,ssec=100,即1s
num++;
}
復制代碼
以上程序51hei提供下載:
電子秒表.rar
(25.26 KB, 下載次數: 15)
2020-4-5 22:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1