OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4609|回复: 3

热敏电阻采集温度,光敏电阻控住数码管亮度,定时器中断控制刷新得到温度值,为什么跑一会儿后会死机?

[复制链接]

10

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2018-8-10
在线时间
36 小时
发表于 2019-1-14 20:00:22 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=c,true]#include <reg52.h>
#include "SMG4.h"
#include "STCADC.h"

#define Baud 11059200 //波特率,单位Hz
#define Count (unsigned int)(0.05*Baud/12)//计算50ms的计数值
#define TH_M0 (65536-Count)/256//计算装载值高8位
#define TL_M0 (65536-Count)%256//计算装载值低8位
unsigned int Count_T0=0;//定时器0的中断次数


void Delayms(unsigned int t)
{
        unsigned int i;
        while(t--)
           for(i=0;i<10;i++);
}                                                                       
//主函数       
void main(void)  
{
        InitADC();
        IE=0x82;//打开总中断和定时器0的中断
        TMOD=0x01;//定时器0配置为16位定时功能
        TH0=TH_M0;
        TL0=TL_M0;
        TR0=1;//启动定时器0
        while(1)
        {       
                DisPlay();       
                Delayms(GK());                       
        }
}

void timer0(void) interrupt 1
{
         TH0=TH_M0;TL0=TL_M0;//重装初始值
         if(++Count_T0==20)//判断定时器0是否中断了20次,20次*50ms=1s
         {
                 Count_T0=0;//清零
                WD(ADC_TEMP());//
         }
}




//#include "STCADC.h"

#include <reg52.h>
#include "intrins.h"
#include <math.h>
sfr ADC_CONTR = 0XBC;        //转换控制寄存器
sfr ADC_RES = 0XBD;                //转换结果高8位
sfr ADC_LOW2 = 0XBE;        //转换结果低2位
sfr P1ASF = 0X9D;                        //I/O口模式

#define ADC_POWER 0X80                //电源位
#define ADC_FLAG         0X10                //标置位
#define ADC_START 0X08                //开启位

//常量表                               
code unsigned char tempbuf[] ={188,186,184,181,179,177,175,172,170,168,166,165,164,163,
                                                                                                                                161,158,155,152,149,146,143,139,136,133,130,128,125,122,
                                                                                                                                119,117,115,112,110,108,105,103,101,99,97,95,93,91,89,87,
                                                                                                                                85,83,81,79,77,76,74};                //0~50度的对应值,通过热敏电阻的B值表计算所得       
               
//=======延时============
void ADdelay(unsigned char i)
{
        while(i--);
}
//=======初始化=========
void InitADC()
{
        P1ASF=0xC0;                                    //设P1.6和P1.7为ADC转换
        ADC_RES=0;
        ADC_CONTR=ADC_POWER; //启动ADC电源
        ADdelay(200);       
}
//=======P1AD转换启动=======
void ADCP1STA(unsigned char lch)
{
        ADC_CONTR=ADC_POWER|ADC_START|lch; //选择一路启动转换采集
}
//=======获取转换结果=======
unsigned char GetADC(void)
{
        while(!(ADC_CONTR&ADC_FLAG));
        ADC_CONTR&=~ADC_FLAG;      //停止AD转换
        return ADC_RES;
}                                                                                                               
                                                                                                                               
unsigned char ADC_TEMP(void)  //温度
{
          unsigned char ly_temp;    //保存温度值
                ADCP1STA(7);                      //启动AD转换       
                ly_temp = GetADC();                        //读取AD转换值
          return ly_temp;
}       

void WD(unsigned char T)  //温度
{
                unsigned char i;
                for(i=0;i<50;i++)                        //比较获得正确的温度值
                {
                        if(T>tempbuf)
                        break;
                }
                T=--i;               
                ly_SMGcp[2]=1;          //在第三位数码上显示点       
                ly_SMGbuf[2]=11;        //显示单位C
                ly_SMGbuf[3]=10;        //第四位不显示               
                ly_SMGbuf[0]=T/10;                //温度的十位和个位分开                       
                ly_SMGbuf[1]=T%10;       
}

unsigned char GK()  
{
         unsigned int ly_gk;
         unsigned int ld;
         ADCP1STA(6);                      //启动AD转换
         ly_gk=GetADC();                        //读取AD转换值               
         if(ly_gk>100&&ly_gk<10000)ld=200;
         else ld=1;
         return ld;
}




//#include "SMG4.h"

//头文件:
#include <reg52.h>

//引脚定义:               
sbit SMG_q = P3^2;        //定义数码管阳级控制脚(千位)
sbit SMG_b = P3^3;        //定义数码管阳级控制脚(百位)
sbit SMG_s = P3^4;        //定义数码管阳级控制脚(十位)
sbit SMG_g = P3^5;        //定义数码管阳级控制脚(个位)

//常量定义:
unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0xc8,0x8e};
                                                                                        //表:共阳数码管 0~9 空 C N F

unsigned char table2[]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82,0xff,0xf0,0xc1,0xb1};
                                                                                        //表2:共阳数码管 0~9 空 C N F,因第三位数码管是反过来安装的,因此与上面的显示值有所不同

//变量定义:
unsigned char ly_SMGbuf[4]={0,0,0,0};        //数码管的显示缓冲
unsigned char ly_SMGcp[4]={0,0,0,0};  //数码管的小数点判断值,等于0时不显示小数点,否则显示


//延时子函数
void Sdelay(unsigned char t)
        {
          while(t--);
  }

//显示函数
void DisPlay(void)
{
                P2=table[ly_SMGbuf[0]];                //查表输出显示缓冲变量数组0中对应的数码管段值
                if(ly_SMGcp[0]) P2&=0x7f;        //是否加入小数点显示,等于0时不加小数点,否则显示
                SMG_q=0;                                                                        //选择千位数码管
                Sdelay(20);                                                                //加入短暂延时,延时可控制刷新频率
                SMG_q=1;                                                                        //关闭千位数码管
               
                P2=table[ly_SMGbuf[1]];                //同上
                if(ly_SMGcp[1]) P2&=0x7f;
                SMG_b=0;       
                Sdelay(20);
                SMG_b=1;

               
                P2=table2[ly_SMGbuf[2]];        //同上
                if(ly_SMGcp[2]) P2&=0x7f;
                SMG_s=0;
                Sdelay(20);
                SMG_s=1;
               
               
                P2=table[ly_SMGbuf[3]];
                if(ly_SMGcp[3]) P2&=0x7f;
                SMG_g=0;                                                                        //同上
                Sdelay(20);
                SMG_g=1;

}[/mw_shl_code]

AD温度 光控.rar

48.04 KB, 下载次数: 23

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-1-15 01:00:12 | 显示全部楼层
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2019-1-15 09:18:13 | 显示全部楼层
死循环了呗
回复

使用道具 举报

10

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2018-8-10
在线时间
36 小时
 楼主| 发表于 2019-1-16 18:50:57 | 显示全部楼层

可以详细说说是死循环在哪儿了吗?我这个单片机也没有办法去在线调试看情况,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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