搜索
bottom↓
回复: 16

海尔7P201 每隔1秒定时点亮LED灯

[复制链接]

出0入0汤圆

发表于 2014-7-14 12:23:43 | 显示全部楼层 |阅读模式
定时的问题一直想是不是太明白。求助了群参考了相关的程序写了这个定时程序。也不知对不对。
#include <hic.h>
unsigned num;
//*****************************************************************************
//                              中断服务程序
//*****************************************************************************
void isr(void) interrupt
{
    if(T8NIE&&T8NIF)               
    {                                              //进入T8N定时器中断
        T8NIF = 0;      //清T8N中断标志
        
        num++;
        if(num==200)    //1s计时
        {
        num=0;
        PB2 = ~PB2;           //输出端口取反
        T8N = T8N + 0x63;        //重载T8N初值,加上进入中断时间  
        }
    }
    else
    {
        T8NIF = 0;
    }
}
//*****************************************************************************
//                                 主程序
//*****************************************************************************
void main()
{
    ANSH        = 0xff;                 //设置PB2为I/O
//   PB2 = 0;                    //设置PB2端口输出低电平
    PBT        = 0;                     //设置PB2端口为输出口      

    T8NC = 0x07;            //设置T8N为定时器模式,分频比为1:256
    T8N = 0x63;                    //设定时器初值,5ms
    T8NPRE = 1;                 //使能预分频器
    T8NIE = 1;                    //使能T8N定时器中断
    GIE = 1;                    //使能总中断
    T8NEN = 1;                    //打开T8NEN定时器
    while(1);

   


}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-7-14 13:14:56 | 显示全部楼层
   else
    {
        T8NIF = 0;
    }
其实没什么用吧
其他的基本没问题啦

出0入0汤圆

发表于 2014-9-4 15:05:54 | 显示全部楼层
怎么购买海尔单片机的学习套件?

出0入0汤圆

 楼主| 发表于 2014-9-4 15:55:49 | 显示全部楼层
craigtao 发表于 2014-9-4 15:05
怎么购买海尔单片机的学习套件?

上次参加开源移动电源送的

出0入0汤圆

发表于 2014-9-4 15:56:35 | 显示全部楼层
juncheng14 发表于 2014-9-4 15:55
上次参加开源移动电源送的

你现在学的怎么样了啊?

出0入0汤圆

发表于 2014-9-4 16:00:49 | 显示全部楼层
juncheng14 发表于 2014-9-4 15:55
上次参加开源移动电源送的

我也想学学国人的单片机,支持国货,,,

出0入0汤圆

 楼主| 发表于 2014-9-4 20:33:58 | 显示全部楼层
craigtao 发表于 2014-9-4 16:00
我也想学学国人的单片机,支持国货,,,

学艺不精,停止不前了。就是数码管用定时器方式不知怎么弄好

出0入0汤圆

发表于 2014-9-5 08:37:56 | 显示全部楼层
juncheng14 发表于 2014-9-4 20:33
学艺不精,停止不前了。就是数码管用定时器方式不知怎么弄好

怎么买这个学习板?

出0入0汤圆

 楼主| 发表于 2014-9-5 20:32:04 | 显示全部楼层
craigtao 发表于 2014-9-5 08:37
怎么买这个学习板?

海尔送的开发工具还有两块PCB和两片MCU其它元件自己买

出0入0汤圆

发表于 2014-9-9 18:20:50 | 显示全部楼层
传说中的跑马灯?

出0入0汤圆

发表于 2014-9-9 19:00:56 来自手机 | 显示全部楼层
lz你这个到底是有问题还是没问题?

出0入0汤圆

 楼主| 发表于 2014-9-9 19:30:59 | 显示全部楼层
tabing 发表于 2014-9-9 19:00
lz你这个到底是有问题还是没问题?

这个1秒定时是没有问题的。是我另外一个贴子上用数码管定时显示那个不知怎么下手好。我原本是用delay的,改定时器不知怎么改。。

出0入0汤圆

发表于 2014-9-9 20:53:06 | 显示全部楼层
juncheng14 发表于 2014-9-9 19:30
这个1秒定时是没有问题的。是我另外一个贴子上用数码管定时显示那个不知怎么下手好。我原本是用delay的, ...

参考一下状态机,不用很复杂的
ps 状态机其实我也没有看过,只是我以前也做过类似的,在定时器中断里面显示

出0入0汤圆

 楼主| 发表于 2014-9-10 07:38:18 | 显示全部楼层
tabing 发表于 2014-9-9 20:53
参考一下状态机,不用很复杂的
ps 状态机其实我也没有看过,只是我以前也做过类似的,在定时器中断里面显 ...

有吗给个参考一下

出0入0汤圆

发表于 2014-9-10 13:04:01 | 显示全部楼层

出0入0汤圆

发表于 2014-9-10 20:19:05 | 显示全部楼层
juncheng14 发表于 2014-9-10 07:38
有吗给个参考一下

#include <intrins.h>
#include <STC12C52.h>



sfr16 DPTR=0x82;



//数码管的位控制
sbit WE1=P1^0;
sbit WE2=P1^1;
sbit WE3=P1^2;



sbit SDA=P3^0;
sbit SCL=P3^1;



//高低温LED指示灯
sbit ledl=P1^7;
sbit ledh=P1^6;



//加热控制
sbit JR=P3^4;



//设置按键
sbit key=P3^3;



//DS18B20通信端口
sbit DQ = P3^7;



typedef unsigned int uint;
typedef unsigned char uchar;



//        0    1    2    3    4    5    6    7    8    9    -
uchar code led[] = { 0x77,0x14,0xB3,0xB6,0xD4,0xE6,0xE7,0x34,0xF7,0xF6,0x80 };



bit flag_low=0; //加热标示,当系统第一次到达最设定的低温度时置1
bit beep;

bit keytmp=1; //记录上一次检测时按键的状态


uchar setflag=0;//高低温设置标识符,非0则有按键被按下:1低温,2:高温
uint t_max=0; //最高温设置
uint t_min=0; //最低温设置



uchar count=0; //延时计数

uint db=0;  //显示缓冲
uchar n1,n2,n3; //数码管变量


uchar discount=2;

uchar flag;  //标识符:1 未检测到DS18B20,2 温度小于0,3 大于100



void init()
{
    /*A/D转换,初始化P1端口*/
    ADC_CONTR=0xE5; //开启A/D转换电源
    P1ASF=0x20;  //将P1.5设置为A/D
   
    WE1=0;
    WE2=0;
    WE3=0;
   
    /*定时器*/
    TMOD=0x11;  //设置工作模式为方式1
    AUXR=0xC0;  //设置T0为不分频
   
    TH0=(65535-50000)/256;//设置定时器0的定时时间
    TL0=(65535-50000)%256;
   
    TH1=(65535-10000)/256;
    TL1=(65535-10000)%256;
   
    EA=1;   //开总中断
    ET0=1;   //开定时器0中断
    TR0=1;   //启动定时器1
    ET1=1;
    TR1=1;
   
    SCON=0;    //初始化串行口方式
}

void delay(unsigned int i)
{
    while(i--);
}

void input()
{
    ledl=1;
    ledh=1;
   
    if(setflag)
    {
     ADC_RES=0x00;
     ADC_CONTR=0xED;
   
     while(!(ADC_CONTR & 0x10));
     ADC_CONTR=0xE5;
     db=ADC_RES+200;
     
     if(setflag==1)
     {
      t_min=db;
      ledl=0;
      ledh=1;
     }
     else if(setflag==2)
     {
      t_max=db;
      ledl=1;
      ledh=0;
     }
    }
   
    if(key==1 && keytmp==0)
     setflag=(++setflag)%3;
   
    keytmp=key;
}

//初始化函数
bit Init_DS1820(void)
{
    bit tmp;
    DQ = 0;   //单片机将DQ拉低,复位DS1820
    delay(160);  //精确延时大于480us
    DQ = 1;   //拉高总线
    delay(50);  //延时检测DS1820是否存在
    tmp=DQ;
    delay(60);
    return tmp;
}

//读一个字节
uchar Read1820(void)
{
    uchar i=0;
    uchar dat = 0;
    for (i=8;i>0;i--)
    {
     dat>>=1;
     DQ = 0; //拉低单总线
     delay(3);
     DQ = 1; //释放单总线
     delay(3);
     if(DQ)
      dat|=0x80;
     delay(7);
    }
    return(dat);
}

//写一个字节
void Write1820(uchar dat)
{
    uchar i = 0;
    for (i=8;i>0;i--)
    {
     DQ = 0;
     delay(5);
     DQ=dat&0x01;
     delay(10);
     DQ = 1;
     dat>>=1;        //数据右移一位
    }
}

void main()
{
    init();
   
    while(1)
    {
        if(!setflag)
        {
            beep=0;
           
            if(db>=t_max)  //加热控制
            {
                JR=0;
                if(db>t_max+10) //高温报警,报警温度比t_max高1°C
                 beep=1;
            }
           
            if(db<=t_min)
            {
                JR=1;
                if(flag_low && db<t_min-10)//低温报警,报警温度比t_min的1°C
                 beep=1;
            }
        }
    }
}

void time0() interrupt 1 //定时5ms;每产生150次中断就读取、转换温度一次
{
    TH0=(65535-50000)/256; //设置定时器0的定时时间
    TL0=(65535-50000)%256;
   
    count=(++count)%150;
     
    if(count%10==0)
     input();
    if(count!=0)
     return ;
   
    if(setflag)    //当前有按键被按下,暂时放弃与DS18B20的通信
     return;
   
    flag=0;
    //读取温度
    if(Init_DS1820()!=0) // 初始化DS1820
    {
        beep=1;
        flag=1;
        return ;
    }
    Write1820(0xCC);  //跳过序列号命令
    Write1820(0xBE);  //读DS1820暂存器
   
    DPL=Read1820();
    DPH=Read1820();
    db=DPTR;
   
    if((DPH & 0x80)!=0)
    {
        db=~db;
        db++;
        flag=2;
    }
   
    db*=5;    //转换后db*0.0625就是实际温度,这里只用一位小数所以扩大了10倍
    db=db>>3;
     
    //发送转换命令,预备下次读取
    Init_DS1820();
    Write1820(0xCC);  //跳过序列号命令
    Write1820(0x44);  //发送温度转换命令
   
    if(db>t_min)
     flag_low=1;
}

void display() interrupt 3
{
    TH1=(65535-50000)/256;
    TL1=(65535-50000)%256;
   
    if(flag==1 && setflag==0)//检测不到DS18B20时显示“---”的警告信息
    {
        n3=10;
        n2=n3;
        n1=n3;
    }
    else
    {
        n3=db/100;
        n2=(db/10)%10;
        n1=db%10;
      
        if(n3>=10)   //处理温度大于100°C时的情况
        {
         n1=n2;
         n2=n3%10;
         n3=1;
         flag=3;
        }
    }
   
    if(flag==2)  //对负温进行判断
    {
        n1=n2;
        n2=n3;
        n3=10;
    }
   
    WE1=0;
    WE2=0;
    WE3=0;
   
    discount=(++discount)%3;
   
    if(discount==2)
    {
        SBUF=led[n3];
        while(!TI);
        WE3=1;
    }
    else if(discount==1)
    {
        if(flag)
         SBUF=led[n2];
        else
         SBUF=led[n2] | 0x08; //为正数则输出小数点
        while(!TI);
        WE2=1;
    }
    else if(discount==0)
    {
        SBUF=led[n1];
        while(!TI);
        WE1=1;
    }
   
    TI=0;
}


   ledh=0;
  }
}

if(key==1 && keytmp==0)
  setflag=(++setflag)%3;

keytmp=key;
}

//初始化函数
bit Init_DS1820(void)
{
bit tmp;
DQ = 0;   //单片机将DQ拉低,复位DS1820
delay(160);  //精确延时大于480us
DQ = 1;   //拉高总线
delay(50);  //延时检测DS1820是否存在
tmp=DQ;
delay(60);
return tmp;
}

//读一个字节
uchar Read1820(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
  dat>>=1;
  DQ = 0; //拉低单总线
  delay(3);
  DQ = 1; //释放单总线
  delay(3);
  if(DQ)
   dat|=0x80;
  delay(7);
}
return(dat);
}

//写一个字节
void Write1820(uchar dat)
{
uchar i = 0;
    for (i=8;i>0;i--)
{
  DQ = 0;
  delay(5);
  DQ=dat&0x01;
  delay(10);
  DQ = 1;
  dat>>=1;        //数据右移一位
}
}

void main()
{
init();

while(1)
{
  if(!setflag)
  {
   beep=0;
   
   if(db>=t_max)  //加热控制
   {
    JR=0;
    if(db>t_max+10) //高温报警,报警温度比t_max高1°C
     beep=1;
   }
   
   if(db<=t_min)
   {
    JR=1;
    if(flag_low && db<t_min-10)//低温报警,报警温度比t_min的1°C
     beep=1;
   }
  }
}
}

void time0() interrupt 1 //定时5ms;每产生150次中断就读取、转换温度一次
{
TH0=(65535-50000)/256; //设置定时器0的定时时间
TL0=(65535-50000)%256;

count=(++count)%150;
  
if(count%10==0)
  input();
if(count!=0)
  return ;

if(setflag)    //当前有按键被按下,暂时放弃与DS18B20的通信
  return;

flag=0;
//读取温度
if(Init_DS1820()!=0) // 初始化DS1820
{
  beep=1;
  flag=1;
  return ;
}
Write1820(0xCC);  //跳过序列号命令
Write1820(0xBE);  //读DS1820暂存器

DPL=Read1820();
DPH=Read1820();
db=DPTR;

if((DPH & 0x80)!=0)
{
  db=~db;
  db++;
  flag=2;
}

db*=5;    //转换后db*0.0625就是实际温度,这里只用一位小数所以扩大了10倍
db=db>>3;
  
//发送转换命令,预备下次读取
Init_DS1820();
Write1820(0xCC);  //跳过序列号命令
Write1820(0x44);  //发送温度转换命令

if(db>t_min)
  flag_low=1;
}

void display() interrupt 3
{
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;

if(flag==1 && setflag==0)//检测不到DS18B20时显示“---”的警告信息
{
  n3=10;
  n2=n3;
  n1=n3;
}
else
{
  n3=db/100;
  n2=(db/10)%10;
  n1=db%10;
  
  if(n3>=10)   //处理温度大于100°C时的情况
  {
   n1=n2;
   n2=n3%10;
   n3=1;
   flag=3;
  }
}

if(flag==2)  //对负温进行判断
{
  n1=n2;
  n2=n3;
  n3=10;
}

WE1=0;
WE2=0;
WE3=0;

discount=(++discount)%3;

if(discount==2)
{
  SBUF=led[n3];
  while(!TI);
  WE3=1;
}
else if(discount==1)
{
  if(flag)
   SBUF=led[n2];
  else
   SBUF=led[n2] | 0x08; //为正数则输出小数点
  while(!TI);
  WE2=1;
}
else if(discount==0)
{
  SBUF=led[n1];
  while(!TI);
  WE1=1;
}

TI=0;
}

大学时候写的,不要问我细节,记不清了

出0入0汤圆

 楼主| 发表于 2014-9-15 10:45:18 | 显示全部楼层

好的,谢谢哦!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 23:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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