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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1298|回復: 3
收起左側

51單片機GPS報時器程序問題求助

[復制鏈接]
ID:297872 發表于 2022-10-4 19:51 | 顯示全部樓層 |閱讀模式
本人是一名業余無線電愛好者,最近想著給本地朋友做一套中繼臺的信標系統,就是整點報時加語音提示,想了好多方案,差了好多資料,最后決定用GPS授時,單片機讀取時間,然后比較,再通過串口輸出指令來控制MP3播放模塊,現在問題是,GPS讀取時間已經完成,串口整點發指令正常,唯獨是,只能發一次指令,發一次指令后,單片機不再讀取更新時間,就無法進行下一個時間的報時,請大家多多指點,我沒學過單片機,程序都是抄的,不好意思了。
#include "stc15.h"
#define LEDPORT P2
typedef unsigned char  uint8;//
#define uint unsigned int
sbit D1=P4^1;
sbit D2=P4^2;
sbit D3=P4^4;
sbit D4=P4^5;
sbit LED=P3^6;
sbit LED1=P3^7;
sbit play=P3^3;
unsigned char h,hour,min,sec;
bit rev_start,rev_stop;
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9,
unsigned char code fs[]={0x7e,0x04,0x41,0x00,0x01,0xef};//播放器發送指令
unsigned char  buf[80]; //請把GPS那貨發來的數據放到我的肚子里

void delayms(int ms)
{
        int i,j;
        for(i=ms;i>0;i--)
                for(j=845;j>0;j--);
}
void TimerInit()
{
                                TMOD=0x21;
                                TH0 = 0xF1; //4ms左右
                                TL0 = 0x9A;
                                ET0=1;
                                TR0=1;
                                SCON = 0x50;//使用串行工作方式1,10位異步收發8位數據,波特率可變(由T1的溢出率控制)
                                AUXR |= 0x40;                //定時器時鐘1T模式
                                AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
                                TMOD &= 0x0F;                //設置定時器模式
                                TL1 = 0xE0;                //設置定時初始值
                                TH1 = 0xFE;                //設置定時初始值
                                ET1 = 0;                //禁止定時器%d中斷
                                TR1 = 1;                //定時器1開始計時
                    ES = 1;
                                EA=1;
}
void Display(unsigned char hour,min)   //數碼管顯示
{
                static unsigned char i;
                LEDPORT=0xff;
                switch (i)
                {
                                case 0: if(hour/16) LEDPORT=tab[hour/16];
                             else LEDPORT=tab[10];       D1=0;D2=D3=D4=1;break;
                                case 1: LEDPORT=tab[hour%16];  D2=0;D1=D3=D4=1;break;
                                case 2: LEDPORT=tab[min/16];   D3=0;D1=D2=D4=1;break;
                                case 3: LEDPORT=tab[min%16];   D4=0;D2=D3=D1=1;break;
                }
                i++;
                if(i==4)i=0;
}
void Timer0() interrupt 1
{
                TH0 = 0xF1;
                TL0 = 0x9A;
                Display(hour,min);//定時器兄弟簡單而單調的工作,很輕松的。每4ms刷新下數碼管,全年無休哦
}

