久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10681|回復: 6
打印 上一主題 下一主題
收起左側

單片機多功能秒表語音播報程序加Proteus仿真圖

  [復制鏈接]
跳轉到指定樓層
樓主
多功能秒表加語音播報
正計時模式倒計時模式存儲和語音播報
單片機課設你加了語音就不會一樣了
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源碼如下:
#include<reg51.h>                 //頭文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit p1=P2^7;                //定義數碼關位選
sbit p2=P2^6;
sbit p3=P2^5;
sbit p4=P2^4;
sbit dp=P0^7;
sbit yuyin=P1^0;         //開始按鍵
sbit kaishi=P1^1;         //開始按鍵
sbit jilu=P1^2;                //記錄按鍵
sbit qingling=P1^3;        //清零按鍵
sbit fangxiang=P1^4;//方向按鍵
sbit shezhi=P1^5;        //設置按鍵
sbit zsd=P3^5;                  //指示燈
sbit fmq=P2^2;                //蜂鳴器
uchar shuju[4];                //數碼管顯示變量
uchar code data_7seg[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xab,0xa3};         //共陽數碼管顯示段碼
uchar idata shuju_fen[10];   //保存記錄的秒存儲器
uchar idata shuju_miao[10];        //保存記錄的10毫秒存儲器
uchar count;count1;count2;count3,fx=0;ks=0;sz=0;ss=0;a,b;biaozhi=0;moshi=0;naozhong=0;sss=0;sjd=0;jiwei=0;jishu=0;xuhuan;chakan=0;jw=0;wz=1;         //變量
char fen,miao;fen1=0,miao1=0;  //設置是的變量
sbit         P_DATA    = P2^0;                        //定義數據傳輸端口對應語音芯片P03
uchar daima,bofang=0;
uchar ddd;

//一線,二線,三線有關
#define         H                  1        //定義1為高電平
#define         L                 0        //定義0為低電平

//////////////變量/////////////////
//bit         flag           = 1;
bit         B_DATA;                                                //傳輸數據一位
unsigned char          SB_DATA   = 0;                                //一字節公用數據緩存器
unsigned char          S_DATA    = 0x00;
void delay1s(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=167;c>0;c--)
        for(b=171;b>0;b--)
            for(a=16;a>0;a--);
    _nop_();  //if Keil,require use intrins.h
}
void delay500ms(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=23;c>0;c--)
        for(b=152;b>0;b--)
            for(a=70;a>0;a--);
}
void delay5ms(void)   //誤差 0us
{
    unsigned char a,b;
    for(b=19;b>0;b--)
        for(a=130;a>0;a--);
}
void delay200us(void)   //誤差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=97;a>0;a--);
}
/*--------------------------------------
;模塊名稱:Line_1A(void)
;功    能:實現一線單字節低位在前串口通信函數
;入    參:無
;出    參:0           返回主函數
;-------------------------------------*/
void Line_1A(unsigned char dat)
{
        unsigned char i;
        
        
//********************************************************

        P_DATA = 0;

        delay5ms();                                   //拉低至少5ms

        B_DATA = dat&0X01;
        for(i=0;i<8;i++)
        {
                P_DATA = 1;                                //拉高數據傳輸線,準備傳輸數據
                if(B_DATA==0)
                {        /*表示邏輯電平0*/
                        delay200us();     // 延時200us
                        P_DATA = 0;
                        delay200us();            // 延時600us
                        delay200us();
                        delay200us();            
                }
                else
                {  /*表示邏輯電平1*/
                        delay200us();
                        delay200us();
                        delay200us();
                        P_DATA = 0;
                        delay200us();
                }
                dat = dat>>1;
                B_DATA = dat&0X01;
        }
        P_DATA = 1;                                        //拉高電平
}
void mp3()
{ if (yuyin==0)                    //置零按鍵按下
   { ET1=1;
     TR1=1;  
     if(fx==0)
     Line_1A(14);
         else
         Line_1A(13);
     delay1s();
         delay1s();
         if(fen/10==1)
         {Line_1A(10);delay500ms();

          if(fen%10>=1)
          {Line_1A(fen%10); delay500ms(); }
         }
         else
         if(fen/10>1)
         {Line_1A(fen/10);delay500ms();

      Line_1A(10);delay500ms();

      if(fen%10>=1)
          {Line_1A(fen%10); delay500ms(); }

         }
         else
         {Line_1A(fen%10);delay500ms();}

         Line_1A(11);
     delay500ms();

     if(miao/10==1)
         {Line_1A(10);delay500ms();

          if(miao%10>=1)
          {Line_1A(miao%10); delay500ms(); }
         }
         else
         if(miao/10>1)
         {Line_1A(miao/10);delay500ms();

      Line_1A(10);delay500ms();

      if(miao%10>=1)
          {Line_1A(miao%10); delay500ms(); }

         }
         else
         {Line_1A(miao%10);delay500ms();}

         Line_1A(12);
     delay500ms();

    }while(yuyin==0);
        ET1=0;
    TR1=0;  

}
void qudou(void)     //去抖延遲
{ int i;
   for(i=0;i<2400;i++);
}
void Delay1ms(unsigned int xs)                  //顯示延遲程序
{        unsigned int i,j;
        for(i=0;i<xs;i++)
        for(j=0;j<0;j++);
}
void xianshi()                 //顯示程序
{  p1=0;p2=0;p3=0;p4=0;
   P0=data_7seg[shuju[0]];
   p1=1;p2=0;p3=0;p4=0;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;
   P0=data_7seg[shuju[1]];
   p1=0;p2=1;p3=0;p4=0;
   if(sss==0)
   dp=0;
   else
   dp=1;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;
   P0=data_7seg[shuju[2]];
   p1=0;p2=0;p3=1;p4=0;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;
   P0=data_7seg[shuju[3]];
   p1=0;p2=0;p3=0;p4=1;
   Delay1ms(10);
   p1=0;p2=0;p3=0;p4=0;

   zsd=!fx;                   //方向指示燈
}
void chakanmoshi()                 //查看記錄子程序
{if(jiwei==0) jw=0;
if(jiwei>0)
if(jiwei<=10) jw=jiwei;
if(jiwei>10)  jw=10;
wz=1;
sss=0;
while(chakan==1)
{if(jw==0)
  {shuju[0]=10;
   shuju[1]=11;
   shuju[2]=12;
   shuju[3]=10;
   sss=1;
  }
  else
{qingling=1;                   //按鍵按下查看上一數據
  if(qingling==0)                    
   { qudou();
     if(qingling==0)
    {wz++;
         if(wz>jw) wz=1;
    }while(qingling==0);
        }

  fangxiang=1;                   //按鍵按下查看下一數據
  if(fangxiang==0)                    
   { qudou();
     if(fangxiang==0)
    {wz--;
         if(wz<=0) wz=jw;
    }while(fangxiang==0);        
    }

  shezhi=1;                   //記錄清零
  if(shezhi==0)                    
   { qudou();
     if(shezhi==0)
    {jiwei=0;jw=0;wz=1;
    }while(shezhi==0);
        }
  if(sss==0)
  {shuju[0]=shuju_fen[jw-wz]/10;  //顯示查看的數據轉成數碼管顯示數據
   shuju[1]=shuju_fen[jw-wz]%10;
   shuju[2]=shuju_miao[jw-wz]/10;
   shuju[3]=shuju_miao[jw-wz]%10;
  }
  else
  {shuju[0]=10;
   shuju[1]=wz/10;
   shuju[2]=wz%10;
   shuju[3]=10;
  }
}
xianshi();
jilu=1;                   //按下退出查看
    if(jilu==0)                    
   { qudou();
     if(jilu==0)
    {chakan=0;
    }while(jilu==0);
        }
}
chakan=0;sss=0;count3=0;
}
void key()
{ kaishi=1;                   //按下切換開始和暫停
  if(kaishi==0)                    
   { qudou();
     if(kaishi==0)
    {ks=!ks;   //ks是開始標志
    }while(kaishi==0);
        }

  if(ks==1)                  //開始狀態
  if(fx==0)                  //正計時方向
  if(moshi==0)          //模式為秒表模式
  {jilu=1;                   //記錄按鍵按下
  if(jilu==0)                //記錄數據   
   { qudou();
     if(jilu==0)
    {jiwei++;           //把數據存儲到存儲器里
         for(xuhuan=0;xuhuan<=8;xuhuan++)
         {shuju_fen[9-xuhuan]=shuju_fen[8-xuhuan];
          shuju_miao[9-xuhuan]=shuju_miao[8-xuhuan];}
         shuju_fen[0]=fen;
         shuju_miao[0]=miao;
    }while(jilu==0);
        }}
   if(ks==0 && chakan==0)
   mp3();
   if(ks==0)          //暫停狀態
   {jilu=1;                   //記錄按鍵按下
    if(jilu==0)                    
   { qudou();
     if(jilu==0)
    {chakan=1;                //查看模式標志,準備進入查看記錄子程序
    }while(jilu==0);
        }
   }
   if(chakan==1) chakanmoshi();          //進入查看子程序
  qingling=1;                   //清零按鍵按下,計時重新開始
  if(qingling==0)                    
   { qudou();
     if(qingling==0)
    {if(fx==0)
         {fen=0;miao=0;count=0;}
         else
         {fen=fen1;miao=miao1;count=0;}
    }while(qingling==0);
        }

if(ks==0)                         //暫停狀態
{fangxiang=1;                   //方向按鍵按下,改變計時方向,即正計時和倒計時
  if(fangxiang==0)                    
   { qudou();
     if(fangxiang==0)
    {fx=!fx;                        //fx方向標志
         count=0;
         fen1=0,miao1=0;
         moshi=0;
    }while(fangxiang==0);
        }
  }
  if(ks==0)
  {
  shezhi=1;                   //設置按鍵按下
  if(shezhi==0)                    
   { qudou();
     if(shezhi==0)
    { sz=1;fen1=0,miao1=0;count1=0;           //進入設置子程序
    }while(shezhi==0);
        }
   }
}
void key1()          //設置時按鍵掃描程序
{ shezhi=1;                   //設置鍵按下
  if(shezhi==0)                    
   { qudou();
     if(shezhi==0)
    { sz++;                   //調整設置的目標
          if(sz==5)        sz=0;
    }while(shezhi==0);
        }

  jilu=1;                   //記錄按鍵按下,在設置時功能是加1
  if(jilu==0)                    
   { qudou();
     if(jilu==0)
    {switch(sz)
         {case 1:a=fen1/10;b=fen1%10; a++;if(a>=10) a=0;fen1=a*10+b;break;
          case 2:a=fen1/10;b=fen1%10; b++;if(b>=10) b=0;fen1=a*10+b;break;
          case 3:a=miao1/10;b=miao1%10; a++;if(a>=10) a=0;miao1=a*10+b;break;
          case 4:a=miao1/10;b=miao1%10; b++;if(b>=10) b=0;miao1=a*10+b;break;
         }
    }while(jilu==0);
        }

  qingling=1;                   //清零按鍵按下,在設置時功能是減1
  if(qingling==0)                    
   { qudou();
     if(qingling==0)
    { switch(sz)
         {case 1:a=fen1/10;b=fen1%10; a--;if(a<0) a=9;fen1=a*10+b;break;
          case 2:a=fen1/10;b=fen1%10; b--;if(b<0) b=9;fen1=a*10+b;break;
          case 3:a=miao1/10;b=miao1%10; a--;if(a<0) a=9;miao1=a*10+b;break;
          case 4:a=miao1/10;b=miao1%10; b--;if(b<0) b=9;miao1=a*10+b;break;
         }
    }while(qingling==0);
        }

if(ks==0)
{fangxiang=1;                   //方向按鍵按下,在設置時功能是保存數據,并立即退出設置
  if(fangxiang==0)                    
   { qudou();
     if(fangxiang==0)
    { sz=0;
    }while(fangxiang==0);
        }
  }
}
void shuju_date()                //把要顯示的數據轉化成數碼管顯示的代碼
{if(sz==0)
{shuju[0]=fen/10;
  shuju[1]=fen%10;
  shuju[2]=miao/10;
  shuju[3]=miao%10;}
else
{shuju[0]=fen1/10;
  shuju[1]=fen1%10;
  shuju[2]=miao1/10;
  shuju[3]=miao1%10;
  if(ss==1)
  {if(sz==1) shuju[0]=10;
   else if(sz==2) shuju[1]=10;
   else if(sz==3) shuju[2]=10;
   else if(sz==4) shuju[3]=10;
  }
}
}
void panduan()                           //模式判斷子程序
{biaozhi=0;                                  //進入判斷標志清零
if(fx==0)                                  //方向為正計時
{if(miao1==0)                          
{if(fen1==0) moshi=0;         //設置的時間為0,模式就為0:秒表模式
  else moshi=1;fen=0;miao=0;}                //設置的時間不為0,模式就為1:定時模式
else moshi=1;fen=0;miao=0;}                        //設置的時間不為0,模式就為1:定時模式
else
{fen=fen1;miao=miao1;}          //方向為倒計時,模式就為2:倒計時模式
}
void jiegou()          //結果處理子程序
{if(fx==0)
{if(moshi==0)          //秒表模式
{while(fen>=100)        //計時超過范圍,顯示“----”
  {jishu=1;
   if(sss==0)
  {p1=0;p2=0;p3=0;p4=0;
   P0=0xbf;                                                   //顯示“----”
   p1=1;p2=0;p3=0;p4=0;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;
   P0=0xbf;
   p1=0;p2=1;p3=0;p4=0;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;                                                   
   P0=0xbf;
   p1=0;p2=0;p3=1;p4=0;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;
   P0=0xbf;
   p1=0;p2=0;p3=0;p4=1;
   Delay1ms(10);
   p1=0;p2=0;p3=0;p4=0;
  }
  else
  {p1=0;p2=0;p3=0;p4=0;
   P0=0xff;                                                   //顯示“----”
   p1=1;p2=0;p3=0;p4=0;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;
   P0=0xff;
   p1=0;p2=1;p3=0;p4=0;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;                                                   
   P0=0xff;
   p1=0;p2=0;p3=1;p4=0;
   Delay1ms(10);

   p1=0;p2=0;p3=0;p4=0;
   P0=0xff;
   p1=0;p2=0;p3=0;p4=1;
   Delay1ms(10);
   p1=0;p2=0;p3=0;p4=0;
  }

   fmq=sss;

   kaishi=1;                   //開始按鍵按下
   if(kaishi==0)                    
   { qudou();
     if(kaishi==0)
    {ks=10;fen=0;miao=0;sss=0;jishu=0;        //計時清零,并返回秒表模式,等待開始計時
    }while(kaishi==0);
        }
  }
  fmq=1;
  count2=0;
  sss=0;
}
else                           //定時模式
{if(miao==miao1)
  if(fen==fen1)  naozhong=1; //時間到,鬧鐘標志為1,鬧鐘開啟
  while(naozhong==1)        //進入鬧鐘開啟狀態
  {        jishu=1;
     ks=0;                                //計時停止
         if(sss==0)                         //以下顯示實現顯示閃爍(代碼)
        {shuju[0]=fen/10;
         shuju[1]=fen%10;
         shuju[2]=miao/10;
         shuju[3]=miao%10;
         }
        else
        {shuju[0]=10;
         shuju[1]=10;
         shuju[2]=10;
         shuju[3]=10;
        }
        fmq=sss;
        xianshi();                   //顯示
        kaishi=1;                   //開始按鍵按下
   if(kaishi==0)                    
   { qudou();
     if(kaishi==0)
    {naozhong=0;fen=0;miao=0;sss=0;jishu=0;                  //退出
    }while(kaishi==0);
        }
  }
  fmq=1;
  count2=0;
  sss=0;
}
}
else
{if(ks==1)                //開始狀態
  {if(fen==0)
   if(miao==0) sjd=1;} //倒計時結束
  while(sjd==1)                   //時間到處理
  {        jishu=1;
     ks=0;                                //計時停止
         if(sss==0)                          //以下顯示實現顯示閃爍(代碼)
        {shuju[0]=fen/10;
         shuju[1]=fen%10;
         shuju[2]=miao/10;
         shuju[3]=miao%10;
         }
        else
        {shuju[0]=10;
         shuju[1]=10;
         shuju[2]=10;
         shuju[3]=10;
        }
        fmq=sss;
        xianshi();                   //顯示
        kaishi=1;                   //開始按鍵按下
   if(kaishi==0)                    
   { qudou();
     if(kaishi==0)
    {sjd=0;fen=fen1;miao=miao1;sss=0;jishu=0;         //退出
    }while(kaishi==0);
        }
  }
   fmq=1;
  count2=0;
  sss=0;
}
}

void main()                //主程序
{      TMOD=0x11;                     //定義中斷,用來計時
       TH0=0x0D8;
       TL0=0x0F0;
       TR0=1;      
       ET0=1;  
           TH1=0x0FC;
       TL1=0x18;
       ET1=0;
       TR1=0;                                                      
       EA=1;                     
       while(1)      
       {shuju_date();         //數據轉化成顯示代碼子程序
            xianshi();                 //顯示程序
            key();                         //按鍵掃描
                while(sz>0)                 //進入設置模式
                {biaozhi=1;                 //退出設置時,進入判斷標志
                 key1();                 //設置按鍵掃描
                 shuju_date();         //數據轉化成顯示代碼子程序
             xianshi();                 //顯示程序
                }
                if(biaozhi==1) panduan();  //退出設置時,進入判斷模式
                jiegou();                //計時結果處理
           }
}
void time0(void) interrupt 1         //中斷計時

{     TH0 = 0x0D8;
       TL0 = 0x0F0;
  if(fx==1)  
  if(ks==1)
  {if(fen==0)
   if(miao==0) {sjd=1;ks=0;}}
      if(ks==1)
          {count++;
        if(count==1)  
        { count=0;
              if(fx==0)
                    {miao++;
                   if(miao>=100) {miao=0;fen++;}  //  正計時
                  }
                  else
                  {miao--;
                   if(miao<0) {fen--;miao=99;}         //倒計時
                   }
        }
           }

           if(sz>0)                                        //設置時閃爍
           {count1++;
        if(count1==100)  
                {ss=!ss;
                 count1=0;
                }
           }

           if(jishu==1)
           {count2++;
        if(count2==100)  
                {sss=!sss;
                 count2=0;
                }
           }


           if(jw>0)                                        //查看記錄是,顯示顯示切換
           {count3++;
        if(count3==100)  
                {sss=!sss;
                 count3=0;
                }
           }
}
void Timer1Interrupt(void) interrupt 3
{
  TH1 = 0x0FC;
  TL1 = 0x18;
  switch(ddd)
  {case 0:
   p1=0;p2=0;p3=0;p4=0;
   P0=data_7seg[shuju[0]];
   p1=1;p2=0;p3=0;p4=0;
   break;

   case 1:
   p1=0;p2=0;p3=0;p4=0;
   P0=data_7seg[shuju[1]];
   p1=0;p2=1;p3=0;p4=0;
   if(data_7seg[shuju[1]]==0xab)
   dp=1;
   else         if(chakan==1 && sss==1)
   dp=1;
   else
   dp=0;
   break;

   case 2:
   p1=0;p2=0;p3=0;p4=0;
   P0=data_7seg[shuju[2]];
   p1=0;p2=0;p3=1;p4=0;
   break;

   case 3:
   p1=0;p2=0;p3=0;p4=0;
   P0=data_7seg[shuju[3]];
   p1=0;p2=0;p3=0;p4=1;
   break;
   }
   ddd++;
   if(ddd==4) ddd=0;
}

全部資料51hei下載地址:
電路仿真.rar (23.87 KB, 下載次數: 136)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:324639 發表于 2019-1-20 15:03 | 只看該作者
樓主這個仿真怎么用的,是可以播報出人聲嗎
回復

使用道具 舉報

板凳
ID:404797 發表于 2019-1-21 23:25 | 只看該作者
樓主,我把你的程序編譯后導入你的仿真電路圖進行仿真,怎么沒什么效果?沒聲音,示波器也是水平直線,數碼管也沒顯示,按播報、開始、記錄、清零、方向、設置等按鍵均沒反應。怎么樣仿真才能聽到語音盼指導一下。
回復

使用道具 舉報

地板
ID:295874 發表于 2019-10-14 13:50 | 只看該作者
初學者最好不能下載,資料不完整。
回復

使用道具 舉報

5#
ID:649885 發表于 2019-11-30 20:51 | 只看該作者
很坑
回復

使用道具 舉報

6#
ID:220342 發表于 2021-2-27 17:18 | 只看該作者
資料不完整,缺了語音的內容。
回復

使用道具 舉報

7#
ID:86450 發表于 2022-3-27 15:09 | 只看該作者
liangzhihao 發表于 2019-1-20 15:03
樓主這個仿真怎么用的,是可以播報出人聲嗎

