如何使用单片机定时器来控制一个物理按钮的IO口的通断啊?

我用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);
                }
}

(0)

相关推荐