请帮忙写一个程序:单片机控制液晶显示器60秒倒计时(C语言)

请帮忙写一个程序:单片机控制液晶显示器60秒倒计时(C语言),第1张

#include<reg52h>

#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_zhiling(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_zhiling(0x38);

write_zhiling(0x0c);

write_zhiling(0x06);

write_zhiling(0x80);

write_zhiling(0x01);

write_zhiling(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;//110592MHZ晶振50Ms

TH0=(65536-46080)%256;

ee++;

if(ee==14)//加上前面延时子函数的延时, 在我的板子上ee=14的时候大概就是一秒钟

{

ee=0;

date1--;

if(date1==0)

{

date1=60;

}

write_zhiling(0x80+7);

display(date1);

}

}

void main()

{

inite();

while(1);

}

小弟不才,希望这个程序对你有帮助!

单片机程序是基于硬件基础上开发的,你至少添加注释和硬件环境说明,不然大家都不知道怎么帮你。

你直接给出代码,也不清楚需要指正什么,这里也没有设置时间/闹钟的代码,发文前应该清楚表达要问的内容。

1)假设你的晶振是12MHz,那一个机器周期是1MHz,定时器的最长定时周期是(65535/10^6)你想要1/6秒触发一次中断就必须结合软件计时,为了尽量精确:硬件计时40000次,软件计时25次那么定时器的设这应该是TH1=(65535-40000)%256;TL1=(65535-40000)%256,(注意计数器大部分是加法计数)

2)按键监听没有给出思路,也没有处理按键抖动,我只能分析程序:

有一个外部中断触发时间设置,P34设置小时、P35设置分钟,但是调整时间后没有进行显示,你至少要让数码管显示结果才能知道怎么调整。

(这是我同学编的,拿来给你)

#include <reg51h>

#include <intrinsh>

unsigned char i;

void main()

{

TMOD=0x00;

TH1=0x3c;

TL1=0xb0;

EA=1;

ET1=1;

TR1=1;

while(1)

{

if(i==20)

{

i=0;

//下面写你要处理的的其他程序,你只要了定时1s。

}

}

}

void a(void) interrupt 3

{

unsigned char i;

TH1=0x3c;

TL1=0xb0;

i++;

}

说下思路啊:首先你要确定你两个键所对应的的io口(注意这两个io口要上拉)接下来你要确定这两个io口没有按键按下去的时候口的状态啊!这样才能扫描出你的那个按键按下去!

接下来就是c语言的处理了

if(key1)

{

flag=1;

}

if(key2)

{

flag=0;

}

你在你的计时里面处理啊!当flag=0时不计时反之计时。。。

你看看行不行

#include<reg51h>

uchar code tab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}

void view() /七段数码管显示程序 七个管轮流显示/

{P3=0x01;

unsigned int i=0;

while(i<6)

{n=vnum;

P1=tab[n];

P3<<=1;

i++;

}

}

void mDelay(unsigned int Delay) /延时程序/

{ unsigned int i;

for(;Delay>0;Delay--)

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

{;}

}

}

void jumpnum() /用于钟表时分秒的进位/

{if(jnum(5)>9) /秒进位

{jnum[4]=jnum[4]+1;

jnum[5]=0;

if(jnum[4]>6) /秒到分进位

{jnum[3]=jnum[3]+1;

jum[4]=0;

if(jnum[3]>9) /分进位

{jnum[2]=jnum[2]+1;

jnum[3]=0;

if(jnum[2]>6) /分到时进位

{jnum[1]=jnum[1]+1;

jnum[2]=0;

if(jnum[1]>9) /时的进位

{jnum[1]=0;

jnum[0]=jnum[0]+1;

}

else if(jnum[1]>4&&jnum[0]>=2)

{jnum[1]=0;

jnum[0]=0;

}

}

}

}

}

void key() /键盘控制程序

{if((P2&0xFF)!=0xFF); /防抖动

{mDelay(3000);

if((P2&0xFF)!=0xFF)

{unsign int c;

c=1;

while(c<4)

{ if((P2&0xFF)!=0xFF);

{mDelay(3000);

vnum[]=num[];

void view();

if((P2&0xFF)!=0xFF)

{switch(P2): /判断不同的按键

{case 0xFE: c++; /c用于判断是闹钟调时c=3还是时钟调时c=2

case oxFD :if(c=2) /分位增加

{num[3]++;}

else if(c=3)

{lnum[3]++;

}

case oxFC :if(c=2) /时位增加

{num[1]++;}

else if(c=3)

{lnum[1]++;

}

}

if(c=2) /增加后判断是否需要进位

{jnum[]=num[];

jumpnum();

vnum[]=num[];

void view[];}

if(c=3)

{jnum[]=lnum[];

jumpnum();

vnum[]=num[];

void view[];}}}}}}}

void clock() /闹钟程序

{for(cl=0;num[cl]==lnum(cl);cl=cl+1) /当前时间与设定时间相同

{;}

unsigned int kp=0;

if(cl==5&&kp==0) /闹钟铃声

{for(i=1;i<100;i++)

{P1_7=~P1_7;

for(j=1;i<=100;j++);}

void mDelay(3000);

for(i=1;i<100;i++)

{P1_7=~P1_7;

for(j=1;i<=100;j++);}

vnum[]=num[];

void view();

if((P2&0xFF)!=0xFF); /判断是否有按键,有则停止闹钟

{mDelayd(3000)

void view();

if((P2&0xFF)!=0xFF)

{kp=1;}

}}}

viod intclock() /整点报时程序

{unsigned int ic,i;

if(num[2]==5&&num[3]==9&&num[4]==5&&num[5]==0) /判断差十秒整点

{if(ic=num[5]+2;(ic==(num[5]+2))&&num[5]<59;ic=num[5]) /开始发出500hz声因

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

{P1_7=~P1_7;

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

}

for(i=1;i<150;i++) /1000hz声音

{P1_7=~P1_7;

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

}}}}

void count() inturrupt 1 using 2 /计时程序

{cn++;

if(cn==20)

{num[5]++;

cn=0;

}

}

void main()

{ P2=0x00;

unsigned int num[5],jnum[5],lnum[5];

ET0=1;

EA=1;

TR0=1;

EX0=1;

EX1=1;

IT0=1;

IT1=1;

TMOD=0x01;

TH0=0x3C;

TL0=0xB0;

unsigned int cn=0;

P2=0x00;

while(1)

{void key();

void view();

void jumpnumber();

void clock();

void intclock();

}

}

以上就是关于请帮忙写一个程序:单片机控制液晶显示器60秒倒计时(C语言)全部的内容,包括:请帮忙写一个程序:单片机控制液晶显示器60秒倒计时(C语言)、51单片机 c语言写的电子时钟程序 请帮忙指正!、AT89C51单片机 用定时器1,方式0定时1s的C语言程序怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9857523.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存