‘壹’ 单片机 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秒倒计时(C语言)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
uchar code temp[]="00";
uint aa,ee,date1;
void delay(uint aa)
{
uint bb,cc;
for(bb=0;bb<aa;bb++)
for(cc=0;cc<100;cc++);
}
void write_ling(uint com)
{
RS=0;
P0=com;
delay(5);
EN=1;
delay(10);
EN=0;
}
void write_shuju(uint shuju)
{
RS=1;
P0=shuju;
delay(5);
EN=1;
delay(10);
EN=0;
}
void inite() //中断、1602初始化
{
TMOD=0x01;
TH0=(65536-46080)/256;
TH0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
RW=0;
EN=0;
date1=60;
write_ling(0x38);
write_ling(0x0c);
write_ling(0x06);
write_ling(0x80);
write_ling(0x01);
write_ling(0x80+7);
for(aa=0;aa<2;aa++)
{
write_shuju(temp[aa]);
delay(5);
}
}
void display(uint date)
{
uint ge,shi;
ge=date%10;
shi=date/10;
write_shuju(0x30+shi);//0x30--0x39对应的是1602显示0--9的ASCLL码值
write_shuju(0x30+ge);
}
void timer0() interrupt 1
{
TH0=(65536-46080)/256;//11.0592MHZ晶振50Ms
TH0=(65536-46080)%256;
ee++;
if(ee==14)//加上前面延时子函数的延时, 在我的板子上ee=14的时候大概就是一秒钟
{
ee=0;
date1--;
if(date1==0)
{
date1=60;
}
write_ling(0x80+7);
display(date1);
}
}
void main()
{
inite();
while(1);
}
小弟不才,希望这个程序对你有帮助!
‘叁’ 51单片机汇编语言倒计时60秒循环程序
可以在SJMP $这里改成判断R2是不是为0,如是就重新载入60…如果不是就跳回重新判断R2
‘肆’ 求教,利用51单片机编写两个数码管60秒倒计时,个位是从5开始计时之后才是9开始倒计时,十位显示不
如楼上所说,你没有初始化num这个参数,那么默认值就是0,也相当于256,所以一开始进入中断就是256-1,也就是255,个位是5,十位数是25,所以显示就成了你现在的模样。因此初始化以下就好了。
‘伍’ 单片机六十秒倒计时程序
;数码管段选接P2口,位选接P3.0和P3.1,
;采用定时器T0定时10ms,60H为1s计数单元,计数100次为1sORG 0000H ;程序从0地址开始
LJMP MAIN ;跳到MAIN处执行
ORG 000BH ;定时器T0
LJMP TIME0
ORG 0030H
MAIN:MOV TMOD,#01H ;设置T0工作在模式1
MOV TH0,#0D8H ;赋初值,定时10ms
MOV TL0,#0F0H
MOV IE,#82H ;开CPU中断,开定时器0中断
MOV R3,#60
SETB TR0 ;启动T0定时器工作
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 P2,A ;由P1口输出A的内容
CLR P3.0 ;清零P2.0
SETB P3.0 ;置位P2.0 MOV A,B
MOVC A,@A+DPTR ;根据A的值取出编码表中的编码
MOV P2,A ;由P1口输出A的内容
CLR P3.1 ;清零P2.1
SETB P3.1 ;置位P2.1
JNB 4FH,DISPLAY ;判断1秒时间是否到,没有到,则跳转到DIAPLAY处
CLR 4FH ;1秒到,清4FH
LJMP DISPLAY ;调用显示子程序 TIME0:MOV TH0,#0D8H ;赋初值
MOV TL0,#0F0H
DJNZ 60H,TT ;60H单元自减1,判断是否为0,不为0则跳转到TT处
MOV 60H,#100 ;60H单元为0,则重新给其赋值100
SETB 4FH ;同时置位4FH单元
DEC R3 ;R3自加1
CJNE R3,#00H,TT ;判断R3是否为0,否则跳转TT处
CLR TR0
TT:RETI
TAB: ;编码表
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共阴
END ;程序结束
‘陆’ 利用单片机设计实现一个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;
}
‘柒’ 单片机实现60秒倒计时 求教
写程序最好不要出现超过1ms的死延时,特别是在普通8位单片机的编程,需要时间的地方尽量用定时器来做,单片机运行效率高
‘捌’ 单片机60秒倒计时程序怎么写啊!!!这个图的!!!急用啊!!!!
/*代码你可以参考一下,晶振按11.059200MHz写的。
提示一下,按你这仿真是不能做实物的,要加上限流电阻*/
#include"reg52.h"
unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管段选
voidmain()
{
TMOD=0x01;
TH0=0xFC;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
while(1);
}
voidTimer0Interrupt(void)interrupt1
{
staticunsignedinti=0;
staticchartime=60;
TH0=0xFC;
TL0=0x66;
P3=table[time%10];
P2=table[time/10];
i++;
if(i>=1000)
{
i=0;
time--;
if(time<0)
{
time=60;
}
}
}
‘玖’ 小白求救,51单片机利用两个数码管实现60秒倒计时
个位数能够显示正常,那么就说明十位数的处理代码出了问题;
给出代码看看吧