切换到宽版
  • 7322阅读
  • 21回复

12864、1302、18b20、DHT11、等相关程序在stc12c5a60s2的运用 [复制链接]

上一主题 下一主题
 

发帖
13
M币
245
专家
1
粉丝
7
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2013-01-04
程序写的比较凌乱,呵呵仅供参考。与大家交流学习!
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏M币+3
myrydddddd M币 +3 - 2013-01-04
离线myrydddddd

发帖
2340
M币
1483
专家
2
粉丝
47
只看该作者 1楼 发表于: 2013-01-04
建议先贴一部分出来,别人需要再下载
离线savage_yobbo

发帖
2521
M币
775
专家
3
粉丝
65
只看该作者 2楼 发表于: 2013-01-05
不敢再贸然下载了    等说明
离线zhihong2000

发帖
350
M币
712
专家
3
粉丝
21
只看该作者 3楼 发表于: 2013-01-06
下载要币也可以,多少也要先看看货吧?哈哈,既然论坛宗旨是共同学习交流大家程序全贴出多好。
离线quliu2012

发帖
83
M币
761
专家
0
粉丝
6
只看该作者 4楼 发表于: 2013-04-04
太恼火了!太恼火了!
离线peigang
发帖
150
M币
152
专家
2
粉丝
3
只看该作者 5楼 发表于: 2013-04-24
/********************************************************************/
/*        CO2浓度测量                                                */
/********************************************************************/

待续

我狠蛋疼哦
离线wxwsl
发帖
2
M币
-17
专家
0
粉丝
0
只看该作者 6楼 发表于: 2014-02-25
这是我需要的谢谢
在线eversun

发帖
59
M币
325
专家
6
粉丝
11
只看该作者 7楼 发表于: 2014-02-25

while(ReduceKey==0); //等待键松开
}
}

/*******************************************************************************************
          18B20程序
**********************************************************************************************/
  void delay_18B20(unsigned int i)     //延时
{
    while(i--);
}

  void ds1820rst()                 //复位,读写之前都要进行复位
{
    DQ = 1;        
    delay_18B20(400);           //从高位拉低,至少保持480us,易产生复位脉冲
    DQ = 0;          
    delay_18B20(1000);           //480us
    DQ = 1;        
    delay_18B20(600);            //延时15~60us
}

uchar ds1820rd()            //从1820读一个字节,一共8位    ,每次读1位,读8 次
{
    unsigned char i=0;
    unsigned char dat = 0;          //数据变量
    for (i=8;i>0;i--)              //8位
{  
    DQ = 0;                    //拉低电平
    dat>>=1;                    //     右移一位
    DQ = 1;                          //        
    if(DQ)                                //如果为1则dat位1,如果DQ位0则dat位0,往右移
    dat|=0x80;                         //如果DQ=1,则dat=dat或0x80,即首位为1,其余为0  下次首位移到第二位...得到一个字节dat
    delay_18B20(100);                  //
}
    return(dat);
}

   void ds1820wr(uchar wdata)         //往1820写一字节       从最低位开始, 依次右移    8次后写完数据
{
    unsigned char i=0;
    for (i=8; i>0; i--)              //8位
   {
     DQ = 0;                  //总线拉低
     DQ = wdata&0x01;           //最后一位移出
     delay_18B20(100);                //延时60us
     DQ = 1;                         //释放总线
     wdata>>=1;                         //右移一位

   }
}
uint read_temp()       //    当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补                       //  码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
{
    uchar a,b;
    ds1820rst();            //设置复位         每次读写之前都要复位
    ds1820wr(0xcc);            //跳过Rom命令
    ds1820wr(0x44);             //启动1820温度转换
    ds1820rst();                  //复位
    ds1820wr(0xcc);                    //跳过Rom命令
    ds1820wr(0xbe);                    //读内部Ram内容    命令
    a=ds1820rd();                      //读温度di字节
    b=ds1820rd();                        //度温度gao字节
    tvalue=b;
    tvalue<<=8;                              //高字节右移8位,然后与低字节相或得16位的温度
    tvalue=tvalue|a;
    if(tvalue<0x0fff)                               //此为正数
    
     { tflag=0; }
    
    else
    
    {
         tvalue=~tvalue+1;  //负数的补码等于原码取反加一
         tflag=1;
    }
    
    tvalue=tvalue*(0.625);           //温度值乘以10,方便把小数取出来
    return(tvalue);

}

   void ds1820disp(uint tvalue)

