① 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