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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

如何使用單片機定時器來控制一個物理按鈕的IO口的通斷啊?

[復制鏈接]
跳轉到指定樓層
樓主
ID:707778 發表于 2021-5-14 15:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用51單片機做了一個溫度監測報警裝置,使用手動按鈕SEND來手動發送當前的溫度值,我加了一個定時器來控制這個SEND按鈕,達到5秒發送一個短信的效果,但是加進去之后沒有實現這個效果,各位大佬幫忙看一下怎么回事兒,謝謝大家!!!上一個帖子排版有點問題,我重新發一下。紅色字體為我加的定時器程序。

#include <reg52.h>
#include <intrins.h>
#include "common.h"
#include "lcd1602.h"
#include "DS18B20_One.h"
#include "uart.h"
#include "gsm.h"
#define uint unsigned int
#define uchar unsigned char   //宏定義

const char * xdata  phonenum= "17630966319";  //在此處更換號碼

sbit SET= P1^0;//設置按鍵引腳
sbit ADD= P1^1;//按鍵加引腳
sbit DEC= P1^2;//按鍵減引腳
sbit SEND= P1^3;//手動發送短信按鍵引腳

sbit BEEP=P2^3;//蜂鳴器引腳

sbit LED_Y=P1^5;//溫度報警指示燈
sbit LED_R=P1^6;//溫度報警指示燈

uchar th=30;//溫度上限初始值
uchar setn = 0;//進入設置標志位,setn等于0時退出設置

bit shoudong = 0;//手動發送短信標志位,等于1時,進入手動發送短信模式

uchar xdata send_data[]="Temp:00C";//短信發送內容

uchar timer50msCount = 0; //定時器定義


void Timer0Init(void) //[email protected]
{
    TMOD &= 0xF0; // 設置定時器模式,這里為T0
    TMOD |= 0x01; // 設置定時器工作方式1,為16為定時器
    TL0 = 0x00;   // 設置定時器低位初值
    TH0 = 0x4C;   // 設置定時器高位初值
    TF0 = 0;      // 清楚TF0溢出標志位
    TR0 = 1;      // 啟動定時器0開始計時
}
void timer0Interrupt() interrupt 1
{
    timer50msCount++;
    // 每次中斷時,定時器初值為0,需重新設置定時器初值,保持50ms
    // 時間不變
    TL0 = 0x00;
    TH0 = 0x4C;
}

void keyscan()//按鍵掃描
{
          if(SET == 0)//設置鍵按下
                {
                                delay_ms(10);//延時消抖
                          if(SET == 0)//判斷是否按下
                                {
                                                while(!SET);//等待松開
                                          setn++;//設置標志位自加1
                                          if(setn > 1)//總共設置,溫度上限
                                                {
                                                                setn = 0;//退出設置模式
                                                          lcd_write_com(0x0c);//關閉光標
                                                }
                                                switch(setn)
                                                {
                                                                case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
                                                }
                                }
                }
                if(ADD == 0)//按鍵加按下
                {
                                delay_ms(10);//延時消抖
                          if(ADD == 0)//按鍵加按下
                                {
                                                while(!ADD);//等待松開

                                                if(setn == 1)//設置標志位等于1時,為溫度上限設置
                                                {
                                                                if(th < 99)//溫度上限值最大只能加到99
                                                                {
                                                                        th++;//值加1
                                                                }
                                                                lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
                                                                lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
                                                }
                                       
                                                }
                                                switch(setn)
                                                {
                                                                case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
                                                }
                                }
                                
                if(DEC == 0)//按鍵減按下
                {
                                delay_ms(10);//延時消抖
                          if(DEC == 0)//按鍵減按下
                                {
                                                while(!DEC);//等待松開
                                
                                                                if(setn == 1)//設置標志位等于1時,為溫度上限設置
                                                                {
                                                                                if(th > 0)//溫度上限值最小只能減到0
                                                                                {
                                                                                        th--;//值減1
                                                                                }
                                                                                lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
                                                                                lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
                                                                }
                                                        
                                                }
                                switch(setn)
                                                {
                                                                case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
                                                }
                }
                if(SEND == 0)//手動發送鍵按下
                {
                                delay_ms(10);//延時消抖
                          if(SEND == 0)//手動發送鍵按下
                                {
                                                while(!SEND);//等待松開
                                    shoudong = 1;//手動發送位置1
                                          lcd_write_str(0,0, "   Send Sms...  ");//顯示發送短信中
                                                lcd_write_str(0,1, "   Waiting...   ");//第二行清屏
                                                gsm_send_englishmsg(phonenum,send_data);//發送短信
                                          delay_ms(2000);//延時2秒
                                          delay_ms(2000);//延時2秒
                                          delay_ms(2000);//延時2秒
                                          lcd_write_str(0,0, "   Send OK...   ");//顯示發送成功
                                                lcd_write_str(0,1, "                ");
                                          delay_ms(2000);//延時2秒
                                          delay_ms(2000);//延時2秒
                                          delay_ms(2000);//延時2秒
                                          lcd_write_str(0,0, "NOW:  C  SET:  C");//返回主頁面顯示
            lcd_write_str(0,1, "  IN OPERATION  ");//第二行顯示內容隨意
                                          lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
                                                lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
                                          shoudong = 0;
                                }
                }        
}


