標(biāo)題:
at89c52單片機(jī)+8位數(shù)碼管實(shí)現(xiàn)秒表程序
[打印本頁]
作者:
sangday
時(shí)間:
2020-7-23 16:24
標(biāo)題:
at89c52單片機(jī)+8位數(shù)碼管實(shí)現(xiàn)秒表程序
有重啟,終止,停表功能。(復(fù)位電路及外部晶振忽略)
protues8仿真圖如下:
ab9eb7910ef7e387b2c8f31560043f1a.png
(88.42 KB, 下載次數(shù): 29)
下載附件
2020-7-23 17:23 上傳
程及仿真在附件中下載
單片機(jī)源程序如下:
#include <REGX52.H>
char code seg7cat[18] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0x7F};//'-'
void delayms(unsigned int td);
void seg7x8_display(unsigned char *p);
void clock_refresh(void);
void stop_2(void);
void Int0Init();
unsigned char T0CNT,M,S,SD2;
unsigned int stop1=0,stop2=1;
unsigned char dis_buf[9];
sbit k1=P3^2; //定義獨(dú)立按鍵K1
sbit k2=P3^3; //定義獨(dú)立按鍵K2
sbit k3=P3^4; //定義獨(dú)立按鍵K3
void main(void)
{
unsigned char i;
Int0Init();
T0CNT = M = SD2 = S = 0;
for(i=0;i<8;i++) dis_buf[ i ] = 0; //清除顯示緩存
TH0 = (65536-500)/256;
TL0 = (65536-500)%256; //定時(shí)時(shí)間50ms,0.5ms
TMOD = 0x11;
ET0 = 1;
EA = 1;
TR0 = 1;
for(;;)
{
stop_2();
seg7x8_display(dis_buf);
}
}
void timer0_isr(void) interrupt 1
{ TH0 = (65536-500)/256;
TL0 = (65536-500)%256;
if( ++T0CNT >=20)
{ T0CNT = 0; P1 = ~P1;
clock_refresh();
}
}
// 設(shè)置外部中斷0
void Int0Init()
{
//設(shè)置INT0,外部中斷0
IT0=1;
EX0=1;
//設(shè)置INT0,外部中斷1
IT1=1;
EX1=1;
EA=1;
}
//延時(shí)子程序
void delayms(unsigned int td)
{ unsigned int i,j;
for(i=0;i<td;i++)
for(j=0;j<120;j++){}
}
//顯示子程序
void seg7x8_display(unsigned char *p)
{ unsigned char i;
for(i=0;i<8;i++)
{
if(i==5)
{P0 = (127&(int)seg7cat[dis_buf[8]]);}
else
{P0 = seg7cat[p[i]];}
P2 = ~(1<<i); delayms(4);
P2 = 0xFF; delayms(1);
}
}
void clock_refresh(void)
{
if(++SD2 >= 100)
{
SD2=0;
if(++S>=60)
{
S = 0;
if(++M>=60)
M = 0;
}
}
if(stop2)
{
dis_buf[0] = M/10;
dis_buf[1] = M%10;
dis_buf[2] = 16;
dis_buf[3] = 16; //'-’
dis_buf[4] = S/10;
dis_buf[5] = 17; //'.’
dis_buf[6] = SD2/10;
dis_buf[7] = SD2%10;
dis_buf[8] = S%10;
}
}
//歸零
void Int0() interrupt 0 //外部中斷0的中斷函數(shù)
{
unsigned char i;
if(k1==0)
{
for(i=0;i<100;i++)
{
if(k1==0){i=0;}
}
T0CNT = M = SD2 = S = 0;
}
}
//暫停,停表
void Int1() interrupt 2 //外部中斷1的中斷函數(shù)
{
unsigned char i;
if(k2==0)
{
for(i=0;i<10;i++)
{
if(k2==0){i=0;}
}
stop1 = !stop1;
while(stop1)
{
if(k2==0)
{
for(i=0;i<10;i++)
{
if(k2==0){i=0;}
}
stop1 = !stop1;
}
seg7x8_display(dis_buf);
}
}
}
//停表
void stop_2(void)
{
unsigned char i;
if(k3==0)
{
for(i=0;i<10;i++)
{
if(k3==0){i=0;}
}
stop2 = !stop2;
}
}
復(fù)制代碼
所有資料51hei提供下載:
秒表.zip
(35.47 KB, 下載次數(shù): 24)
2020-7-23 16:23 上傳
點(diǎn)擊文件名下載附件
資料下載
下載積分: 黑幣 -5
作者:
白馬義從
時(shí)間:
2020-10-24 10:31
仿真嘞
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1