{
     uchar i;
     if(tflag==0)  {disdata[0]=0x20;}        //为正则显示空

     else          {disdata[0]=0x2d;}            //位负则显示”-“
     disdata[1]=tvalue%1000/100+0x30;              //十位数取整

     disdata[2]=tvalue%100/10+0x30;                   //个位数取整

     disdata[3]=tvalue%10+0x30;                        //小数                    

     if(disdata[1]==0x30)

     {
        disdata[1]=0x20;                       //  最高位为0时不显示

     }

    writecom(0x8b);                             //第一行第七个字符开始显示
    lcdwritedate(0x3A);
    LCDTestWord(0,0x88);
    LCDSendWord("温度:");
    for(i=0;i<4;i++)
    {
      lcdwritedate(disdata);                            //显示正负   百 十 个 小数
      if(i==2) lcdwritedate(0x2e);    //第四个字符”.“
    }
    LCDTestWord(0,0x8d);
    LCDSendWord("°");
    
}
/********************************************************************/
  /*  DHT11程序                                                        */
/*******************************************************************/
void delay_1ms(uint i)
{
    uint j=88;
    for(;i>0;i--)
    {
        while(j>0)j--;
    }
}
void delay_10us()
{
    uchar i;
    i--;
    i--;
    i--;
    i--;
    i--;
    i--;
}    
    void read_init()
{
    DHT=0;          //主机使DHT11低电平并延时至少18ms
    delay_1ms(21);
    DHT=1;          //主机置DHT11高电平20~40us,并等待从机相应
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    DHT=1;
    if(!DHT)  //从机发出响应信号
    {
        flag=2;
        while((!DHT)&&flag++);//等待从机发高电平结束
        flag=2;
        while(DHT&&flag++);    //开始采集数据
        tr_shiZ=read_data();//采集湿度整数部分
        tr_shiX=read_data();//采集湿度小数部分
        tr_wenZ=read_data();//采集温度整数部分
        tr_wenX=read_data();//采集温度小数部分
        check=read_data();    //采集校验位
    }
    DHT=0;
    delay(20);//采集完数据后                  
}
    char read_data()
{
    uchar i,num,temp;
    num=0;
    for(i=0;i<8;i++)
    {
        flag=2;
        while((!DHT)&&flag++);//等待50毫秒低电平
        delay_10us();//延时判断0还是1
        delay_10us();
        delay_10us();
        delay_10us();
                  
        if(DHT==1)
        {
            temp=1;
            flag=2;
            while(DHT&&flag++);                
        }
        else
        {    temp=0;    }
            num<<=1;
            num|=temp;
    }
    return(num);
}
void writed(uchar add,uchar date) //在固定位置写数字
{    uchar shi,ge;
    shi=date/10;
    ge=date%10;
    writecom(add);
    lcdwritedate(0x31+shi);//送数字的方法  
    lcdwritedate(0x30+ge);
}
void display()    
{
    uchar i;
    writecom(0x98);//第四行地址
    for(i=0;i<4;i++)
        {
            lcdwritedate(table);
            delay(50);
        }
       writecom(0x9C);//第四行地址
    for(i=0;i<2;i++)
        {
            lcdwritedate(table1);
            delay(50);
        }
        
}
void zifu()    //显示冒号和H
{

    writecom(0x9a);
    lcdwritedate(0x3a);
    LCDTestWord(0,0x9d);
    LCDSendWord("  ");    
}
  /*******************************************************************/
  /*  光照强度测量                                                        */
/*******************************************************************/

   uchar get_AD_result(uchar channel)  //AD转换部分
{
    uchar AD_finished=0;            //存储 A/D 转换标志
    ADC_RES = 0;                    //高八位
    ADC_RESL = 0;                   //低二位(本例未使用)
    channel &= 0x07;                //0000,0111 清0高5位
    ADC_CONTR = AD_SPEED;
    _nop_();
    ADC_CONTR |= channel;           //选择 A/D 当前通道
    _nop_();
    ADC_CONTR |= 0x80;              //启动 A/D 电源
    delay(10);                       //使输入电压达到稳定
    ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,
    AD_finished = 0;
    while (AD_finished ==0 )        //等待A/D转换结束
    {
        AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
    }
    ADC_CONTR &= 0xE7;              //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
    return (ADC_RES);               //返回 A/D 高 8 位转换结果
}


