找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11918|回复: 11
收起左侧

51单片机做时钟程序,怎么写代码让 蜂鸣器整点报时?

  [复制链接]
ID:322150 发表于 2018-5-4 15:54 | 显示全部楼层 |阅读模式
求各位大神:
利用51单片机做时钟程序,怎么写代码让
蜂鸣器整点报时?
回复

使用道具 举报

ID:123289 发表于 2018-5-4 19:28 | 显示全部楼层
建议楼主改学CEO。
回复

使用道具 举报

ID:303383 发表于 2018-5-4 20:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:356445 发表于 2018-6-27 18:33 | 显示全部楼层
小猫猫爱吃鱼 发表于 2018-5-4 20:13
你好!整点报时,是语音报出几点整吗?具体要求可以加我QQ

你的QQ是多少?
回复

使用道具 举报

ID:360463 发表于 2018-6-27 21:04 | 显示全部楼层
怎么报时,响一下吗,在整点的时候放个标志位置1,在函数里放个while判断这个标志位,到了时间进去后标志位清加上零蜂鸣响的代码就可以了。
回复

使用道具 举报

ID:360656 发表于 2018-6-27 23:03 | 显示全部楼层
if (!sec && !min) { //整点报时
          for (i = 0; i < 200; i++) {
            SPK = 0; for (j = 0; j < 100; j++);
            SPK = 1; for (j = 0; j < 100; j++);
        } }spk是任意定义的端口当分和秒等于0是就报时
回复

使用道具 举报

ID:360680 发表于 2018-6-27 23:44 | 显示全部楼层
#define uchar unsigned char //定义一下方便使用 #define uint  unsigned int #define ulong unsigned long #include <reg52.h>     //包括一个52标准内核的头文件 uchar code zixing[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code ziwei[]={0x10,0x20,0x40,0x80}; uchar *h,*m; uchar hour=12,min=0,sec=0,h_ding,m_ding,count=0,ms_50,ms_10,miaobiao_sec; sbit dp=P0^7; sbit k1=P3^2; sbit k2=P3^3; sbit k3=P3^4; sbit sound=P2^3; sfr ZIXING=0x80;     //p0口输出字形 sfr ZIWEI=0xa0;         //P2口输出字位 typedef enum      //枚举类型:4种状态// {     CLOCK,     SET_RING1,     SET_RING2,     MIAOBIAO_RUN, }STATE; STATE status; typedef struct       //定时时间的数据结构// {     uchar hour;     uchar min; }DINGSHI_TIME; DINGSHI_TIME dingshi_time[2]; #define NO_KEY    -1    //定义一下方便使用 #define KEY_1    1 #define KEY_2    2 #define KEY_3    3 bit show_on_flag; //#######定时器T0中断服务程序########// Timer0()  interrupt 1 {      TH0=0x3c;TL0=0xb4;     //50ms      ms_50++;      if(ms_50==20) {sec++;ms_50=0;}                            if(sec==60) {sec=0;min++;}       if(min==60) {min=0;hour++;}      if(hour==24) {hour=0;}   } //#######定时器T1中断服务程序########// Timer1()  interrupt 3 {      TH1=0xd8;TL1=0xf4;          //10ms      ms_10++;      if(ms_10==100)      {         miaobiao_sec++;         ms_10=0;     }                            if(miaobiao_sec==60)          miaobiao_sec=0; } //##############数码管显示#####################// show(uchar time_high,uchar time_low) {       uchar m;     uint n,k;     k=time_high*1000/10+time_low;     for(m=0;m<4;m++)     {             ZIXING=zixing[k%10];         if(ms_50<10)             dp=0;         ZIWEI=~ziwei[m];         for(n=0;n<500;n++);         ZIXING=0xff;         for(n=0;n<100;n++);         k=k/10;     } } //显示 on 定时编号// show_on(uchar id) //id:定时编号// {     uchar m;     uint n;          for(m=0;m<2;m++)     {             ZIXING=zixing[id%10];         dp=0;         ZIWEI=~ziwei[m];         for(n=0;n<500;n++);         ZIXING=0xff;         for(n=0;n<80;n++);         id=id/10;     }     ZIXING=0xc8;    //字母n//     ZIWEI=~ziwei[2];     for(n=0;n<500;n++);     ZIXING=0xff;     for(n=0;n<200;n++);     ZIXING=0xc0;    //字母0//     ZIWEI=~ziwei[3];     for(n=0;n<500;n++);     ZIXING=0xff;     for(n=0;n<200;n++); } /*************启动秒表***************/ void run_miaobiao() {     ms_10=0;     miaobiao_sec=0;     TH1=0xd8;    //标准是0xd8e4     TL1=0xf4; //    TR1=1;        //启动定时器1 } /*************显示秒表***************/ void show_miaobiao() {     show(miaobiao_sec,ms_10); } /***********  检测按键动作函数  *************/ int    get_key() {     uchar d;     if(!k1)     {         for(d=0;d<50;d++);         if(!k1)         {             while(!k1);             return(KEY_1);         }     }     if(!k2)     {         for(d=0;d<50;d++);         if(!k2)         {             while(!k2);             return(KEY_2);         }     }     if(!k3)     {         for(d=0;d<50;d++);         if(!k3)         {             while(!k3);             return(KEY_3);         }     }     else return NO_KEY; } /***************************************** 各状态下按键处理函数 ******************************************/ void key_process_clock() // 处理时钟状态下的按键和显示// {     switch(get_key())     {         case KEY_1:             status=SET_RING1;         ;//切换状态             show_on_flag=1;               show_on(1);             break;         case KEY_2:             hour++;             if(hour==24) hour=0;             show(hour,min);             break;         case KEY_3:             min++;             if(min==60) min=0;             show(hour,min);             break;         case NO_KEY:               //没有按键操作//             show(hour,min);             break;     } } /****************设定时1或2状态下的按键处理及显示*****************/ void key_process_set_dingshi() {     switch(get_key())     {         case KEY_1:             if(status==SET_RING1)             {                 status=SET_RING2;         //切换设第二段定时状态                 show_on_flag=1;                 show_on(2);             }             else if(status==SET_RING2)             {                 status=MIAOBIAO_RUN;         //切换到秒表运行状态                 run_miaobiao();                   show_miaobiao();             }             break;         case KEY_2:             dingshi_time[status-1].hour++;             if(dingshi_time[status-1].hour==24)                  dingshi_time[status-1].hour=0;             show(dingshi_time[status-1].hour,dingshi_time[status-1].min);             show_on_flag=0;             break;         case KEY_3:             dingshi_time[status-1].min++;             if(dingshi_time[status-1].min==60)                  dingshi_time[status-1].min=0;             show(dingshi_time[status-1].hour,dingshi_time[status-1].min);             show_on_flag=0;             break;         case NO_KEY:       //没有按键操作//             if(show_on_flag)                 show_on(status);             else                 show(dingshi_time[status-1].hour,dingshi_time[status-1].min);             break;     } }     /********秒表运行状态按键处理及显示*********/ void key_process_miaobiao_run() {     switch(get_key())     {         case KEY_1:             TR1=0;             status=CLOCK;                 //回到时钟显示状态             break;         case KEY_2:             TR1=!TR1;                    //定时器1暂停、继续              break;         case KEY_3:             TR1=0;                        //秒表复位             miaobiao_sec=0;             ms_10=0;             break;         case NO_KEY:                    //无按键操作//             show_miaobiao();             break;     } } //############主程序#######################// void main(void)      {   sound=1;     TH0=0x3c;     TL0=0xb4;     TMOD=0x11;     TR0=1;     ET0=1;     TR1=0;     ET1=1;     EA=1;     status=CLOCK;          dingshi_time[0].hour=0;     dingshi_time[0].min=0;     dingshi_time[1].hour=0;     dingshi_time[1].min=0;     while(1) //程序循环            {          switch(status)          {              case CLOCK:                 key_process_clock();   // 处理时钟状态下的按键和显示//                 break;                   case SET_RING1:              case SET_RING2:                 key_process_set_dingshi();    //处理设置定时状态下的按键和显示//                 break;                   case MIAOBIAO_RUN:                 key_process_miaobiao_run();    //处理秒表状态下的按键和显示//                 break;          }         if(             ((hour==dingshi_time[0].hour)        //定时响铃//             &&(min==dingshi_time[0].min)             &&(sec<5))             ||             ((hour==dingshi_time[1].hour)        //定时响铃//             &&(min==dingshi_time[1].min)             &&(sec<5))           )             sound=0;         else    sound=1;     } }
回复

使用道具 举报

ID:360680 发表于 2018-6-27 23:44 | 显示全部楼层
这个功能建议你用DS1302时钟芯片实现!编程就容易多
回复

使用道具 举报

ID:213173 发表于 2018-6-28 09:19 | 显示全部楼层
//简单的整点30秒时长报时
void Buzzer_nz()
{
        if((min==0)&&(sec<30))
                Buzzer=1;
        else Buzzer=0;
}
回复

使用道具 举报

ID:357395 发表于 2018-6-28 22:00 | 显示全部楼层
void Buzzer_nz()
{
        if((min==0)&&(sec<30))
                Buzzer=1;
        else Buzzer=0;
}
回复

使用道具 举报

ID:361466 发表于 2018-6-29 02:29 | 显示全部楼层
同时判断分位和秒位全部为零即可,如果需要语音报数字首先要对语音功能进行学习
回复

使用道具 举报

ID:357536 发表于 2018-7-1 13:35 | 显示全部楼层
小猫猫爱吃鱼 发表于 2018-5-4 20:13
你好!整点报时,是语音报出几点整吗?具体要求可以加我QQ

#include
#define uint unsigned int

sbit bb=P3^5;                  //位定义蜂鸣器接口
sbit led1=P0^0;       //位定义LED接口
unsigned int i=0;

void delay(uint z);       //延迟函数声明

void main()
{
TMOD=0x01;                 //TMOD赋值,以确定T0和T1的工作方式      
TH0=(65536-50000)/256;   //计算初值,并将其写入TH0、TL0或TH1、TL1
TL0=(65536-50000)%6;
EA=1;   //打开总中断
ET0=1;   //打开定时器0中断
TR0=1;   //启动定时器0
while(1)
{
if(i==20)   //定时器计数时间20*50MS=1S
{
i=0;               //清除标志位
led1=0;
bb=0;
delay(500);
led1=1;
bb=1;
delay(500);
}
}
}

void exter0() interrupt 1       //定时器0中断函数
{
TH0=(65536-50000)/256; //中断函数中也需要赋定时器初值
TL0=(65536-50000)%6;
i++;                        //定时器每50MS就使i加一
}

void delay(uint z) //延迟函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=20;y>0;y--);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表