⑴ 51單片機數字秒錶設計用4位數碼管分別顯示十秒,秒,百毫秒,十毫秒計時范圍為10ms到99s
/***************************************************************************/
#include <reg51.h>
sbit Axs=P1^3; sbit Bxs=P1^2; sbit Cxs=P1^1; sbit Dxs=P1^0;//數碼管位選埠
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
void YS(char hs); void XS(int xm,int xs); void Time1(void);int n,i,m,s;
/***************************************************************************/
void main(void){Time1();while(1){XS(m,s);}}//主函數
/***************************************************************************/
void int1() interrupt 1 //定時器中斷
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;
if(n>1000){n=0;s++; if(s>59){s=0;m++;if(m>59){m=0;}}}
}
/***************************************************************************/
void Time1(void)//定時器初始化
{
TH0=(65536-921)/256; TL0=(65536-921)%256;
TMOD=0x01; EA=1; ET0=1; TR0=1;
}
/***************************************************************************/
void XS(int xm,int xs) //數碼管顯示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xm/1)%10; d4=(xm/10)%10;
P0=table[d1]; Axs=0; YS(10); Axs=1;//個位顯示
P0=table[d2]; Bxs=0; YS(10); Bxs=1;//十位顯示
P0=table[d3]; Cxs=0; YS(10); Cxs=1;//百位顯示
P0=table[d4]; Dxs=0; YS(10); Dxs=1;//千位顯示
}
/***************************************************************************/
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延時函數
/***************************************************************************/
數碼管的埠用的可能不一樣,自己改下
⑵ 奼傚崟鐗囨満4浣嶆暟瀛楅挓鐨勭▼搴
#include<AT89X52.H>
#defineucharunsignedchar
#define FLASH_FREQ 100
sbitKEY1=P1^4; //瀹氫箟KEY1 鍒嗗姞1
sbitKEY2=P1^5; //瀹氫箟KEY2 縐掑姞1
#defineCOM1_ON(P2=0xf7) //11111110 //浣庣數騫崇偣浜
#defineCOM2_ON(P2=0xfb) //11111101
#defineCOM3_ON(P2=0xfd) //11111011
#defineCOM4_ON(P2=0xfe) //11110111
#defineCOMS_OFF(P2=0xff) /*鏁扮爜綆″叏鐏瀹忓畾涔*/
#defineSEG_PORT (P0) /*孌電爜鏁版嵁杈撳嚭絝鍙*/
ucharcodeLED_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//鍏遍槼鏋,COM閲囩敤7404鍙栧弽椹卞姩
#defineDISPLAY_BIT 4 //鏁扮爜綆℃樉紺轟綅鏁
ucharDisBuff[DISPLAY_BIT]; //鏄劇ず緙撳啿鍖
bitDisDecemal=0;//鏄鍚︽樉紺哄皬鏁扮偣
ucharshi=11,fen=59,miao=49;
voiddelay(ucharms)//1ms寤舵椂,12MHz
{
uchari,j;
for(i=ms;i>0;i--)
for(j=122;j>0;j--);
}
voidLED_DisplayTimer(ucharLED1,ucharLED2,ucharLED3,ucharLED4)
{
DisBuff[0]=LED_Tab[LED1];
DisBuff[1]=LED_Tab[LED2];
DisBuff[2]=LED_Tab[LED3];
DisBuff[3]=LED_Tab[LED4];
/**************灝忔暟鐐歸棯鐑佸湪榪欓噷鎺у埗*****/
if(DisDecemal==1)
DisBuff[1]&=0x7f; //鐐逛寒灝忔暟鐐
/**************************************/
}
voidTimer0_Init(void)//@12MHz,STC8952
{
TMOD=0x01;
TH0=(65536-5000)>>8; //閲嶈5ms鐨勫垵鍊
TL0=(65536-5000);
IE=0x82;
TR0=1;
}
voidDisplay_Scan(void)//鍏遍槾鏋佹暟鐮佺 <5ms璋冪敤涓嬈
{
staticucharCOM;
COM++;
if(COM>=DISPLAY_BIT) COM=0; //COM鐨勫煎湪0,1,2,3涔嬮棿鍒囨崲
COMS_OFF; //鍒囨崲鍓嶅皢鍏ㄩ儴鏄劇ず鏆傛椂鍏抽棴,閬垮厤鉶氬獎,鎵璋撹櫄褰卞氨鏄鏁扮爜綆$湅璧鋒潵"鍏ㄤ寒"
switch(COM)
{
case0:SEG_PORT=DisBuff[0]; //鏃鍗佷綅
COM1_ON;
break;
case1:SEG_PORT=DisBuff[1]; //鏃涓浣
COM2_ON;
break;
case2:SEG_PORT=DisBuff[2]; //鍒鍗佷綅
COM3_ON;
break;
case3:SEG_PORT=DisBuff[3]; //鍒涓浣
COM4_ON;
break;
}
}
voidKeyScan(void)//閿鐩樻壂鎻忕▼搴
{
if(KEY1==0)
{
delay(5);
if(KEY1==0)
{
shi++;
if(shi==24)
shi=0;
while(!KEY1)//絳夊緟鎸夐敭閲婃斁, 浠跨湡鎸夐敭闀挎椂闂翠笉閲婃斁,褰卞搷鏄劇ず
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
}
}
}
else if(KEY2==0)
{
delay(5);
if(KEY2==0)
{
fen++;
if(fen==60)
fen=0;
while(!KEY2)//絳夊緟鎸夐敭閲婃斁
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
}
}
}
}
voidmain()
{
Timer0_Init();
while(1)
{
LED_DisplayTimer(shi/10,shi%10,fen/10,fen%10);
KeyScan(); //閿鐩樻壂鎻
}
}
voidTimer0(void)interrupt1 using3 //鍓嶅彴紼嬪簭
{
staticucharflashFREQ;//闂鐑侀戠巼鎺у埗
staticucharmms;//緇熻′腑鏂嬈℃暟,鍋氭椂閽熺殑鍩哄噯婧
flashFREQ++;
mms++;
TH0=(65536-5000)>>8; //閲嶈5ms鐨勫垵鍊
TL0=(65536-5000);
if(mms==200)//5*200=1000
{
mms=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
Display_Scan(); //鍔ㄦ佹壂鎻忔暟鐮佺 <5ms璋冪敤涓嬈
if(flashFREQ>=FLASH_FREQ)
flashFREQ=0; //闂鐑佽℃椂
if(flashFREQ>=FLASH_FREQ/2)//闂鐑佸叾瀹炲氨鏄涓鍗婃椂闂存e父鏄劇ず,涓鍗婃椂闂翠笉鏄劇ず鑰屽凡,鎵浠ユ垜浠鐪嬭搗鏉ユ槸闂鐑佹晥鏋
DisDecemal=1;
else
DisDecemal=0;
}
鎸夐敭浣犺嚜宸辨洿鏀,榪欎釜紼嬪簭閲岀殑鏁扮爜綆℃壂鎻忕▼搴忓緢緇忓吀,鎸夐敭紼嬪簭鍐欑殑寰堟悡,涓嶈繃瀵逛粯浣犵殑璇劇▼璁捐℃槸鏍規湰閮芥湪鏈夐棶棰樼殑!!!!!!!!!!!
⑶ 51單片機求這個時鍾的c語言程序
以下是四位數碼管可調時帶秒閃爍的c51單片機電子鍾程序(c語言)。
/**** 本程序中,晶振為12MHz, ****/
/**** 時間控制採用定時中斷控制方式。 ****/
/**** 模式和時間調整採用查詢方式。 ****/
#include<reg52.h>
sbit P20=P2^0; //分個位控制端
sbit P21=P2^1; //分十位控制端
sbit P22=P2^2; //時個位控制端
sbit P23=P2^3; //時十位控制端
sbit led=P2^7; //second display led
sbit key0=P3^0; //模式設置
sbit key1=P3^1; //加
sbit key2=P3^2; //減
unsigned char hour,min,sec,T50ms;
unsigned char modstate; //模式狀態
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段碼
void init(); //初始化子程序聲明
void delay500us(unsigned char X); //延時子程序聲明
void display(); //顯示子程序聲明
void display001(); //顯示子程序聲明
void display002(); //顯示子程序聲明
void keyscan(); //按鍵識別子程序聲明
void main()
{
init();
while(1)
{
keyscan();
}
}
void init() //初始化子程序
{
TMOD=0x01;
TH0=(65536-49990)/256;
TL0=(65536-49990)%256;
ET0=1;
EA=1;
TR0=1;
}
void delay500us(unsigned char X)
{
unsigned char i,j;
for(i=X;i>0;i--)
for(j=248;j>0;j--);
}
void timer0() interrupt 1 //timer0中斷服務子程序,定時時間為50ms,本程序加了10us的時間修正量
{
TMOD=0x01;
TH0=(65536-49990)/256;
TL0=(65536-49990)%256;
T50ms++;
if(T50ms>=20)
{
T50ms=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)hour=0;
}
}
}
}
void display()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
P21=0;
delay500us(5);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min%10];
P20=0;
delay500us(5);
if(T50ms<=10)led=0;
if(T50ms>10)led=1;
}
void display001()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour/10];
P23=0;
delay500us(10);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[hour%10];
P22=0;
delay500us(10);
}
void display002()
{
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min/10];
P21=0;
delay500us(10);
P20=1;
P21=1;
P22=1;
P23=1;
P0=table[min%10];
P20=0;
delay500us(10);
}
void keyscan() //按鍵識別鍾程序
{
while(modstate==0)
{
display();
if(key0==0)
{
display();
if(key0==0)modstate++; //這兩句加在一起為延時10ms軟體防抖設計。
while(key0==0)display001(); //等待按鍵釋放。
}
}
//****************************************************************************//
while(modstate==1)
{
display001();
if(key0==0)
{
display001();
if(key0==0)modstate++; //這兩句加在一起為延時10ms軟體防抖設計。
while(key0==0)display002(); //等待按鍵釋放。
}
if(key1==0)
{
display001();
if(key1==0)
{
hour++;
if(hour>=24)hour=0;
while(key1==0)display001();
}
}
if(key2==0)
{
display001();
if(key2==0)
{
hour--;
if(hour>=24)hour=0;
while(key2==0)display001();
}
}
}
//****************************************************************************//
while(modstate==2)
{
display002();
if(key0==0)
{
display002();
if(key0==0)modstate=0; //這兩句加在一起為延時10ms軟體防抖設計。
while(key0==0)display(); //等待按鍵釋放。
}
if(key1==0)
{
display002();
if(key1==0)
{
min++;
if(min>=60)min=0;
while(key1==0)display002();
}
}
if(key2==0)
{
display002();
if(key2==0)
{
min--;
if(min>=60)min=0;
while(key2==0)display002();
}
}
}
}