void main()
{
          uint count;
          short temperature;//溫度  
          bit send_flag=0;
        
          EA = 1;         // 開總中斷
          ET0 = 1;        // 開定時器 0 中斷
         Timer0Init();
        
          lcd_init();//1602初始化
          temperature = DS18B20_TF();//溫度DS18B20初始化
          lcd_write_str(0,0,"   GSM init...  ");//1602顯示GSM初始化中
          uart_init(9600);//串口初始化,波特率9600
          gsm_init();//gsm初始化
          delay_ms(500);//延時
          lcd_write_str(0,0, "NOW:  C  SET:  C");//進入主頁面,第一行顯示的內容,溫度值和溫度上限值
          lcd_write_str(0,1, "  IN OPERATION  ");//第二行顯示內容隨意
          lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
                lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
                while(1)
                {
                          keyscan();//按鍵掃描
                          if(count++ > 150 && setn == 0)//延時一段時間,并且設置位等于0時,進入以下函數
                                {
                                          count = 0;//累加變量清零
                                          if(shoudong == 0)
                                                {
                                                
                                                                temperature = DS18B20_TF();//讀取溫度值
                                                                lcd_write_char(4,0,temperature/10+0x30);//溫度值十位顯示
                                                                lcd_write_char(5,0,temperature%10+0x30);//溫度值個位顯示
                                                        
                                                          send_data[5]=temperature/10+'0';//短信內容值,溫度十位
                                                          send_data[6]=temperature%10+'0';//短信內容值,溫度個位
                                                        
                                                        
                                                                        LED_R = 1;//LED滅
                                                                //if(temperature >= th)
                                                                //        LED_Y = 0;//溫度超標,LED亮
                                                                //else
                                                                //        LED_Y = 1;//LED滅
                                                                if(temperature >= th)
                                                                        LED_R = 0;//溫度超標,LED亮
                                                                else
                                                                        LED_R = 1;//LED滅
                                                        
                                                                if(temperature >= th)//溫度超標,蜂鳴器報警,并且發送短信
                                                                {
                                                                                BEEP = 0;
                                                                                if(send_flag == 0)//為了避免報警時,短信頻繁發送,這里超標時只發一次短信
                                                                                {
                                                                                        send_flag = 1;
                                                                                        gsm_send_englishmsg(phonenum,send_data);//發送短信
                                                                                }
                                                                                delay_ms(100);//延時
                                                                                
                                                                }
                                                                else
                                                                {
                                                                                BEEP = 1;//關閉蜂鳴器
                                                                                send_flag = 0;//短信發送標志位清零
                                                                }
                                                }
                        }
                                delay_ms(1);
                //定時發送程序
                  // 每5000ms允許if語句塊中的程序

          if (timer50msCount == 100)
        {
            SEND        =0;
            delay_ms(500);//延時0.5秒        
            SEND        =1;
            timer50msCount = 0;
        }
                                delay_ms(1);
                }
}

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

使用道具 舉報

沙發
ID:213173 發表于 2021-5-14 17:10 | 只看該作者
添加一個自動發送標志
bit AUTO_SEND = 1;//自動發送標志

5秒自動發送一次
        if (timer50msCount == 100)
        {
                AUTO_SEND=0;
//                SEND=0;
//                delay_ms(500);//延時0.5秒        
//                SEND=1;
                timer50msCount=0;
        }
