求单片机60分倒计时程序

求单片机60分倒计时程序,第1张

;假设单片机晶振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 <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--;

}

}

#include<reg52h>

#include <intrinsh> //内部包含延时函数 _nop_();

#define uchar unsigned char

#define uint unsigned int sbit d1=P2^0; sbit key1=P0^4;

sbit SDATA_595=P0^0; //串行数据输入 ----接板卡上的SPI 数据信号输入端

sbit SCLK_595=P0^1; //移位时钟脉冲(输入口) ---接板卡上的SPO----串行时钟线----SHcp移位时钟信号输入端

sbit RCK_595=P0^2; //输出锁存器控制脉冲 ----接板卡上SPK STcp锁存信号输入端

uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar num=60;

void delay(uint z);

void aa595_in(uchar Data) {

uchar i;

for(i=0;i<8;i++)

{SCLK_595=0; Data<<=1; SDATA_595=CY;

SCLK_595=1; SCLK_595=0;

}

}

void a595_in(uchar Data) {

uchar i;

for(i=0;i<8;i++) {

SCLK_595=0; Data<<=1; SDATA_595=CY;

SCLK_595=1; SCLK_595=0;

}

}

void aa595_out(void) {

RCK_595=0;

_nop_(); _nop_();

RCK_595=1;

_nop_(); _nop_();

RCK_595=0;

}

void main() {

uchar ge,shi;

while(1) {

if(key1==0) {

delay(10);

if(key1==0)

{d1=0; num--;

if(num==0)

num=60;}

while(!key1);//松手检测

delay(10);//延时10ms

while(!key1);//再松手检测

}

else d1=1;

// aa595_in(duan[num]);

// aa595_in(wei[3]);

shi=num/10;

ge=num%10;

a595_in(duan[shi]);

aa595_in(wei[3]);

aa595_out();

delay(10);

aa595_in(duan[ge]);

aa595_in(wei[2]);

aa595_out();

delay(10);}

}

void delay(uint z) {

uint x,y;

for(x=100;x>0;x--) for(y=z;y>0;y--);

}//延时子程序,延时Zms

#include <reg52h>

#include <mathh>

#define uint unsigned int

#define uchar unsigned char

sbit fm=P1^7;//蜂鸣器

uint aa=0,c;

void Delay1ms(unsigned int i) //1ms延时程序

{

unsigned int j;

for(;i>0;i--)

{

for(j=0;j<125;j++)

{;}

}

}

void init()//初始化设置

{

TMOD=0x01;//定时器0作为定时器用

TH0=965536-5000)/256;//定时50ms

TL0=965536-5000)%256;

EA=1;//开总中断

ET0=1;//允许定时器1中断

TR0=1;//启动定时器

}

void main()//主程序很简单

{

init();//初始化

c=36008;

while(1)//循环程序

{

while(c!=0);

c=36008;

fm=1;//报警

Delay1ms(5000) ;

fm=0;//报警停止

}

}

void timer0()interrupt 1//定时器0的中断序号为1

{

aa++;

TH0=965536-5000)/256;//定时50ms

TL0=965536-5000)%256;

if(aa==20)//中断10次,共1S

{

aa=0;

c--;

}

}

int sec=60;

int cnt=0;

char Buzzer=1;//关闭蜂鸣器

void Timer0Init(void) //5毫秒@110592MHz

{

AUXR &= 0x7F; //定时器时钟12T模式

TMOD &= 0xF0; //设置定时器模式

TL0 = 0x00; //设置定时初值

TH0 = 0xEE; //设置定时初值

TF0 = 0; //清除TF0标志

ET0 = 1;//开T0中断

EA = 1;//开总中断

TR0 = 1; //定时器0开始计时

}

void Timer0Interrupt(void) interrupt 1

{

cnt++;

if(cnt>=200)

{

cnt=0;sec--;

if(sec==0)EA=0;

}

}

其它就自己写了。

if(sec==0)Buzzer=0;

//两位数码管显示倒计数99~00,51单片机。

#include<reg52h> // 倒计数

#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};

uchar bai,shi;

uint a1,a2;

sbit D1=P3^0; // 位选1 P1口段码输出

sbit D2=P3^1; // 位选2

sbit key=P3^7; // 启动/停止

bit y ;

void main()

{

TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

EA=1;

ET0=1;

TR0=1;

bai=0;

shi=0;

while(1)

{

if(key==0)

{

}

}

}

void timer0()interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

a1++;

y = ~y;

if(a1==100)

{

a1=0;

if(key==1) a2--;

if(a2>=100) a2=99;

}

D1 = 1; D2 = 1;

if(y==1)

{

P1=table[a2/10];

D1=0;

}

else

{

P1=table[a2%10];

D2=0;

}

}

你是不是用2了锁存器啊。

P2=led_table[ten];

led_ten=1;//打开锁存器

led_ten=0;//关闭锁存期

存储10位

P2=led_table[single];

led_single=1;//打开锁存器

led_single=0;//关闭锁存器

存储个位

另外led_ten,led_single 你要先定义一下吧

错误好多哦

错误一、数码管编码声明部分,缺了个 char

错误二、定时器中断里面,各个变量的值运行不对

错误三、程序整体的结构不够合理

另外你的数码管显示部分太过于繁琐,且在主循环内不方便程序的调试

不多说了,还是上程序吧,已经为你改了,且经过硬件测试的

我测试的时候,使用的端口和你的不一样,测试结束后又改为你使用的端口

更改完端口后,未实测,如果有错误请联系我

//

#include <reg51h> //51单片机通用头文件

char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned  int i,t,h;

sbit a=P1^0; sbit led=P3^7; sbit lad=P3^6;

//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]; P2=0xfe; YS(10); P2=0xff;//个位显示

P0=table[d2]; P2=0xfd; YS(10); P2=0xff;//十位显示

P0=table[d3]; P2=0xfb; YS(10); P2=0xff;//百位显示

P0=table[d4]; P2=0xf7; YS(10); P2=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;}//如果按键被按下,则把变量赋值

}

}

//

void  t0()interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

i++; t++;

if(h>0){t=0;}//如果按键按下,屏蔽 t 计数,

if(t>=10){t=0;led=~led; lad=~lad;}//t计数,用于两个LED闪烁

if(i>=20){i=0;if(h>0){h--;led=0;lad=0;}}//如果数值不为0,则一秒减一,并点亮两个LED

if(h==0&&led==0&&lad==0){led=1;lad=0;}//此句是防止数码管倒计时后两个LED继续同时点亮

}

//

以上就是关于求单片机60分倒计时程序全部的内容,包括:求单片机60分倒计时程序、51单片机试题,写一个用单个数码管显示10秒倒计时的程序,急!!!!!、求单片机数码管倒计时程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9308471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存