
#include <reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit duan=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毫秒@12000MHz
{
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)
{
duan=1;
P0=dispcode[time%10];
duan=0;
wei=1;
P0=0xdf;
wei=0;
}
else
{
duan=1;
P0=dispcode[time/10];
duan=0;
wei=1;
P0=0xef;
wei=0;
}
disp++;
miao++;
if(miao==1000)
{
miao=0;
if(miao!=0)time--;
}
}
;假设单片机晶振fosc=6mhz,则t=2us;定时器计数器T0,方式1;60分钟之后干什么没有描述,故设定60分钟之后由p10口输出一高电平,并延时一段时间
org 0000h ljmp main org 000bh ljmp serve org 0100hmain:mov sp,#60h mov r0,#10 ;定时100ms10=1s mov r7,#60 ;1s60=1min,设1分钟计数初值 mov r6,#60 ;1min60=60min,设1小时计数初值 mov tmod,#01h mov th0,#3ch mov tl0,#0b0h clr p10 setb ea setb et0 setb tr0 sjmp $serve:mov th0,#3ch mov tl0,#0b0h djnz r0,loop mov r0,#10 djnz r7,loop mov r7,#60 djnz r6,loop mov r6,#60 setb p10 acall delay clr p10loop: retidelay:mov r1,#10lp1:mov r2,#0ffhlp2:nop nop djnz r2,lp2 djnz r1,lp1 retend
#include<reg51h>
void delay(unsigned int i);
unsigned int a[]={0XEF,0X8C,0XB7,0XBE,0XDC,0X7E,0X7F,0XAC,0XFF,0XFE};
unsigned int m=0,v=0,k=0,b[5];
void main()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
EA=1;
IE=0X87;
IT0=1;
IT1=1;
TR0=0;
while(1)
{
P2=0x40;
P0=a[m%1000%100%10];
delay(3);
P2=0x20;
P0=a[m%1000%100/10];
delay(3);
P2=0x10;
P0=a[m%1000/100];
delay(3);
P2=0x08;
P0=a[m/1000];
delay(3);
}
}
void duan()interrupt 1
{
TH0=0X3C;
TL0=0XB0;
k++;
if(k==20)
{m++;
k=0;
}
}
void duan2()interrupt 2
{m=0;
}
void duan1()interrupt 0
{ v++;
if(v==1)TR0=1;
if(v==2)b[v]=m;
if(v==3)
{b[v]=m;
TR0=0;
}
if(v==4)m=b[2];
if(v==5)m=b[3];
if(v==6)v=0;
}
void delay(unsigned int i)
{unsigned int j,k;
for (k=0;k<i;k++)
for (j=0;j<255;j++);
}
#include<reg51h>
#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--);
}
#include<stdioh>
#include<AT89X52h>
unsigned char flag;
unsigned char commond;
void main()
{
TMOD=0x21;//计数器1工作方式2,计数器0工作方式1
TH1=TL1=0xfb; //波特率9600
TR1=1; //开始计时
SCON=0x50; //串口工作方式1 ,允许接收数据
EA=1;
ES=1; //打开串口中断
ET0=0; //禁止计时器TO中断
while(1)
{
if(flag)
{
flag=0;
}
}
}
void comm() interrupt 4 using 2
{ //unsigned char i;
if(RI)
{
RI=0;
flag=1;
commond = SBUF;
P2= commond;
RI=0;
if(commond=='e')
{
ET0=1; //打开计数器0中断
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //延时05秒
TR0=1; //开始计时
}
}
}
void time0() interrupt 1 using 3
{
unsigned char j,k;
EA=0;
while(j>10)
{
j=0;
P3_4 = ~P3_4;
k++;
if(k>13)
{
TR0 =0;
k = 0;
}
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
j++;
EA =1;
}
你的程序好像是定时器中断那里有问题,这个改过的可以实现你的要求了
以上就是关于51单片机试题,写一个用单个数码管显示10秒倒计时的程序,急!!!!!全部的内容,包括:51单片机试题,写一个用单个数码管显示10秒倒计时的程序,急!!!!!、求单片机60分倒计时程序、单片机计时器程序(c语言)急急急!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)