你可以简单地认为单片机只能输出5v或者0v的电压 分别对应1和0,那么led灯的另一端接地或者接5v,如果你 的单片机输出5v接到led灯,led灯另一端接地 , 那就产生电压了,电路就导通了,灯就亮了 ,反之也是这个道理。时间方面可以写大致的延时,或者用定时器,这样就比较精确了,你学会了这个就可以说入门了。
#include<reg51h>
#define LEDData P0
unsigned char code LEDCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char time=99;
unsigned char second,count,count1; //秒,计数器
sbit LEDH = P2^6; //高位阴极
sbit LEDL = P2^7; //低位阴极
sbit buzzer = P2^5; //蜂鸣器
sbit Alam=P3^6;
bit Over = 0; //倒计时到0标志
void Delay5ms(void)
{
unsigned int i;
for(i=1000;i>0;i--);
}
void DisplayTime(void)
{
LEDData=LEDCode[second/10];
LEDH=0;
Delay5ms();
LEDH=1;
LEDData=LEDCode[second%10];
LEDL=0;
Delay5ms();
LEDL=1;
}
//主函数
void main(void)
{
TMOD=0x11; //两个8为计数器
TL0=0xb0; //两个8位定时计数器
TH0=0x3c; //两个8位定时计时器
TL1=0xb0; //作计数器
TH1=0x3c; //作寄存器
second=time;
EA=1; //总中断打开
ET0=1; //定时器0中断打开
ET1=1; //定时器1中断打开
TR0=0; //定时器0开关关闭
TR1=0; //定时器1开关关闭
EX0=1; //外部中断0开
IT0=1; //边沿触发
IT1=1; //边沿触发
EX1=1; //外部中断1开
PX0=1; //外部中断0为高优先级控制位
PX1=1; //外部中断1为高优先级控制位
PT0=0; //定时/ 计数器T0为低优先级中断
while(1)
{
DisplayTime();
if(Over){
buzzer();/延时一会儿buzzer();延时一会儿buzzer();延时一会儿
}
}
}
void PxInt0(void) interrupt 0
{
if(Over==1)
{
second=time;
Over=0;
TR1=0; //定时器1开关关闭
Alam=1;
TH1=0x3C; //作寄存器
TL1=0xB0; //作计时器
}
else
{
second=second;
}
TR0=1; //--------------开启计时器
}
void PxInt1(void) interrupt 2
{
TR0=0; //--------------关闭计时器
}
//中断服务函数
void time0_int(void) interrupt 1
{
TL0=0xb0; //计时器
TH0=0x3c; //寄存器
TR0=1; //开启计时器
count++;
if(count==20)
{
count=0;
second--;
if(second==0)
{
second=0;
Over=1;
TR0=0; //定时器0关闭
TR1=1; //定时器1打开
}
}
}
//中断服务函数
void time1_int(void) interrupt 3
{
TL1=0xb0; //计时器
TH1=0x3c; //寄存器
TR1=1; //定时器1打开
count1++;
if(count1==10)
{
count1=0;
Alam=~Alam;
buzzer();调用响一声函数
}
}
//响一声函数
void buzzer(void)
unsigned int b,c;
for(b=60;b>0;b--)
{ for(c=3;c>0;c--)
buzzer=!buzzer //将蜂鸣器控制端取反
}
99秒倒数的 楼主看行不
在写 很麻烦的
#include <reg51h>
unsigned char table[]={0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0};
unsigned char int_time ;
unsigned char second;
void delay(void)
{
unsigned char i,j;
for(i=0;i<200;i++)
for(j=0;j<20;j++);
}
void DisplaySecond(unsigned char k)
{
P2=0xf7;
P0=table[k/10];
delay();
P2=0xfb;
P0=table[k%10];
delay();
P2=0xff;
}
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
int_time=0;
second=0;
while(1)
{
DisplaySecond(second);
}
}
void interserve(void ) interrupt 1
{
TR0=0;
int_time++;
if(int_time==20)
{
int_time=0;
second++;
if(second==99)
second=0;
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
这是99秒倒计时汇编程序:
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 EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#9
CLR 00H
CLR 01H
LOOP:
JB P10,LP01
JNB P10,$
SETB TR0
CLR 01H
SJMP LOOP0
LP01:
JB P11,LP02
JNB P11,$
SETB 01H
SJMP LOOP0
LP02:
JB P12,LOOP0
JNB P11,$
CLR TR0
MOV P3,#0FDH
MOV P2,#0
MOV P3,#0FEH
MOV P2,#0
SJMP MAIN
LOOP0:
JB 00H,LOOP1
MOV A,R0
SJMP LOOP2
LOOP1:
MOV A,R1
LOOP2:
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R3,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
JB 01H,T0C
INC R2
T0C:
CPL 00H
MOV A,R3
JB 00H,T001
MOV P3,#0FDH
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV P2,A
T002:
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 TR0
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END
#include <dosh>
#include <stdioh>
#include "Windowsh"
void main(void)
{
for (int i=99; i>0; i--)
{
printf("The remnants seconds:%d s\n", i);
Sleep(1000);
}
}
以上就是关于写程序,99秒倒计时,按下按键停止,流水灯开始点亮,再次按下后流水灯停止,倒计时继续全部的内容,包括:写程序,99秒倒计时,按下按键停止,流水灯开始点亮,再次按下后流水灯停止,倒计时继续、用单片机AT89S51做的99秒倒计时怎样加上“滴滴”声。、基于51单片机控制的9999秒倒计时器的设计,程序怎样做等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)