void  ADzhuanhuan1(uchar  zh)
{
    
    unsigned int ADC_result;
    uchar i;
    P1ASF = 0x02;                   //0000,0010, 将 P1.1 置成模拟口
    AUXR1 &= ~0x04;                 //0000,0100, 令 ADRJ=0 : 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
    ADC_CONTR |= 0x80;              //1000,0000 打开 A/D 转换电源
    if(flag1==1)
    {
        a = get_AD_result(zh);      //P1.1 为 A/D 当前通道, 测量并发送结果
              flag1=0;
    }
     ADC_result=a*(19.53)+100;
//     ADC_result=b*(30.24)-588.1;        //显示数值。 19.53 是AD转换系数:原公式是ADC_result/256*5V*1000    
     AD_value[0]=ADC_result/10000+0x30;                        //wan位
     AD_value[1]=ADC_result%10000/1000+0x30;                     //qian位
     AD_value[2]=ADC_result%1000/100+0x30;                           //bai位
     AD_value[3]=ADC_result%100/10+0x30;                            //shi
     AD_value[4]=ADC_result%10+0x30;                             //ge
     if(AD_value[0]==0x30)                                 //如果wan位为0,  

     {
        AD_value[0]=0x20;                                  //  此位显空

        if(AD_value[1]==0x30)                              //如果qian位为0,

        {AD_value[1]=0x20;                                    //此位显空
        if(AD_value[2]==0x30)                              //如果qian位为0,

        {AD_value[2]=0x20;
        if(AD_value[3]==0x30)                              //如果bai位为0,

        {AD_value[3]=0x20;
        if(AD_value[4]==0x30)                              //如果shi位为0,

        {AD_value[4]=0x20;}}}}
    }
    writecom(0x9c);                             //第一行第七个字符开始显示
    lcdwritedate(0x3A);    
    for(i=0;i<5;i++)
    {    
      lcdwritedate(AD_value);                            //显示正负   百 十 个 小数
                            
                                    //此位显空                                    //此位显空}}                                    //此位显空
     }
    
    
}
/********************************************************************/
/*        CO2浓度测量                                                */
/********************************************************************/

待续    

   /******************************************************************/
   /*                        定时器0中断处理程序                     */
   /******************************************************************/
    void InitTimer0(void)
    {
    TMOD = 0x01;
    TH0 = 0x0A9;
    TL0 = 0x9A;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
    }  
     void Timer0Interrupt(void) interrupt 1
{          

    TH0 = 0x0A9;
    TL0 = 0x9A;
     a1++;
    
    if (a1==500)
    {
        a1=0;
        flag1=1;
//        flag2=flag1;
    }

}    
    
    

/*******************************************************************/
  /*                 主程序                                            */
  /*******************************************************************/

void main()
{      
    AUXR2 = AUXR2|0x80;  // T0, 1T Mode
    InitTimer0();    
    lcdinit();
    zifu3display(zifu3);
    DS1302init();
        while(1)
    {
        Key();
       while(!next)
      {
        
          if(FanPingKey==0)
         {          
        
              if(Clear_cont==0)
             {
                clear_lcd();
                Clear_cont=1;
             }
  delay(100);
  zifu1display(zifu1);
  zifu2display(zifu2);
  zifu3display(zifu3);
  zifu4display(zifu4);
  zifu5display(zifu5);
  ADzhuanhuan1(1);       //光照强度显示
//  ADzhuanhuan2(1);       //co2显示
    CLK_DIV=0X00;
       readtime();
    DisplayWeek(); //显示星期

         }
        else
       {          
  
            if(Clear_cont==1)
                {
                    clear_lcd();
                    Clear_cont=0;
                }
    zifu1display(zifu1);
    zifu3display(zifu3);
       CLK_DIV=0X00;
    readtime();
    DisplayWeek(); //显示星期
    ds1820disp(read_temp());
    CLK_DIV=0X02;
    display();
    read_init();
    temp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX;
    if(check==temp)
            {
            shiZ=tr_shiZ;
              writed(0x9b,shiZ);
            writed(0x9d,shiX);
            zifu();
            }
        }
      Key();
      }
   }
}

在线eversun

发帖
59
M币
325
专家
6
粉丝
11
只看该作者 8楼 发表于: 2014-02-25
太多了,自己下吧,真心不错的!
离线lxwjj
发帖
4
M币
-97
专家
0
粉丝
0
只看该作者 9楼 发表于: 2014-03-09
色调和羊肉汤和软件和豆浆机
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个