① 51單片機編程2位數碼管倒計時,從10秒開始每隔一秒減一當減到零有重復回到10秒
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//主程序
void main()
{
P0=0x06; //顯示10
P2=0x3f;
i=0;
Second_Counts=100;
TMOD=0x01; //定時器0方式1
TH0=(65536-50000)/256; //定時器0: 5ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1
while(1) ;
}
//T0中斷函數
void DSY_Refresh() interrupt 1
{
TH0=(65536-50000)/256; //恢復定時器0初值
TL0=(65536-50000)%256;
if(++i==2) //50ms*2=0.1s轉換狀態
{
i=0;
Second_Counts--;
P0=DSY_CODE[Second_Counts/100];
P2=DSY_CODE[(Second_Counts/10)%10];
if(Second_Counts<=-1) Second_Counts=100; //顯示10
}
}
② 求大神編一道51單片機實現多種倒計時功能
這個不算太難,只要利用標識符進行判斷即可
標識符就是一個變數,常使用字元型變數作為標識符,佔用空間小
每一種狀態都用標識符表示出來,例如狀態0,狀態1,狀態2 ..................狀態254
字元型變數的值范圍是 0 ~ 254 共255個值,夠你用的了
給你一個類似的程序,我自己寫的,你作為參考吧
程序的組成是:兩個按鍵,一組四位數碼管,兩個LED發光二極體
程序的功能是:按下按鍵A,兩個LED同時點亮,並延時10秒(時間隨意修改)
按下按鍵B,兩個LED同時熄滅,並延時10秒(時間隨意修改)
無按鍵按下時,兩個LED交替點亮,達到閃爍的效果
程序如下,並加了注釋,若滿意請採納!
#include <reg51.h> //51單片機通用頭文件
unsigned int i,t,h; char fe;
sbit a=P3^7; sbit b=P3^6; sbit led=P2^7; sbit lad=P2^6;//按鍵及LED埠定義
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
/***************************************************************************/
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延時函數
/***************************************************************************/
void XS(int xs) //數碼管顯示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P1=0xf7; YS(10); P1=0xff;//個位顯示
P0=table[d2]; P1=0xfb; YS(10); P1=0xff;//十位顯示
P0=table[d3]; P1=0xfd; YS(10); P1=0xff;//百位顯示
P0=table[d4]; P1=0xfe; YS(10); P1=0xff;//千位顯示
}
/***************************************************************************/
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x01; TR0=1; ET0=1; EA=1;
led=0;lad=1;
while(1)
{
XS(h);//調用數碼管顯示函數
if(a==0){h=10;fe=0;}//按鍵 A, LED 亮10秒
if(b==0){h=10;fe=1;}//按鍵 B, LED 滅10秒
}
}
/***************************************************************************/
void t0()interrupt 1//定時器 0 中斷
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++; t++;
if(h>0){t=0;}//如果按鍵按下,屏蔽 t 計數,
if(t>=5){t=0;led=~led; lad=~lad;}//t計數,用於兩個LED閃爍
if(i>=20)//還是原來的時間判斷
{
i=0;
if(h>0&&fe==0){h--;led=0;lad=0;}//如果是狀態 0 同時點亮兩個LED
if(h>0&&fe==1){h--;led=1;lad=1;}//如果是狀態 1 同時關閉兩個LED
}
if(h==0&&led==0&&lad==0){led=1;lad=0;}//此句防止數碼管倒計時後兩個LED繼續同時點亮
}
/***************************************************************************/
③ 用51單片機,構成一個10秒倒計時器
程序很簡單,你要是現在需要我用protues畫個圖給你,然後把程序也給你。
這種設計的話就利用定時器做變數的減法計數就行了,和0計數到10原理都一樣;按鍵控制TRx就可以完成開始和停止。你也可以自己設計試試。
希望我的回答能幫助到你。
————————我做好了 給你吧。
④ 51單片機十秒簡易計時器
因為樓主說,(不要太大面積修改)。
所以,就沒有敢進行大面積的修改。
只簡單的改改,未必能好用,僅供參考:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit key1=P2^7;
sbit key2=P2^6;
sbit weiH=P3^0;
sbit weiM=P3^1;
sbit weiL=P3^2;
uint num=0,ge=0,shi=0,fen=0,k;
//num用來計數,ge為各位顯示,shi為十位顯示,fen為分鍾顯示
void delayms(uint xms) //i=xms即延時約xms毫秒
{
uint i,j;
for(i=xms;i>0;i--) for(j=110;j>0;j--);
}
uchar key1scan()
{
if(key1==0) {
delayms(10);
if(key1==0) {
while(!key1) showtime();//等待釋放期間,也進行顯示
return 1;
}
}
return 0;//添上了返回值
}
uchar key2scan()
{
if(key2==0) {
delayms(10);
if(key2==0) {
while(!key2) showtime();
return 1;
}
}
return 0;//添上了返回值
}
void showtime() //時間顯示
{
//這里去掉了while(1) ,避免了死循環
P1=0xff; weiL=1; P1=table[ge]; delayms(5); weiL=0;//顯示秒的個位
P1=0xff; weiM=1; P1=table[shi]; delayms(5); weiM=0;//顯示秒的十位
P1=0xff; weiH=1; P1=table[fen]; delayms(5); weiH=0;//顯示分鍾,
}
⑤ 51單片機試題,寫一個用單個數碼管顯示10秒倒計時的程序,急!!!!!
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit an=P2^6;
sbit wei=P2^7;
uchar disp=0;
uchar time=10;
int miao=0;
uchar code dispcode[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //段碼表
void Timer0Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x18; //設置定時初值
TH0 = 0xFC; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
void main()
{
Timer0Init()
ET0=1; //開啟定時器0中斷
EA=1;
while(1);//等待中斷
}
void time0(void)interrupt 1
{
TL0 = 0x18; //設置定時初值
TH0 = 0xFC; //設置定時初值
if(disp&1=0)
{
an=1;
P0=dispcode[time%10];
an=0;
wei=1;
P0=0xdf;
wei=0;
}
else
{
an=1;
P0=dispcode[time/10];
an=0;
wei=1;
P0=0xef;
wei=0;
}
disp++;
miao++;
if(miao==1000)
{
miao=0;
if(miao!=0)time--;
}
}
⑥ 如何用C51單片機做出以下程序 「秒錶是倒計時,從100秒開始倒計時 用數碼管實時顯示當前計時值」
假設P0 P2接數碼管,靜態驅動,程序如下:
include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num=100;
uchar time=0;
//共陰數碼管七段碼
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延時程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void main(void )//主程序
{
TMOD=0X01;
ET0=1;
EA=1;
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
P0=table[num/10];
Delay1ms(2);
P2=table[num%10];
Delay1ms(2);
}
}
void TIMER0()interrupt 1//中斷程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==20)
{
time=0;
num--;
}
if(num==0)
{
num=100;
}
}
⑦ 單片機編程:用數碼管和led實現,用數碼管倒計時10秒,LED左移閃爍一次,如此交替下去
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitled=P3^3;//P3^3--LED--電源,這樣接法,即低電平點亮
//P0接數碼管的段
//P2接數碼管的位
//共陰數碼管的段定義,0~9
//ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共陽數碼管的段定義,0~9
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voidDelay(uintn){
while(n--)
//voidDelay1ms()//@11.0592MHz
{
unsignedchari,j;
_nop_();
i=2;
j=199;
do
{
while(--j);
}while(--i);
}
}
voidmain(void){
ucharj=10,m=0;
while(1){
P2=1;//共陽。如果共陰,要取反
P0=table[j/10%10];//j值的十位數
Delay(5);
P2=2;//共陽。如果共陰,要取反
P0=table[j%10];//j值的個位數
Delay(5);
m++;
if(m==97){//前面顯示佔用約10毫秒,所以100次就是1秒
if(j==0){//倒計時到0
P2=0;//關閉數碼管
for(m=0;m<5;m++){//LED閃爍
led=0;
Delay(100);
led=1;
Delay(100);
}
j=11;
}
j--;
m=0;
}
}
}
//經過測試的。。。
⑧ 用51單片機C語言版設計秒錶倒計時
K1 EQU P1.0
K2 EQU P1.1
K3 EQU P1.2
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB ET0
SETB TR0
SETB EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#99
CLR 00H
CLR 01H
LOOP:
JB K1,LP01
JNB K1,$
CLR 01H
INC R3
CJNE R3,#100,LOOP0
MOV R3,#0
SJMP LOOP0
LP01:
JB K2,LP02
JNB K2,$
CLR 01H
CJNE R3,#0,LP011
MOV R3,#99
SJMP LOOP0
LP011:
DEC R3
SJMP LOOP0
LP02:
JB K3,LOOP
JNB K3,$
SETB 01H
SJMP LOOP
LOOP0:
MOV A,R3
MOV B,#10
DIV AB
MOV R0,B
MOV R1,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
MOV DPTR,#TABLE
T0C:
CPL 00H
JB 00H,T001
MOV P3,#0FDH
MOV A,R1
MOVC A,@A+DPTR
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
T002:
JNB 01H,T0E
INC R2
MOV A,R2
CJNE A,#100,T0E
MOV R2,#0
MOV A,R0
JZ T003
DEC R0
SJMP T0E
T003:
MOV A,R1
JZ T004
DEC R1
MOV R0,#9
T0E:
RETI
T004:
CLR 01H
MOV R4,#16
T005:
CPL P0.0
LCALL DELAY
DJNZ R4,T005
RETI
DELAY:
MOV R6,#200
DLY:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DLY
RET
TABLE: ; 共陰極數碼管顯示代碼表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END