初学单片机 年前就整了一个学习板 附带一个光盘的。。但由于电脑系统升级成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结束.
延时或是定时器中断都成!谢谢!