• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

请教,求大神指点!

初学单片机 年前就整了一个学习板 附带一个光盘的。。但由于电脑系统升级成64位了。原来的IED光驱检测不到了。所以一直也都没有看附带光盘里的教程。下班回家了就没事自己个鼓掏。网上看了很多的教程,但是闭门造车终究是不行的。。。

发此帖一是寻求良师益友,二是请坛中大神解惑!(寻求良师益友,有诚意的请加QQ1677599388、PS:不知道能不能发QQ号

 

这是一个利用定时器写的简易时钟C,现在我想要做出整点蜂鸣器响5秒。响500MS闭500MS,直至5S结束!求大神结个思路或是直接给个C我慢慢分析!谢谢!

/*利用定时器的时间显示及按键调整时分秒*/

#include

#define  uchar unsigned char

#define  uint  unsigned int

sbit a=P1^1;   //74HC138_a

sbit b=P1^2;   //74HC138_b

sbit c=P1^3;   //74HC138_c

//sbit le=P1^0;   //74HC573_le

sbit bz=P1^4;    //蜂鸣器输出口

sbit H_KEY=P2^2;             //时调整键

sbit M_KEY=P2^1;             //分调整键

sbit S_KEY=P2^0;             //秒调整键

void seconds_adjust();           //秒调整函数

void minute_adjust();            //分调整函数

void hours_adjust();             //时调整函数

char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};           //数码管显示数组

uchar hours=11, minute=59, seconds=55;  //时间初始化

uchar deda=0;                  

 void delay(uchar count);         //延时模块          

 void zhh();                      //走时模块

void display();                  //显示模块

void init_timer()//采用定时器0中断,50MS更新一次

{  

TMOD=0x01; 

TH0=(65536-50000)/256; 

TL0=(65536-50000)%256;

 IE=0x82;  

TR0=1;

}

void T0_srv(void) interrupt 1

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

 deda++;

}

void seconds_adjust()//秒调整模块

while(!S_KEY) display();         //等待秒调整键松开

 deda=0;seconds++;                 //毫秒清零、秒加1

 if(seconds==60)seconds=0;          //如果秒等于60,秒变0

}

void minute_adjust()//分调整模块

while(!M_KEY) display();    

 seconds=0;minute++;               

if(minute==60)minute=0;        

}

void hours_adjust()//时调整模块

while(!H_KEY) display();         

 seconds=0;hours++;        

 if(hours==24)hours=0;          

}

void zhh()//走时模块

{

 if(deda>=20)seconds++,deda=0;

 if(seconds==60)minute++,seconds=0;

 if(minute==60)hours++,minute=0;

 if(hours==24)hours=0;

}

void display()//显示模块

{

 le=1;                  //段选始终高电平

 a=0,b=0,c=0;           //位选最高位选通 

P0=table[hours/10];    //P0口送段码   

delay(5);              //延迟5MS

 P0=0;                  //P0口段码清口消隐

 

 a=1,b=0,c=0;

  P0=table[hours%10]; 

 delay(5);

 P0=0;

 

 a=0,b=1,c=0;

 P0=table[10]; 

delay(5);

 P0=0; 

 

 a=1,b=1,c=0;

  P0=table[minute/10];

   delay(5); 

P0=0;

 

 

 a=0,b=0,c=1;

  P0=table[minute%10]; 

  delay(5);

 P0=0;

 

 a=1,b=0,c=1; 

P0=table[10];

 delay(5);

 P0=0;

 

 a=0,b=1,c=1; 

 P0=table[seconds/10];  

 delay(5); 

P0=0;

 

 a=1,b=1,c=1; 

 P0=table[seconds%10]; 

  delay(5); 

P0=0;

}

void delay(uchar k)//延时模块1MS

{  

uchar i,j;

 for(i=0;i

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

}

void voice()//整点蜂鸣器叫

if((minute==0)&(seconds<=0))

 {   

????

 }

}

void main()//主程序

init_timer();    //定时模块 

 while(1)         //无限循环 

 {   

 if(!H_KEY) hours_adjust();   //时调整     

  if(!M_KEY) minute_adjust();  //分调整  

  if(!S_KEY) seconds_adjust(); //秒调整  

  zhh();          //走时模块         

 display();      //显示 

 voice();        //蜂鸣器整点响5S 

 }

}

 

恳请大神指导一下?????中应如何实现蜂鸣器响5秒。响500MS闭500MS,直至5S结束.

延时或是定时器中断都成!谢谢!

 

全部回复(4)
正序查看
倒序查看
2014-10-30 11:40
检查秒钟  分钟  如果不为0就不工作,如果秒为0了,再检查分钟,也为0了,把一个标志变化(例如:flag初始为0;把flag=1)     闹钟子模块就去检查这个标志flag=1就工作,在工作的时候要有一个数据去比对  看闹铃多长时间,结束后退出  把flag=0;方便下次使用标志
0
回复
z39613619
LV.4
3
2014-10-31 23:20
@yueyunno1
检查秒钟 分钟 如果不为0就不工作,如果秒为0了,再检查分钟,也为0了,把一个标志变化(例如:flag初始为0;把flag=1)  闹钟子模块就去检查这个标志flag=1就工作,在工作的时候要有一个数据去比对 看闹铃多长时间,结束后退出 把flag=0;方便下次使用标志

终于有热心人回复了。。泪奔中..........

 

整点报时置标志位我也试过...因为是无源蜂鸣器,就要另做一个蜂鸣器驱动程序,如果用简单的延时来做整出来的声音难听地不行不行的还影响程序的执行.用取反也难听.这几天都在鼓捣用T0做计时时间,用T1做4KHZ驱动蜂鸣器.但是由于初学不平有限弄不出来.功力不够,有待加油!

感谢你的回复!

0
回复
ytwsdz
LV.7
4
2014-11-10 19:31
@z39613619
终于有热心人回复了。。泪奔中.......... 整点报时置标志位我也试过...因为是无源蜂鸣器,就要另做一个蜂鸣器驱动程序,如果用简单的延时来做整出来的声音难听地不行不行的还影响程序的执行.用取反也难听.这几天都在鼓捣用T0做计时时间,用T1做4KHZ驱动蜂鸣器.但是由于初学不平有限弄不出来.功力不够,有待加油!感谢你的回复!
哈哈 你想好听 搞个音乐换个喇叭。电子琴程序
0
回复
z39613619
LV.4
5
2014-11-11 22:36
@ytwsdz
哈哈你想好听搞个音乐换个喇叭。电子琴程序
不要求好听啥的。。。初学嘛。一步一步的来。争取每步都学懂吧。。。至于能学成什么样,坚持总会没错!说实话也没指着这个吃饭。完全兴趣。
0
回复