自動和手動用同一段代碼
        if(SEND == 0||AUTO_SEND == 0)//手動發送鍵按下或自動發送使能
        {
                delay_ms(10);//延時消抖
                if(SEND == 0||AUTO_SEND == 0)//確認手動發送鍵按下或自動發送使能
                {
                        if(!SEND && AUTO_SEND==1)//判斷是否手動,否則不需等按鍵松手
                                while(!SEND);//等待松開
                        else AUTO_SEND=1;//自動發送標志復位       
                        //執行以下語句
回復

使用道具 舉報

板凳
ID:707778 發表于 2021-5-14 17:13 | 只看該作者
wulin 發表于 2021-5-14 17:10
添加一個自動發送標志
bit AUTO_SEND = 1;//自動發送標志

感謝感謝!!!我試試去
回復

使用道具 舉報

地板
ID:707778 發表于 2021-5-14 17:33 | 只看該作者
wulin 發表于 2021-5-14 17:10
添加一個自動發送標志
bit AUTO_SEND = 1;//自動發送標志

解決了,運行完美,感謝感謝!!!
回復

使用道具 舉報

5#
ID:707778 發表于 2021-5-14 18:32 | 只看該作者
wulin 發表于 2021-5-14 17:10
添加一個自動發送標志
bit AUTO_SEND = 1;//自動發送標志

大哥,我用這個定時器最多只能進行10秒的定時發送,如何更改可以讓它做到一分鐘甚至更高的定時發送效果呢
回復

使用道具 舉報

6#
ID:213173 發表于 2021-5-14 20:37 | 只看該作者
605740889 發表于 2021-5-14 18:32
大哥,我用這個定時器最多只能進行10秒的定時發送,如何更改可以讓它做到一分鐘甚至更高的定時發送效果呢

uint timer_sec = 0;      //添加定時器秒變量

void timer0Interrupt() interrupt 1
{
    if(++timer50msCount>=20);//1秒
        {
                timer50msCount=0;
                timer_sec++;
        }
    // 每次中斷時,定時器初值為0,需重新設置定時器初值,保持50ms
    // 時間不變
    TL0 = 0x00;
    TH0 = 0x4C;
}

自動發送周期范圍從1秒到1092分鐘
        if (timer_sec == 60)//1秒~1092分鐘
        {
                AUTO_SEND=0;
//                delay_ms(500);//延時0.5秒        
//                SEND=1;
                timer_sect=0;
        }
        delay_ms(1);
回復

使用道具 舉報

7#
ID:707778 發表于 2021-5-14 20:40 | 只看該作者
wulin 發表于 2021-5-14 20:37
uint timer_sec = 0;      //添加定時器秒變量

void timer0Interrupt() interrupt 1

好嘞,謝謝大哥
回復

使用道具 舉報

8#
ID:707778 發表于 2021-5-14 21:38 | 只看該作者
wulin 發表于 2021-5-14 20:37
uint timer_sec = 0;      //添加定時器秒變量

void timer0Interrupt() interrupt 1

換上去之后不會自動發送短信了,是不是定義整型的問題啊
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "common.h"
  4. #include "lcd1602.h"
  5. #include "DS18B20_One.h"
  6. #include "uart.h"
  7. #include "gsm.h"
  8. #define uint unsigned int
  9. #define uchar unsigned char   //宏定義

  10. const char * xdata  phonenum= "17630966319";  //在此處更換號碼

  11. sbit SET= P1^0;//設置按鍵引腳
  12. sbit ADD= P1^1;//按鍵加引腳
  13. sbit DEC= P1^2;//按鍵減引腳
  14. sbit SEND= P1^3;//手動發送短信按鍵引腳

  15. sbit BEEP=P2^3;//蜂鳴器引腳

  16. sbit LED_Y=P1^5;//溫度報警指示燈
  17. sbit LED_R=P1^6;//溫度報警指示燈

  18. uchar th=30;//溫度上限初始值
  19. uchar setn = 0;//進入設置標志位,setn等于0時退出設置

  20. bit shoudong = 0;//手動發送短信標志位,等于1時,進入手動發送短信模式
  21. bit AUTO_SEND = 1;//自動發送標志5秒自動發送一次

  22. uchar xdata send_data[]="Temp:00C";//短信發送內容

  23. uchar timer50msCount = 0; //定時器定義
  24. uint timer_sec = 0;//定時器秒變量定義

  25. void Timer0Init(void)
  26. {
  27.     TMOD &= 0xF0; // 設置定時器模式,這里為T0
  28.     TMOD |= 0x01; // 設置定時器工作方式1,為16為定時器
  29.     TL0 = 0x00;   // 設置定時器低位初值
  30.     TH0 = 0x4C;   // 設置定時器高位初值
  31.     TF0 = 0;      // 清楚TF0溢出標志位
  32.     TR0 = 1;      // 啟動定時器0開始計時
  33. }
  34. void timer0Interrupt() interrupt 1
  35. {
  36.     if(++timer50msCount>=20);//1秒
  37.         {
  38.                 timer50msCount=0;
  39.                 timer_sec++;
  40.         }
  41.     // 每次中斷時,定時器初值為0,需重新設置定時器初值,保持50ms
  42.     // 時間不變
  43.     TL0 = 0x00;
  44.     TH0 = 0x4C;
  45. }

  46. void keyscan()//按鍵掃描
  47. {
  48.           if(SET == 0)//設置鍵按下
  49.                 {
  50.                                 delay_ms(10);//延時消抖
  51.                           if(SET == 0)//判斷是否按下
  52.                                 {
  53.                                                 while(!SET);//等待松開
  54.                                           setn++;//設置標志位自加1
  55.                                           if(setn > 1)//總共設置,溫度上限
  56.                                                 {
  57.                                                                 setn = 0;//退出設置模式
  58.                                                           lcd_write_com(0x0c);//關閉光標
  59.                                                 }
  60.                                                 switch(setn)
  61.                                                 {
  62.                                                                 case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
  63.                                                 }
  64.                                 }
  65.                 }
  66.                 if(ADD == 0)//按鍵加按下
  67.                 {
  68.                                 delay_ms(10);//延時消抖
  69.                           if(ADD == 0)//按鍵加按下
  70.                                 {
  71.                                                 while(!ADD);//等待松開

  72.                                                 if(setn == 1)//設置標志位等于1時,為溫度上限設置
  73.                                                 {
  74.                                                                 if(th < 99)//溫度上限值最大只能加到99
  75.                                                                 {
  76.                                                                         th++;//值加1
  77.                                                                 }
  78.                                                                 lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
  79.                                                                 lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
  80.                                                 }
  81.                                        
  82.                                                 }
  83.                                                 switch(setn)
  84.                                                 {
  85.                                                                 case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
  86.                                                 }
  87.                                 }
  88.                                
  89.                 if(DEC == 0)//按鍵減按下
  90.                 {
  91.                                 delay_ms(10);//延時消抖
  92.                           if(DEC == 0)//按鍵減按下
  93.                                 {
  94.                                                 while(!DEC);//等待松開
  95.                                
  96.                                                                 if(setn == 1)//設置標志位等于1時,為溫度上限設置
  97.                                                                 {
  98.                                                                                 if(th > 0)//溫度上限值最小只能減到0
  99.                                                                                 {
  100.                                                                                         th--;//值減1
  101.                                                                                 }
  102.                                                                                 lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
  103.                                                                                 lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
  104.                                                                 }
  105.                                                        
  106.                                                 }
  107.                                 switch(setn)
  108.                                                 {
  109.                                                                 case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
  110.                                                 }
  111.                 }
  112.                   //if(SEND == 0)//手動發送鍵按下
  113.                   //{
  114.                         //        delay_ms(10);//延時消抖
  115.                         // if(SEND == 0)//手動發送鍵按下
  116.                   //{
  117.                         //                while(!SEND);//等待松開
  118.                  if(SEND == 0||AUTO_SEND == 0)//手動發送鍵按下或自動發送使能
  119.      {
  120.          delay_ms(10);//延時消抖
  121.          if(SEND == 0||AUTO_SEND == 0)//確認手動發送鍵按下或自動發送使能
  122.              {
  123.                 if(!SEND && AUTO_SEND==1)//判斷是否手動,否則不需等按鍵松手
  124.                     while(!SEND);//等待松開
  125.                     else AUTO_SEND=1;//自動發送標志復位      
  126.                                                  }
  127.                                     shoudong = 1;//手動發送位置1
  128.                                           lcd_write_str(0,0, "   Send Sms...  ");//顯示發送短信中
  129.                                                 lcd_write_str(0,1, "   Waiting...   ");//第二行清屏
  130.                                                 gsm_send_englishmsg(phonenum,send_data);//發送短信
  131.                                           delay_ms(2000);//延時2秒
  132.                                           delay_ms(2000);//延時2秒
  133.                                           delay_ms(2000);//延時2秒
  134.                                           lcd_write_str(0,0, "   Send OK...   ");//顯示發送成功
  135.                                                 lcd_write_str(0,1, "                ");
  136.                                           delay_ms(2000);//延時2秒
  137.                                           delay_ms(2000);//延時2秒
  138.                                           delay_ms(2000);//延時2秒
  139.                                           lcd_write_str(0,0, "NOW:  C  SET:  C");//返回主頁面顯示
  140.             lcd_write_str(0,1, "  IN OPERATION  ");//第二行顯示內容隨意
  141.                                           lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
  142.                                                 lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
  143.                                           shoudong = 0;
  144.                                 }

  145. }


  146. void main()
  147. {
  148.           uint count;
  149.           short temperature;//溫度  
  150.           bit send_flag=0;
  151.        
  152.                 EA = 1;         // 開總中斷
  153.     ET0 = 1;        // 開定時器 0 中斷
  154.     Timer0Init();
  155.        
  156.           lcd_init();//1602初始化
  157.           temperature = DS18B20_TF();//溫度DS18B20初始化
  158.           lcd_write_str(0,0,"   GSM init...  ");//1602顯示GSM初始化中
  159.           uart_init(9600);//串口初始化,波特率9600
  160.           gsm_init();//gsm初始化
  161.           delay_ms(500);//延時
  162.           lcd_write_str(0,0, "NOW:  C  SET:  C");//進入主頁面,第一行顯示的內容,溫度值和溫度上限值
  163.           lcd_write_str(0,1, "  IN OPERATION  ");//第二行顯示內容隨意
  164.           lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
  165.                 lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
  166.                 while(1)
  167.                 {
  168.                           keyscan();//按鍵掃描
  169.                           if(count++ > 150 && setn == 0)//延時一段時間,并且設置位等于0時,進入以下函數
  170.                                 {
  171.                                           count = 0;//累加變量清零
  172.                                           if(shoudong == 0)
  173.                                                 {
  174.                                                
  175.                                                                 temperature = DS18B20_TF();//讀取溫度值
  176.                                                                 lcd_write_char(4,0,temperature/10+0x30);//溫度值十位顯示
  177.                                                                 lcd_write_char(5,0,temperature%10+0x30);//溫度值個位顯示
  178.                                                        
  179.                                                           send_data[5]=temperature/10+'0';//短信內容值,溫度十位
  180.                                                           send_data[6]=temperature%10+'0';//短信內容值,溫度個位
  181.                                                        
  182.                                                        
  183.                                                                         LED_R = 1;//LED滅
  184.                                                                 //if(temperature >= th)
  185.                                                                 //        LED_Y = 0;//溫度超標,LED亮
  186.                                                                 //else
  187.                                                                 //        LED_Y = 1;//LED滅
  188.                                                                 if(temperature >= th)
  189.                                                                         LED_R = 0;//溫度超標,LED亮
  190.                                                                 else
  191.                                                                         LED_R = 1;//LED滅
  192.                                                        
  193.                                                                 if(temperature >= th)//溫度超標,蜂鳴器報警,并且發送短信
  194.                                                                 {
  195.                                                                                 BEEP = 0;
  196.                                                                                 if(send_flag == 0)//為了避免報警時,短信頻繁發送,這里超標時只發一次短信
  197.                                                                                 {
  198.                                                                                         send_flag = 1;
  199.                                                                                         gsm_send_englishmsg(phonenum,send_data);//發送短信
  200.                                                                                 }
  201.                                                                                 delay_ms(100);//延時
  202.                                                                                
  203.                                                                 }
  204.                                                                 else
  205.                                                                 {
  206.                                                                                 BEEP = 1;//關閉蜂鳴器
  207.                                                                                 send_flag = 0;//短信發送標志位清零
  208.                                                                 }
  209.                                                 }
  210.                           }
  211.                                 //定時發送程序
  212.                                 //設置定時發送時間
  213.         if (timer_sec == 10)//1秒~1092分鐘
  214.         {
  215.                AUTO_SEND = 0;
  216.                timer_sec = 0;
  217.         }
  218.         delay_ms(1);
  219.                 }
  220. }
復制代碼
回復

使用道具 舉報

9#
ID:707778 發表于 2021-5-14 21:40 | 只看該作者
wulin 發表于 2021-5-14 20:37
uint timer_sec = 0;      //添加定時器秒變量

void timer0Interrupt() interrupt 1

timer_sect=0這里多輸入了個t我已經改過來了
回復

使用道具 舉報

10#
ID:707778 發表于 2021-5-14 21:56 | 只看該作者
wulin 發表于 2021-5-14 20:37
uint timer_sec = 0;      //添加定時器秒變量

void timer0Interrupt() interrupt 1

為啥換上這個之后短信不自動發了,是不是定義整型的問題啊?改完的代碼是
#include <reg52.h>
#include <intrins.h>
#include "common.h"
#include "lcd1602.h"
#include "DS18B20_One.h"
#include "uart.h"
#include "gsm.h"
#define uint unsigned int
#define uchar unsigned char   //宏定義

const char * xdata  phonenum= "17630966319";  //在此處更換號碼

sbit SET= P1^0;//設置按鍵引腳
sbit ADD= P1^1;//按鍵加引腳
sbit DEC= P1^2;//按鍵減引腳
sbit SEND= P1^3;//手動發送短信按鍵引腳

sbit BEEP=P2^3;//蜂鳴器引腳

sbit LED_Y=P1^5;//溫度報警指示燈
sbit LED_R=P1^6;//溫度報警指示燈

uchar th=30;//溫度上限初始值
uchar setn = 0;//進入設置標志位,setn等于0時退出設置

bit shoudong = 0;//手動發送短信標志位,等于1時,進入手動發送短信模式
bit AUTO_SEND = 1;//自動發送標志5秒自動發送一次

uchar xdata send_data[]="Temp:00C";//短信發送內容

uchar timer50msCount = 0; //定時器定義
uint timer_sec = 0;//定時器秒變量定義

void Timer0Init(void)
{
    TMOD &= 0xF0; // 設置定時器模式,這里為T0
    TMOD |= 0x01; // 設置定時器工作方式1,為16為定時器
    TL0 = 0x00;   // 設置定時器低位初值
    TH0 = 0x4C;   // 設置定時器高位初值
    TF0 = 0;      // 清楚TF0溢出標志位
    TR0 = 1;      // 啟動定時器0開始計時
}
void timer0Interrupt() interrupt 1
{
    if(++timer50msCount>=20);//1秒
        {
                timer50msCount=0;
                timer_sec++;
        }
    // 每次中斷時,定時器初值為0,需重新設置定時器初值,保持50ms
    // 時間不變
    TL0 = 0x00;
    TH0 = 0x4C;
}

void keyscan()//按鍵掃描
{
          if(SET == 0)//設置鍵按下
                {
                                delay_ms(10);//延時消抖
                          if(SET == 0)//判斷是否按下
                                {
                                                while(!SET);//等待松開
                                          setn++;//設置標志位自加1
                                          if(setn > 1)//總共設置,溫度上限
                                                {
                                                                setn = 0;//退出設置模式
                                                          lcd_write_com(0x0c);//關閉光標
                                                }
                                                switch(setn)
                                                {
                                                                case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
                                                }
                                }
                }
                if(ADD == 0)//按鍵加按下
                {
                                delay_ms(10);//延時消抖
                          if(ADD == 0)//按鍵加按下
                                {
                                                while(!ADD);//等待松開

                                                if(setn == 1)//設置標志位等于1時,為溫度上限設置
                                                {
                                                                if(th < 99)//溫度上限值最大只能加到99
                                                                {
                                                                        th++;//值加1
                                                                }
                                                                lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
                                                                lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
                                                }
                                       
                                                }
                                                switch(setn)
                                                {
                                                                case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
                                                }
                                }
                               
                if(DEC == 0)//按鍵減按下
                {
                                delay_ms(10);//延時消抖
                          if(DEC == 0)//按鍵減按下
                                {
                                                while(!DEC);//等待松開
                               
                                                                if(setn == 1)//設置標志位等于1時,為溫度上限設置
                                                                {
                                                                                if(th > 0)//溫度上限值最小只能減到0
                                                                                {
                                                                                        th--;//值減1
                                                                                }
                                                                                lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
                                                                                lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
                                                                }
                                                       
                                                }
                                switch(setn)
                                                {
                                                                case(1):lcd_write_com(0x80+14);lcd_write_com(0x0f);break;//在溫度上限值的位置光標閃爍
                                                }
                }
                  //if(SEND == 0)//手動發送鍵按下
                  //{
                        //        delay_ms(10);//延時消抖
                        // if(SEND == 0)//手動發送鍵按下
                  //{
                        //                while(!SEND);//等待松開
                 if(SEND == 0||AUTO_SEND == 0)//手動發送鍵按下或自動發送使能
     {
         delay_ms(10);//延時消抖
         if(SEND == 0||AUTO_SEND == 0)//確認手動發送鍵按下或自動發送使能
             {
                if(!SEND && AUTO_SEND==1)//判斷是否手動,否則不需等按鍵松手
                    while(!SEND);//等待松開
                    else AUTO_SEND=1;//自動發送標志復位      
                                                 }
                                    shoudong = 1;//手動發送位置1
                                          lcd_write_str(0,0, "   Send Sms...  ");//顯示發送短信中
                                                lcd_write_str(0,1, "   Waiting...   ");//第二行清屏
                                                gsm_send_englishmsg(phonenum,send_data);//發送短信
                                          delay_ms(2000);//延時2秒
                                          delay_ms(2000);//延時2秒
                                          delay_ms(2000);//延時2秒
                                          lcd_write_str(0,0, "   Send OK...   ");//顯示發送成功
                                                lcd_write_str(0,1, "                ");
                                          delay_ms(2000);//延時2秒
                                          delay_ms(2000);//延時2秒
                                          delay_ms(2000);//延時2秒
                                          lcd_write_str(0,0, "NOW:  C  SET:  C");//返回主頁面顯示
            lcd_write_str(0,1, "  IN OPERATION  ");//第二行顯示內容隨意
                                          lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
                                                lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
                                          shoudong = 0;
                                }

}


void main()
{
          uint count;
          short temperature;//溫度  
          bit send_flag=0;
       
                EA = 1;         // 開總中斷
    ET0 = 1;        // 開定時器 0 中斷
    Timer0Init();
       
          lcd_init();//1602初始化
          temperature = DS18B20_TF();//溫度DS18B20初始化
          lcd_write_str(0,0,"   GSM init...  ");//1602顯示GSM初始化中
          uart_init(9600);//串口初始化,波特率9600
          gsm_init();//gsm初始化
          delay_ms(500);//延時
          lcd_write_str(0,0, "NOW:  C  SET:  C");//進入主頁面,第一行顯示的內容,溫度值和溫度上限值
          lcd_write_str(0,1, "  IN OPERATION  ");//第二行顯示內容隨意
          lcd_write_char(13,0,th/10+0x30);//顯示溫度上限值十位
                lcd_write_char(14,0,th%10+0x30);//顯示溫度上限值個位
                while(1)
                {
                          keyscan();//按鍵掃描
                          if(count++ > 150 && setn == 0)//延時一段時間,并且設置位等于0時,進入以下函數
                                {
                                          count = 0;//累加變量清零
                                          if(shoudong == 0)
                                                {
                                               
                                                                temperature = DS18B20_TF();//讀取溫度值
                                                                lcd_write_char(4,0,temperature/10+0x30);//溫度值十位顯示
                                                                lcd_write_char(5,0,temperature%10+0x30);//溫度值個位顯示
                                                       
                                                          send_data[5]=temperature/10+'0';//短信內容值,溫度十位
                                                          send_data[6]=temperature%10+'0';//短信內容值,溫度個位
                                                       
                                                       
                                                                        LED_R = 1;//LED滅
                                                                //if(temperature >= th)
                                                                //        LED_Y = 0;//溫度超標,LED亮
                                                                //else
                                                                //        LED_Y = 1;//LED滅
                                                                if(temperature >= th)
                                                                        LED_R = 0;//溫度超標,LED亮
                                                                else
                                                                        LED_R = 1;//LED滅
                                                       
                                                                if(temperature >= th)//溫度超標,蜂鳴器報警,并且發送短信
                                                                {
                                                                                BEEP = 0;
                                                                                if(send_flag == 0)//為了避免報警時,短信頻繁發送,這里超標時只發一次短信
                                                                                {
                                                                                        send_flag = 1;
                                                                                        gsm_send_englishmsg(phonenum,send_data);//發送短信
                                                                                }
                                                                                delay_ms(100);//延時
                                                                               
                                                                }
                                                                else
                                                                {
                                                                                BEEP = 1;//關閉蜂鳴器
                                                                                send_flag = 0;//短信發送標志位清零
                                                                }
                                                }
                          }
                                //定時發送程序
                                //設置定時發送時間
        if (timer_sec == 10)//1秒~1092分鐘
        {
               AUTO_SEND = 0;
               timer_sec = 0;
        }
        delay_ms(1);
                }
}

回復

使用道具 舉報

11#
ID:921483 發表于 2021-5-14 22:34 來自手機 | 只看該作者
定時器的引腳連接開關,定義主函數后,在定時函數中寫內容
回復

使用道具 舉報

12#
ID:707778 發表于 2021-5-14 22:48 | 只看該作者
hk卡卡卡 發表于 2021-5-14 22:34
定時器的引腳連接開關,定義主函數后,在定時函數中寫內容

開關已經焊接到p1.3了,只能通過軟件來實現定時了
回復

使用道具 舉報

13#
ID:213173 發表于 2021-5-15 06:36 | 只看該作者
605740889 發表于 2021-5-14 21:56
為啥換上這個之后短信不自動發了,是不是定義整型的問題啊?改完的代碼是
#include
#include

在沒有完全了解程序功能結構,經修改后可能會發生預料不到的結果
試試定時器中斷內容不改,改5秒自動發送一次部分的代碼試試。


添加秒變量
        uint timer_sec = 0;


        if (timer50msCount>=20)
        {
                timer50msCount=0;
                timer_sec++;
                if(timer_sec>=20)
                {
                        AUTO_SEND=0;
                        timer_sec=0;       
                }
        }
回復

使用道具 舉報

14#
ID:707778 發表于 2021-5-15 11:24 | 只看該作者
wulin 發表于 2021-5-15 06:36
在沒有完全了解程序功能結構,經修改后可能會發生預料不到的結果
試試定時器中斷內容不改,改5秒自動發 ...

因為我是學軌道專業的,但是畢設卻是自動化方面的,C語言基本沒學過,所以在這方面欠缺的很多,都是現學的,現在還在摸索階段...我按照您說的再試試
回復

使用道具 舉報

15#
ID:707778 發表于 2021-5-15 12:08 | 只看該作者
wulin 發表于 2021-5-15 06:36
在沒有完全了解程序功能結構,經修改后可能會發生預料不到的結果
試試定時器中斷內容不改,改5秒自動發 ...

這樣改過之后沒問題了,感謝百忙之中為我解答,謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产第一页 | 欧美性猛交一区二区三区精品 | 香蕉大人久久国产成人av | 成人欧美一区二区三区 | 在线观看中文字幕视频 | 色爱综合网 | 日韩精品无码一区二区三区 | 国产婷婷色综合av蜜臀av | 日日天天| 日韩三级| 国产成人精品一区二区三区四区 | 天天干夜夜操 | 不卡一区二区在线观看 | 91精品91久久久 | 国内精品视频在线观看 | 91av视频在线免费观看 | 噜久寡妇噜噜久久寡妇 | 中文在线a在线 | 欧美精品网站 | 一区二区三区四区电影视频在线观看 | 无码日韩精品一区二区免费 | 国产一区 | 国产视频精品在线观看 | 欧美午夜一区 | 一区二区三区四区日韩 | 久久国产精品久久国产精品 | 久久久久久免费看 | 精品国产一区二区三区四区在线 | 亚洲精品在线视频 | 四虎影音| 久久不卡日韩美女 | 六月色婷 | 嫩草国产 | 成人aaa视频 | 日韩h| 国产中文字幕在线观看 | 欧美精品一区二区三区在线播放 | 一级日批片 | 精品久久久久久久久亚洲 | 日韩欧美三级 | 久久久久九九九女人毛片 |