小弟也曬曬自己的時鐘程序。。。。。。。。。。。。。。。。。
//////////////////////////////////
//工程名稱;外部秒基準,電子鐘表//
//單片機型號:AT98S51 //
//時鐘頻率?12M? //
//制作時間;2009-7-13 //
//制作者;呂貝貝 //
//////////////////////////////////////////////////////////////////////////////////////
#include <reg51.h>
char TAB[10]={0X11,0Xbd,0X23,0X25,0X8d,0x45,0x41,0x3d,0x01,0x05};//數碼管0-9編碼
char disp[4]={0,0,0,0};//四位數碼管初始化都為零
unsigned char scan;//位數掃描寄存器
unsigned char s=0;//秒寄存器
unsigned char f=0;//分寄存器
unsigned char h=0;//時寄存器
unsigned char f1=0;//分個位寄存器
unsigned char f2=0;//分十位寄存器
unsigned char h1=0;//時個位寄存器
unsigned char h2=0;//時十位寄存器
sbit fj=P3^7;//分位加1引腳
sbit hj=P3^6;//時位加1引腳
sbit zd=P3^3;//中斷1引腳
void disp1m(int);//定義延時函數
void ff(unsigned char);//定義分位分裂函數
void fh(unsigned char);//定義時位分裂函數
////////////////////////////////////////////////////////////////////////////////////////
main()
{
IE=0X85;//準許INT0中斷,準許int1中斷
IP=0x04;//設定INT1具有最高優(yōu)先級
TCON=0X05;//INT0設置負邊緣觸發(fā),int1設置負邊緣觸發(fā)。
while(1)
{
char i,j;
scan=1;
for(i=3;i>=0;i--)
{
j=disp;
P1=TAB[j];
P2=scan;
disp1m(4);
scan<<=1;
}
disp[0]=h2;//顯示時十位
disp[1]=h1;//顯示時個位
disp[2]=f2;//顯示分十位
disp[3]=f1;//顯示分個位
}
}
//////////////////////////////////////////////////////////////////////////////////////////
void my_int0(void)interrupt 0//外部中斷0,P3.2,秒脈沖輸入短,下降邊緣觸發(fā)
{
s++;//秒寄存器加1
if(s==60)//秒數是否到六十
{
s=0;//秒數清零
f++;//分數寄存器加1
if(f==60)//分是否到60
{
f=0;//分數清零
h++;//時寄存器加1
if(h==24)//時是否到24
{
h=0;
}
}
}
ff(f);//調用分位分裂函數
fh(h);//調用時位分裂函數
P3=255;
}
///////////////////////////////////////////////////////////////////////////////////////////
void my_int1(void)interrupt 2//外部中斷1,P3.3。時間調整輸入端下降邊緣觸發(fā)
{
disp1m(10);//延時消除抖動
if(zd==0)//再次判斷中斷腳位是否在低電平
{
if(hj==0)//判斷是時要修改
{
if(h==24){h=0;}else{h++;};//時加1
}
else if(fj==0)//判斷是分要修改
{
if(f==60){f=0;}else{f++;}//分加1
}
else {}//都不是,退出中斷,
}
P3=255;//P3腳位全部拉高,以便等待下一個中斷
}
//////////////////////////////////////////////////////////////////////////////////////////////
void ff(unsigned char y)//分位分裂函數
{
f1=y%10;
f2=y/10;
}
//--------------------------------------
void fh(unsigned char y)//時位分裂函數
{
h1=y%10;
h2=y/10;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void disp1m(x)//延時函數
{
int i,j;
for(i=0;i<x;i++)
for (j=1;j<=150;j++);
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |