找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1091|回复: 5
收起左侧

一打开单片机定时器中断数码管就不显示?附程序

[复制链接]
回帖奖励 2 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
ID:773929 发表于 2022-12-11 02:16 | 显示全部楼层 |阅读模式
不打开定时器一切正常,求大佬提示!感谢!!
1.jpg

单片机源程序如下:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

#define DU  P0

unsigned char  ledchar[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 0~9
uint Temp;

uint t;
uchar Flag_connect ; //掉线标志位
uint MAX6675_temp;
uint BJ_temp;                //报警值
uchar Flag_Bj;  //报警标志位

uint p;


sbit xz = P2^7;    //按键
sbit jia = P2^6;
sbit jian = P2^5;


sbit WEI_1 = P2^0 ;
sbit WEI_2 = P2^1 ;
sbit WEI_3 = P2^2 ;
sbit WEI_4 = P2^3 ;

sbit so = P1^5;
sbit sck = P1^6;
sbit cs = P1^7;

sbit baojing = P3^7;

sbit key1 = P2^5;
sbit key2 = P2^6;
sbit key3 = P2^7;
sbit baocun = P2^4;

sbit led = P3^0;


void xianshi(uint shuzhi);
void DelayMs(unsigned int i);
unsigned int MAX6675_Read();//读温度;
uint MAX6675_Oper();//温度运算
void Timer_Init();//定时器0初始化
void shezhi();  //按键设置
void UartInit(void);//串口初始化
void SendDate(unsigned char dat);

uchar a;
void Timer0() interrupt 1
{
        a++;
        TH1 = (65536-50000)/256;
        TL1 = (65536-50000)%256;
        if(a >= 10){
                led =~ led;
                a = 0;
        }
               
}

void Start()
{
         DU = 0x00;
         WEI_1 = 1;
         WEI_2 = 1;
         WEI_3 = 1;
         WEI_4 = 1;        
                Flag_Bj = 0;        
}


void main(void)
{
        Start();
        Timer_Init();
        DelayMs(1000);
        baojing = 0;
        BJ_temp = 145;
        
   while (1){
           EA = 0;
           MAX6675_Oper();
           EA = 1;
           
           shezhi();
           
           if(MAX6675_temp >= BJ_temp ) //报警判断
           {
                   baojing = 1;
                }else{baojing = 0;}

}
}

void xianshi(uint shuzhi){     //数码管显示函数,只显示三位数
         uchar ge;
         uchar shi;
         uchar bai;
         ge = shuzhi%10;
         shi = (shuzhi/10)%10;
         bai = shuzhi/100;
         
         WEI_1 = 1;
         WEI_2 = 1;
         WEI_3 = 1;
         WEI_4 = 1;
         WEI_2 = 0;
         DU = ledchar[bai];
         DelayMs(3);
         WEI_1 = 1;
         WEI_2 = 1;
         WEI_3 = 1;
         WEI_4 = 1;
         WEI_3 = 0;
         DU = ledchar[shi];
         DelayMs(3);
         WEI_1 = 1;
         WEI_2 = 1;
         WEI_3 = 1;
         WEI_4 = 1;
         WEI_4 = 0;
         DU = ledchar[ge];         
         DelayMs(3);
         
}

void DelayMs(unsigned int i)        //一个延时函数,这个函数在11.0592M晶振下的延时时间大概为1ms
{
        unsigned int j,k;

        for(j=i; j>0; j--)
                for(k=114; k>0; k--);
}

unsigned int  MAX6675_Read(void)   //max6675读十六位数值
{
        //EA = 0;
        
        uchar i;
        uint dat;
        i = 0;
        dat = 0;
        cs = 0;
        sck = 0;
        for(i = 0;i<16; i++)
        {
                sck = 1;
                dat = dat<<1;
                if(so == 1)
                        dat = dat|0x01;
                sck = 0;
        }
        cs = 1;
        
        return dat;
        //EA = 1;
}

uint MAX6675_Oper()
{
        
        t = MAX6675_Read();
        Flag_connect = t&0x04;
        Flag_connect = Flag_connect>>2;
        t = t<<1;
        t = t>>4;
        MAX6675_temp = t/4;
        
        if(Flag_connect==0 && Flag_Bj == 0){

                for(t = 0; t<200; t++)
                {
                        xianshi(MAX6675_temp);
                }
        }else {baojing = 1; xianshi(000);} //判断是否掉线,掉线报警,并且显示000
        
        //return MAX6675_temp;
}


void Timer_Init()
{
        EA = 1;
        ET1 = 1;
        TMOD = 0X10;
        TH1 = (65536-50000)/256;
        TL1 = (65536-50000)%256;
        TR1 = 1;
        a = 0;
}

void shezhi()
{
        if(key1 == 0)
        {
                DelayMs(10);
                if(key1 == 0)
                {
                        xianshi(BJ_temp);
                        Flag_Bj = 1;
                }
        }
        while(Flag_Bj == 1){xianshi(BJ_temp);
        if(key2 == 0)
        {
                DelayMs(10);
                if(key2 == 1){
                        BJ_temp++;
                        xianshi(BJ_temp);
                }
        }
        
        if(key3 == 0)
        {
                DelayMs(10);
                if(key3 == 1){
                        BJ_temp--;
                        xianshi(BJ_temp);
                }
        }

        if(baocun == 0)
        {
                DelayMs(10);
                if(baocun == 1){
                        Flag_Bj = 0;
                }
        }}        
}

void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xE8;                //设置定时初始值
        TH1 = 0xFF;                //设置定时初始值
        ET1 = 0;                //禁止定时器%d中断
        TR1 = 1;                //定时器1开始计时
}

void SendDate(unsigned char dat)//串口发送
{
      SBUF = dat;
      while(!TI);
      TI = 0;
}
回复

使用道具 举报

ID:1056573 发表于 2022-12-11 03:59 | 显示全部楼层
void SendDate(unsigned char dat)//串口发送
{
      SBUF = dat;
      while(!TI);
      TI = 0;
}
  “while(!TI);”中是否多了个“;”?
回复

使用道具 举报

ID:773929 发表于 2022-12-11 11:23 来自手机 | 显示全部楼层
ytchfp163 发表于 2022-12-11 03:59
void SendDate(unsigned char dat)//串口发送
{
      SBUF = dat;

没有呀,等待ti
回复

使用道具 举报

ID:624769 发表于 2022-12-11 14:58 | 显示全部楼层
你串口用  定时器1  ,  定时器又用定时器1??  中断开的还是 定时器0!!!  

这不正常才是正常现象!!
回复

使用道具 举报

ID:1057088 发表于 2022-12-12 08:52 | 显示全部楼层
去掉所有的DELAY 试一下.
回复

使用道具 举报

ID:1059656 发表于 2022-12-29 18:39 | 显示全部楼层
定时器换一下 串口和中断不能用一个定时器
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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