㈠ 单片机 60秒倒计时
我是用汇编语言做的,如果显示的速度不理想 你改下延时程序段的数值就OK了,课堂上这个60S倒计时的课题用了很多方法做过
ORG 0000H
LJMP START
ORG 0100H
START:MOV R0, #59
MOV DPTR, #TABLE
LOOP:LCALL DISPLAY
DEC R0
CJNE R0,#0,LOOP
JMP START
DISPLAY:MOV A, R0
MOV B, #10
DIV AB
MOV R1, A
MOV R2, B
MOV R3, #50
LOOP1:MOV A, R2
LCALL CHANG
CLR P2.6
LCALL DLY10MS
SETB P2.6
MOV A, R1
LCALL CHANG
CLR P2.7
LCALL DLY10MS
SETB P2.7
DJNZ R3, LOOP1
RET
CHANG:MOVC A, @A+DPTR
MOV P0, A
RET
DLY10MS:MOV R6, #256
D1:MOV R7, #256
NOP
NOP
NOP
NOP
DJNZ R7, $
DJNZ R6, D1
RET
TABLE:DB 28H,7EH,0A4H,64H,72H,61H,21H,7CH,20H,60H
END
㈡ 任务要求 用数码管显示60秒的秒表设计(单片机AT89C51)
1.要求从0-60秒计时,到60后LED发光,当从新计时是LED熄灭。
--60,保持不变?
--何时重新计时?
2.用蠢含悄定时计数器定时,用按键控制启带渣停。
--刚开机时,是启动,还是停止?
3.若启动后计时没到60秒,按键停止后,则重新计时。
--按键停止后,立即就重新计时?
--是不是保持显示,等待再次按键,再重新计时?
--否则,按键的作用,就不是停止了,而是重新计时老唯了。
4.要求用汇编语言
--这个可以办到。
㈢ 单片机60秒计时器的程序,用AT89C51实现
//1:用AT89C51单片机的定时/计数器T0产生一秒的
//定时时间,作为秒计数时间,当一秒产生时,秒
//计数加1,秒计数到60时,自动从0开始。单片机
//晶振频率为12MHZ
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};
void display(uchar fen,uchar miao);
uchar a,fen,miao,shu;
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
display(fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
shu++;
fen=shu/10;
miao=shu%10;
if(shu==60)
shu=0;
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(uchar fen,uchar miao)
{
P1=0xFe;
P2=table[fen];
delay(5);//延时5毫秒
P1=0xFf;
P2=table[miao];
delay(5);//延时5毫秒
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
㈣ 利用单片机设计实现一个60秒倒计时显示装置,并且计时到后发出报警声音。
#include<reg52.h>
sbitbz=P3^1;
unsignedchara[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};
unsignedcharn,time=60;
main()
{
P1=a[0];
P2=a[6];
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
timer0()interrupt1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(time!=0)
{
n++;
if(n==100)
{
n=0;
time--;
P1=a[time%10];
P2=a[time/10];
}
}
elsebz=~bz;
}
㈤ 51单片机计时60毫秒怎么算呀,计数周期是啥意思呀
一般51单片机的晶振频率是fosc=12M,单片机内部计时的频率是fosc/12 即1MHZ
因此计数周期1us
内部定时器是16位,最多 计脉冲数为65536个,因此最长定时时间是65.536 ms
要定时60 ms,需经过的脉冲个数是60000个,由于51单片机的定时器是加法计数,因此初值应该写入(65536-60000)
这样经过60mS后,计数器的值就是 (65536-60000)+60000=65536,刚好溢出,溢出标志位TF置1或产生中断
定时器初值又分高8位和低8位,高8位的1代表256,因此高8位是256的倍数,低8位是256的余数
因此 C语言编程就这样 写:
TH0=(65536-60000)/256
TL0=(65536-60000)%256
㈥ 51单片机 汇编语言 两个七段共阳数码管 60S倒计时
C语言的我这里有。
以下是24倒计时的程序。你修改TABLE: 中的数据内容就可以达到你的要求的了。里面用到了两片7447芯片。。。
ORG 0000h
AJMP START
ORG 0030H
START: CLR P3.1 ;D1亮
JB P3.7,START ;按下K1倒计时启动
SETB P3.1 ;D1灭
CLR P3.0 ;D2亮
MOV TMOD,#01H ;设定时器TIMER0工作在模式1
MOV DPTR,#TABLE
NEXT: MOV A,#00H
MOVC A,@A+DPTR
MOV P1,A
MOV R3,#20 ;延时1秒
LCALL DELAY
INC DPTR ;数据指针加1
CJNE A,#0FFH,NEXT
MOV P1,#0FFH
SETB P3.0
LJMP START
; ****延时0.5秒子程序****
DELAY: SETB TR0 ;起动TIMER0开始计时
AGAIN: MOV TL0,#LOW(65536-50000) ;设定时器TL0的值
MOV TH0,#HIGH(65536-50000) ;设定时器TH0的值
LOOP2: JBC TF0,LOOP3 ;判断TF=1?,是则跳转至LOOP3,并清除TF0
JMP LOOP2 ;TF0不为1则跳转至LOOP2
LOOP3: DJNZ R3,AGAIN ;R3是否为0?不是则跳转至AGAIN
CLR TR0 ;是则停止TIMER0计数
RET
;*****显示数码表*****
TABLE:
DB 24H,23H,22H,21H,20H,19H,18H,17H,16H,15H,14H,13H
DB 12H,11H,10H,09H,08H,07H,06H,05H,04H,03H,02H,01H
DB 0FFH ;结束码
END
㈦ 用单片机汇编语言编写60秒计时器!
;数码管段选接P1口,位选接P2.0和P2.1,
;采用定时器T1定时10ms,60H为1s计数单元,计数100次为1s
ORG
0000H
;程序从0地址开始
LJMP
MAIN
;跳到MAIN处执行
ORG
001BH
;定时器T1
LJMP
TIME1
ORG
0030H
MAIN:MOV
TMOD,#01H
;设置T1工作在模式1
MOV
TH1,#068H
;赋初值,定时10ms
MOV
TL1,#0F0H
MOV
IE,#88H
;开CPU中断,开定时器1中断
SETB
TR1
;启动T1定时器工作
MOV
60H,#100
;给60H单元赋初值
CLR
4FH
;清零4FH单元
DISPLAY:
;显示子程序
MOV
DPTR,#TAB
;DPTR指向编码表位置
MOV
A,R3
;将R3的内容复制到A
MOV
B,#10
DIV
AB
;A除B,商给A,余数给B
MOVC
A,@A+DPTR
;根据A的值取出编码表中的编码
MOV
P1,A
;由P1口输出A的内容
SETB
P2.0
;置位P2.0
CLR
P2.0
;清零P2.0
MOV
A,B
MOVC
A,@A+DPTR
;根据A的值取出编码表中的编码
MOV
P1,A
;由P1口输出A的内容
SETB
P2.1
;置位P2.1
CLR
P2.1
;清零P2.1
JNB
4FH,DISPLAY
;判断1秒时间是否到,没有到,则跳转到DIAPLAY处
CLR
4FH
;1秒到,清4FH
LJMP
DISPLAY
;调用显示子程序
TIME1:MOV
TH1,#068H
;赋初值
MOV
TL1,#0F0H
DJNZ
60H,TT
;60H单元自减1,判断是否为0,不为0则跳转到TT处
MOV
60H,#100
;60H单元为0,则重新给其赋值100
SETB
4FH
;同时置位4FH单元
INC
R3
;R3自加1
CJNE
R3,#60,TT
;判断R3是否为60,否则跳转TT处
MOV
R3,#0
;R3为60,则给R3赋0
TT:RETITAB:
;编码表
DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;编码
END
;程序结束
㈧ 用单片机的定时/计数器实现60s倒计时,并用两位数码管静态显示倒计时秒值;
请问静信枝态显滑颤敏示能显洞含示两位数字吗??
下面是电路图:
㈨ 怎样用单片机c语言实现60秒倒计时
这个很简单的嘛。。自己看看书多做做就知道了。。像这样简单的都来问的话,那你工作的话就基本上完全是不会了。。
跟你提个思路吧,首先是,定义一个变量,用来保存初值60,然后进行定时器初始化,开启定时器中断,打开全部中断。然后就是在定时器中断处理函数里面进行计数了,,当计时满一秒的时候,就将最开始的初值为60的变量,进行减一操作。然后在主函数里面进行显示就可以了。。
㈩ 52单片机不用定时中断如何实现60S秒表功能
#include<reg52.h>
sbit AA=P0^7;//数码管显示用IO端口
sbit BB=P0^6;
sbit CC=P0^5;
sbit DD=P0^4;
sbit K1=P3^2;
sbit K2=P3^5;
sbit K3=P3^7;
int s,m;
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
void YS(int x); //延迟函数声明
void XS(int d); //显示函数声明
void main()
{
s=m=0;
TMOD=0x01;//设置定时器工作方式
TH0=(65536-1000)/256;//1毫秒
TL0=(65536-1000)%256;//定时器装初始值
EA=1;//开总中断
ET0=1;//开定时器 0 的中断
while(1)
{
XS(s); //显示
if(K1==0){ TR0=1; }//开启定时侍哗者器,开始计时
if(K2==0){ TR0=0; }//关闭定时器,暂停计时
if(K3==0){ s=m=0; }//清空数据
}
}
void YS(int x) //延迟子函数
{
int y;
for(;x>0;x--)
for(y=100;y>0;y--);
}
void XS(int d) //显老薯示子函数
{
char d1,d2,d3,d4;
d4=d%10; //取个位 %求余
d3=(d/10)%10; //取十芦春位
d2=(d/100)%10;
d1=(d/1000)%10;
P2=table[d4]; AA=0; YS(1); AA=1;//个位显示
P2=table[d3]; BB=0; YS(1); BB=1;//十位显示
P2=table[d2]; CC=0; YS(1); CC=1;//百位显示
P2=table[d1]; DD=0; YS(1); DD=1;//千位显示
}
void timer() interrupt 1 //中断处理子函数
{
TH0=(65536-922)/256;//1毫秒
TL0=(65536-922)%256;
m++;
if(m>=10) //判断定时是否到达1s 即 1000 ms
{ m=0; s++; }
if(s>=9999) //判断定时是否到达1s 即 1000 ms
{ s=0; }
}
绝对可用的,你试试吧,可能我的程序端口与你的不一样,自己改一下就可以了