/*********************串口發送*******************************/
void fasong()
{
        TI=0;
        for(h=0;h<6;h++)
        {
          SBUF=fs[h];
                delayms(5);
                TI=0;
        }
}
/*************************串口數據接收**************************/
void Uart_Receive(void) interrupt 4
{
                unsigned char ch,num;
                ES = 0;
                if (RI)//如果接收完成則進入
                {
                                ch = SBUF;
                                if (ch == '$')  //如果收到字符'$',便開始接收
                                {
                                                rev_start = 1;
                                                rev_stop  = 0;  //接收停止標志
                                }
                                if (rev_start == 1)       //標志位為1,開始接收
                                {
                                                buf[num++] = ch;  //字符存到數組中
                                                if (ch == '\n')       //如果接收到換行
                                                {
                                                                buf[num] = '\n';
                                                                rev_start = 0;
                                                                rev_stop  = 1;  //接收停止標志
                                                                num = 0;
                                                            if( hour==0x07 && min==0x00 && sec==0x00) //早上7點
                                                            {
                                                                            fasong();                   //發送播放指令前4字節 (頭幀及命令幀)
                                                                                   delayms(5);
                                                                                SBUF=0x01;                   //發送播放指令第5字節(第一首)
                                                                                delayms(5);
                                                                                SBUF=0xef;                   //發送播放指令前6字節(尾幀)
                                                            }
                                                                if( hour==0x08 && min==0x00 && sec==0x00) //上午8點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x02;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x09 && min==0x00 && sec==0x00) //上午9點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x03;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x10 && min==0x00 && sec==0x00) //上午10點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x04;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x11 && min==0x00 && sec==0x00) //上午11點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x05;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x12 && min==0x00 && sec==0x00) //中午12點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x06;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x13 && min==0x00 && sec==0x00) //下午1點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x07;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x14 && min==0x00 && sec==0x00) //下午2點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x08;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x15 && min==0x00 && sec==0x00) //下午3點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x09;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x14 && min==0x00 && sec==0x00) //下午4點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x0a;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x17 && min==0x54 && sec==0x00) //下午5點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x0b;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x18 && min==0x00 && sec==0x00) //晚上6點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x0c;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x19 && min==0x00 && sec==0x00) //晚上7點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x0d;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x20 && min==0x00 && sec==0x00) //晚上8點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x0e;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x21 && min==0x00 && sec==0x00) //晚上9點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x0e;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                                                if( hour==0x22 && min==0x00 && sec==0x00) //晚上10點
                                                            {
                                                                            fasong();
                                                                                   delayms(5);
                                                                                SBUF=0x0f;
                                                                                delayms(5);
                                                                                SBUF=0xef;
                                                            }
                                        }
                                }
                RI = 0; //RI清0,重新接收
            ES = 1; //串口1中斷允許
                }
                if(TI)
            {  
                TI = 0;
            }
}
void main()
{
            LED1=0;
                P0M0=0X00;P0M1=0X00;
                P1M0=0X00;P1M1=0X00;
                P2M0=0X00;P2M1=0X00;
                P3M0=0X00;P3M1=0X00;
                P4M0=0X00;P4M1=0X00;
                TimerInit();
                while(1)
                {
                                if((rev_stop==1)&&(buf[5]=='A'))//如果接收到GNGGA
                                {
                                                ES=0;
                                                hour= (buf [7]-0x30)* 16+ buf[8] -0x30;
                                                min=  (buf [9]-0x30)* 16+ buf[10]-0x30;
                                                sec=  (buf[11]-0x30)* 16+ buf[12]-0x30;
                                                hour=  hour / 16 * 10 + hour % 16;
                                            LED=!LED;
                                            LED1=!LED1;
                                                hour= (hour+8) % 24;//UTC Time換算成北京時間
                                                hour=hour/10*16+hour%10;
                                                ES=1;
                                                rev_stop=0;
                }
                }
}

回復

使用道具 舉報

ID:277550 發表于 2022-10-5 11:49 | 顯示全部樓層
原邏輯,最大的問題:如果buf[5]=='A'不成立,不會再接收GPS訊號。

程序當中,有建議的地方,使用//!!注釋了



// http://www.zg4o1577.cn/bbs/dpj-223997-1.html
// GPS 定時報時
  1. #include "stc15.h"

  2. typedef unsigned char uint8;//
  3. #define uint unsigned int

  4. #define LEDPORT P2
  5. sbit D1  =P4^1;
  6. sbit D2  =P4^2;
  7. sbit D3  =P4^4;
  8. sbit D4  =P4^5;
  9. sbit LED =P3^6;
  10. sbit LED1=P3^7;
  11. sbit play=P3^3;
  12. unsigned char num=0; //!!這個是全局變量,不要定義在中斷函數內
  13. unsigned char hour, min, sec;
  14. bit rev_start, rev_stop, uartBusy=0;
  15. unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9,
  16. unsigned char code fs[] ={0x7e,0x04,0x41,0x00,0x01,0xef};//播放器發送指令
  17. unsigned char  buf[80];        //請把GPS那貨發來的數據放到我的肚子里

  18. void delayms(int ms){
  19.         int i,j;
  20.         for(i=ms;i>0;i--)
  21.         for(j=845;j>0;j--);
  22. }

  23. void TimerInit(){
  24.         TMOD  = 0x21;
  25.         TH0   = 0xF1;        //4ms左右
  26.         TL0   = 0x9A;
  27.         ET0   = 1;
  28.         TR0   = 1;
  29.         SCON  = 0x50;        //使用串行工作方式1,10位異步收發8位數據,波特率可變(由T1的溢出率控制)
  30.         AUXR |= 0x40;        //定時器時鐘1T模式
  31.         AUXR &= 0xFE;        //串口1選擇定時器1為波特率發生器
  32.         TMOD &= 0x0F;        //設置定時器模式
  33.         TL1   = 0xE0;        //設置定時初始值
  34.         TH1   = 0xFE;        //設置定時初始值
  35.         ET1   = 0;                //禁止定時器%d中斷
  36.         TR1   = 1;                //定時器1開始計時
  37.         ES    = 1;
  38.         EA    = 1;
  39. }

  40. void Display(unsigned char hour,min){   //數碼管顯示
  41.         static unsigned char iDisp; //!!原來是i,沒意義,變量名太短、還容易混淆
  42.         LEDPORT=0xff;
  43.         switch (iDisp){
  44.         case 0: if(hour/16) LEDPORT=tab[hour/16];
  45.                 else LEDPORT=tab[10];  D1=0;D2=D3=D4=1;break;
  46.         case 1: LEDPORT=tab[hour%16];  D2=0;D1=D3=D4=1;break;
  47.         case 2: LEDPORT=tab[min/16];   D3=0;D1=D2=D4=1;break;
  48.         case 3: LEDPORT=tab[min%16];   D4=0;D2=D3=D1=1;break;
  49.         }
  50.         iDisp++;
  51.         if(iDisp==4)iDisp=0;
  52. }

  53. void Timer0() interrupt 1{
  54.         TH0 = 0xF1;
  55.         TL0 = 0x9A;
  56.         Display(hour, min);//定時器兄弟簡單而單調的工作,很輕松的。每4ms刷新下數碼管,全年無休哦
  57. }

  58. /*********************串口發送*******************************/
  59. void uartByte(unsigned char c){//統一串口發送
  60.         uartBusy=1;
  61.         SBUF=c;
  62.         while(uartBusy==1);        //!!延時的串口處理不好
  63. }

  64. void faSongHead(){
  65.         unsigned char i;        //!!局部變量,在局部定義
  66.         for(i=0; i<6; i++){
  67.                 uartByte(fs[i]);
  68.         }
  69. }

  70. /*************************串口數據接收**************************/
  71. void Uart_Receive(void) interrupt 4{
  72.         unsigned char ch;
  73.         ES = 0;
  74.         if (RI){                                                //如果接收完成則進入
  75.                 ch = SBUF;
  76.                 if (ch == '

  77. ){                                //如果收到字符'

  78. ,便開始接收
  79.                         rev_start = 1;
  80.                         rev_stop  = 0;                        //接收停止標志
  81.                 }
  82.                 if (rev_start == 1){                //標志位為1,開始接收
  83.                         buf[num++] = ch;                //字符存到數組中
  84.                         if (ch == '\n'){                //如果接收到換行
  85.                                 // buf[num] = '\n';        //!!沒意義,不賦值
  86.                                 rev_start = 0;
  87.                                 rev_stop  = 1;                //接收停止標志
  88.                         }
  89.                 }
  90.                 RI = 0; //RI清0,重新接收
  91.         }
  92.         if(TI){
  93.                 TI = 0;
  94.                 uartBusy = 0;
  95.         }
  96. }

  97. void main(){
  98.         delayms(10);        //適當延時,穩定一下
  99.         LED1=0;
  100.         P0M0=0X00; P0M1=0X00;
  101.         P1M0=0X00; P1M1=0X00;
  102.         P2M0=0X00; P2M1=0X00;
  103.         P3M0=0X00; P3M1=0X00;
  104.         P4M0=0X00; P4M1=0X00;
  105.         TimerInit();
  106.         while(1){
  107.                 if(rev_stop==1){
  108.                         ES   = 0;
  109.                         //!!原最大的問題:如果buf[5]=='A'不成立,不會再接收GPS訊號。
  110.                         if(buf[5]=='A'){//如果接收到GNGGA
  111.                                 hour = (buf[ 7]-0x30)* 16+ buf[ 8]-0x30;
  112.                                 min  = (buf[ 9]-0x30)* 16+ buf[10]-0x30;
  113.                                 sec  = (buf[11]-0x30)* 16+ buf[12]-0x30;
  114.                                 hour =  hour / 16 * 10 + hour % 16;
  115.                                 LED  = !LED;
  116.                                 LED1 = !LED1;
  117.                                 hour = (hour+8) % 24;//UTC Time換算成北京時間
  118.                                 hour = hour/10*16+hour%10;

  119.                                 //!!不要放在中斷中處理
  120.                                 if( (hour>6 && hour<23) && min==0x00 && sec==0x00){ //早上7~22點
  121.                                         faSongHead();                //發送播放指令前4字節 (頭幀及命令幀)
  122.                                         delayms(5);
  123.                                         //SBUF=0x01;                //發送播放指令第5字節(第一首)
  124.                                         uartByte(hour-6);        //發送播放指令第5字節(第一首)!!規律的判斷,用加減法
  125.                                         uartByte(0xef);                //發送播放指令前6字節(尾幀)!!延時的串口處理不好
  126.                                 }
  127.                         }
  128.                         num = 0;        //接收緩沖計數器
  129.                         rev_stop=0;
  130.                         ES = 1;
  131.                 }
  132.         }
  133. }
