⑴ 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();
}
}
}
}