
#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语言程序怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)