https://www.bilibili.com/video/bv19F411W7qw  這個能播放人聲
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人免费视频 | 国产精品久久久久久久久久久久久久 | av性色全交蜜桃成熟时 | 久久国产精品视频免费看 | 在线观看亚洲欧美 | 国产成人网 | 国产精品爱久久久久久久 | 欧美h| 中文字幕第九页 | 日韩欧美在线一区 | 成人免费黄视频 | 国产一级视频 | 拍真实国产伦偷精品 | 可以免费看的毛片 | 久久久人成影片一区二区三区 | 免费黄色片在线观看 | 精品无码三级在线观看视频 | 欧美成人一区二区 | 亚洲情侣视频 | 国产精品国产精品国产专区不卡 | 91精品国产91久久久久久吃药 | 日韩成人在线视频 | 福利视频一区 | 91 在线| 国产免费一区二区三区 | 久久久69 | 亚洲成人福利在线观看 | 欧美精品一区在线 | 欧美日韩大陆 | 精品一区二区久久久久久久网站 | 国产午夜精品一区二区 | 欧美日韩大片 | 中文字幕一区二区三区乱码图片 | 999精彩视频| 亚洲成人综合在线 | 国产日韩免费视频 | 狠狠躁18三区二区一区 | 羞羞视频网页 | 国产精品不卡 | 8x国产精品视频一区二区 | 免费在线观看黄网站 |