復制代碼


回復

使用道具 舉報

ID:277550 發表于 2022-10-5 11:52 | 顯示全部樓層
請看附件


~~~~~~~~~~~~~~~


STC15_gps_time.zip

2.19 KB, 下載次數: 14

回復

使用道具 舉報

ID:123289 發表于 2022-10-8 10:23 | 顯示全部樓層
寫程序最好要有自己的構思。
一次成功了,理論上再重新一定要過一次不就OK的嗎。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日操日日舔 | 国产精品久久久久久久久久99 | 精品久久久久久久久久 | 免费播放一级片 | 成人性视频免费网站 | 亚洲在线 | 国产精品亚洲片在线播放 | 国产一区在线免费 | 青青草视频免费观看 | 精品国产欧美在线 | 金莲网 | 国产一级片一区二区 | 欧美在线国产精品 | 精品国产91久久久久久 | 亚洲一区久久 | 久久久久久网 | 中文字幕国产精品 | 国产毛片在线看 | 亚洲精选一区二区 | 国产九九九九 | 在线观看国产网站 | 欧美日韩国产在线观看 | 亚洲444kkkk在线观看最新 | 欧美专区在线观看 | 国产精品免费播放 | 亚洲精品99999 | 成人av电影在线观看 | 九九在线 | 国产精品无码久久久久 | 国产精久久久久久 | 99成人| 免费精品视频 | 色一级| 亚洲性在线| 色性av | 亚洲一区二区视频 | 亚洲区一区二区 | 日本精品视频在线 | 欧美视频福利 | 久久蜜桃av一区二区天堂 | 亚洲福利一区 |