嵌入式学习小组
直播中

徐敏

7年用户 158经验值
私信 关注

怎么样用89c51单片机编写时钟程序

#include
sfr P1M0 =0x92;
sfr P1M1 =0x91;
char buf[4] ={0x01,0x02,3,4};
char hour=0,min=0,sec=0;
char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  
int time;
void delay(void){
   unsigned int j;
   j=1000;
   for(;j--;);
  }
unsigned int count=0;
void dir(void){
P0= TAB[buf[0]]  ;
P1=0x08;
  delay();
  P0=0xff;  //£¿£¿£¿
   P1=0x02;
P0= TAB[buf[1]]  ;
   if(count>10)P0&=0x7f;
P1=0x02;
  delay();
  P0=0xff;

  P1=0x04;
P0= TAB[buf[2]]  ;
  //if(count>10)P0&=0x7f;
  delay();
  P0=0xff;
P1=0x01;
P0= TAB[buf[3]]  ;
  delay();
  P0=0xff;
    P1=0x00;
}
void t1(void) interrupt  3 {
TL1= (char)(15536&0x00ff);
   TH1= (char)(15536>>8);
     count++;
   if(count>19){
    count=0;
    //buf[3]++;
    time++;
    if(time>3599)   time=0;
    hour++
    if(hour>23)
   }  
}   

void main(void){
char min,sec;
hour
   P1M0 =0x0f;
P1M1 =0x00;
  TMOD=0x10;  
TH1= (char)(15536>>8);
TL1= (char)(15536&0x00ff);  
IE=0x88;
  TR1=1;
while(1) {
  
  min=(char)(time/60) ;
  buf[0]=min/10;   buf[1]=min%10;
  
  sec=(char)(time%60) ;
  buf[2]=sec/10;   buf[3]=sec%10;
  
  dir();
  
}
}


这个程序每步的解释,想在加点每到1小时蜂鸣器喊5秒,每10分20分30分等时间数码管闪烁10次

回帖(3)

王欣

2020-5-29 10:41:45
这个程序很简单,只是我现在帮不了你
举报

齐镭

2020-5-29 11:01:14
岗***要求:
1、大专及以上学历,电子信息工程,计算机及其相关专业;
2、三年以上行业相关工作经验;
3、 熟练C++/C语言,熟悉ARM / Linux嵌入式开发和交叉编议;
4、熟悉 windows界面开发;
5、有良好的编程习惯,英语熟练,很好有沟通能力,团队协作能力,以及抗压能力;
6、有智能交通、停车场系统、加油站系统等行业系统软件开发经验者优先,能够独立完成LED智能交通软件对接工作者尤佳;
7、身体健康,开朗乐观,有责任心和荣誉感。
相关待遇:
1、5.5天7.5小时工作制,假期跟国家同步。
2、***,住宿舒适4—6人间,宿舍有热水器,吃饭每天三餐只需10元。
3、全勤奖30元/月,有年终奖,每年均有调薪机会。
4、每月评比优秀员工,奖励200元/次。
5、员工社保,过节过生日礼品发放,员工活动丰富多彩。
6、每年端午节有一次全员省内旅游活动,放松您的身心。
7、完善的晋升机制,岗***有发展前景。
8、办公环境良好,工作气氛好,管理人性化。
9、国内外销售均有培训,有平台和展会,上手速度快。
10、高层尊重体恤员工劳动成果,让您得到足够重视
举报

薛槐敏

2020-5-29 11:13:56
嗨,您是問這段Code怎麼改吧?
蜂鳴器叫可以做,但數碼管閃爍,本來就是逐位掃描方式,要一起閃不太可能,但可以ˊ有逐位數碼管ˊˊ掃描不夠快產生的閃爍現象
宣告改成


#include sfr P1M0 =0x92; sfr P1M1 =0x91; char buf[4] ={0x01,0x02,3,4}; char hour=0,min=0,sec=0; char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; volatile unsigned int count=0; char beeper=0; 然後改主函數,和中斷函數,減速版的數碼管顯示就您自己測了,改delay時間長度即可

void t1(void) interrupt 3 { TL1= (char)(15536&0x00ff); TH1= (char)(15536>>8); sec++; if(sec>59) { sec=0; min++; } if(min>59) min=0; } void main(void){ P1M0 =0x0f; P1M1 =0x00; TMOD=0x10; TH1= (char)(15536>>8); TL1= (char)(15536&0x00ff); IE=0x88; TR1=1; while(1) { buf[0]=sec%10; buf[1]=sec/10; buf[2]=min%10; buf[3]=min/10; if(min==0 && sec==0) beeper==1; if(beeper==1) { if(sec<5) beep_on(); //打開Beeper所接的GPIO else { beep_off(); beeper=0; } } if(min==10 || min==20 || min==30) { if(sec<10) dir_slow(); //將數碼管函數重做一個 delay加長,達到閃爍 else dir(); //正常顯示 } else dir(); } } 以上希望有幫助到您
举报

更多回帖

发帖
×
20
完善资料,
赚取积分