• 帮助
    • 博客
    • 相册
    • 网盘
    • 超市
    • Xer吧
  • 登录
  • 注册
【公告】X5dj广告过滤系统上线    【公告】个人空间首页新增“我的专辑”版块    【公告】新功能“我的专辑”上线,珍藏属于你的美好回忆    【公告】X5dj网站网络硬盘用户使用协议    【公告】X5dj新功能汇总贴:新增“密码目录”功能上线    【公告】X5dj.com相册/网盘上传工具发布    
  • baidu123的个人空间
  • http://www.x5dj.com/baidu123 复制地址
  • 首页

  • 博客

  • 相册

  • 网盘

  • 人际关系网

  • 我的专辑

loading...
色短文---绝对搞笑 < 上一篇
M16 NTC热敏电阻测温+LCM12864显示.
baidu123 发表于: 2008-11-20 16:13 来源:转载  X度:0  浏览:(104)  评论:(0)
收藏 | 复制地址 | [举报此文章] |  大 中 小 |  引用 删除 修改

//***************************************************
//*功能:NTC测温                  *
//*硬件:AtemlMega16L   LCM1286*64 ST7920        *
//*      NTC MF58502F327 R=5K B=3270K      *
//*编译:WinAVR-20050214                * 
//*作者:陈崇 QQ:86395850 EMAIL:worm.chen@163.com   *
//*日期:2007.5.29                *
//***************************************************

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include <lcm12864.h>

#define  VREF 4740                                      //  实测的Vref引脚电压@4.74V供电
#define  R    5020                          // 分压电阻
#define  VCC  4740                             // 电源电压mV
const unsigned char  icon_rt[] PROGMEM=             // 热敏电阻
    {
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x02,0x00,0x1F,0xF8,0xF1,0x0F,
        0x10,0x88,0x1F,0xF8,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    };
const unsigned char  icon_volt[] PROGMEM=               // 电压表
    {
        0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x10,0x04,0x12,0x24,0x12,0x24,0x11,0x44,
        0x10,0x84,0x1F,0xFC,0x10,0x04,0x12,0x24,0x10,0x04,0x1F,0xFC,0x00,0x00,0x00,0x00,
    };
const unsigned char  icon_temp[] PROGMEM=               // 温度计
    {
        0x00,0x00,0x03,0xD0,0x02,0x46,0x03,0x48,0x02,0x48,0x03,0x46,0x02,0x40,0x03,0x40,
        0x02,0x40,0x03,0x40,0x02,0x40,0x02,0x40,0x04,0x20,0x04,0x20,0x02,0x40,0x01,0x80,
    };
const unsigned int  vt_table[] PROGMEM=             // 电压温度对照表
    {
        4132,4098,4063,4026,3988,3949,3908,3866,3823,3779,
        3733,3686,3639,3590,3540,3489,3437,3385,3331,3277,
        3222,3166,3110,3054,2997,2940,2882,2824,2767,2709,
        2651,2593,2536,2478,2421,2365,2309,2253,2198,2143,
        2089,2036,1984,1932,1881,1831,1782,1734,1686,1640,
        1594,1550,1506,1464,1422,1381,1341,1303,1265,1228,
        1192
   
    };
   
unsigned int temp;              // 温度
unsigned int adc_volt;          //  测试点电压
unsigned int rt;                // 热敏电阻
//***********************************************************************
//*名称: unsigned int GetADC(unsigned char adc_channel)           * 
//*功能: 获取ADC转换值程序                      *
//*参数: adc_channel 转换通道                               *
//*返回: ADC值                                           *
//***********************************************************************
unsigned int GetADC(unsigned char adc_channel)
   {
        unsigned char i;
        unsigned int adc_value[8];                  // AD转换缓冲区 
        unsigned int adc_value_ave=0;
        unsigned int max_value=0,min_value=0,max_index=1,min_index=1;
        ADMUX=((1<<REFS0)|adc_channel);                 // 选择ACC参考电压和测试转换通道
        for(i=0;i<8;i++)                       // 连续AD转换8次 
      {
                ADCSRA|=(1<<ADSC);             // 启动AD转换
                loop_until_bit_is_set(ADCSRA,ADIF);     // 等待AD转换结束
                ADCSRA|=(1<<ADIF);            // 写1清除标志位
                adc_value[i]=ADC;                       // 将单次ADC转换结果=ADCH:ADCL放入缓冲区         
       
      }
        for(i=1;i<8;i++)                          // 去掉第一次测量值
      {
                adc_value_ave+=adc_value[i]; 
      }
        adc_value_ave/=7;                               // 去掉一个值外的平均值       
        for(i=1;i<8;i++)                                // 计算最大值和最小值索引号
      {
                if(adc_value[i]>adc_value_ave)
           {
                        if((adc_value[i]-adc_value_ave)>max_value)
             {
                                max_value=adc_value[i];
                       max_index=1;
             }
           }  
          else
           {
                        if((adc_value_ave-adc_value[i])>min_value)
             {
                                min_value=adc_value_ave-adc_value[i];
                       min_index=i;
             }
           }
      }
        adc_value_ave=0; 
        for(i=1;i<8;i++)                        // 计算去掉最大值和最小值后的总和
      {
                if((i!=max_index)&&(i!=min_index))
           {
                        adc_value_ave+=adc_value[i]; 
           }
      }
        if(max_index!=min_index)                // 如果测量值不同
      {
                adc_value_ave/=5;         // 计算平均值
      }
        else                        // 如果测量值相同
      {
                adc_value_ave/=6;         // 计算平均值
      }
        ADCSRA&=~(1<<ADSC);              // 停止AD转换
        return adc_value_ave;
   }
//***********************************************************************
//*名称: unsigned char GetTemp(unsigned int adc_volt)             * 
//*功能: 获取温度值 程序                        *
//*参数: adc_channel ADC电压                                *
//*返回: 温度值                                          *
//***********************************************************************  
unsigned char GetTemp(unsigned int adc_volt)
    {
        unsigned char i;
        unsigned char temp=0;
        for(i=0;i<61;i++)
      {
                if(adc_volt>=pgm_read_word(vt_table+i)) //  查表计算温度
           {
                  temp=i;
                        if(temp<10)    // -10~-1
             {
                                temp|=0x80;  // 加负温度标志
             }
                        else     // 0~50
             {
                       temp-=10;
             }
                     return temp; 
           }
      }
        temp=255;           //  如果超出范围返回255   
        return temp;
    }
int main(void)
    {
        PORTA=(1<<PA7)|(1<<PA6)|(1<<PA5);                   // PA7-PA5输出高电平
        DDRA|=(1<<PA7)|(1<<PA6)|(1<<PA5);                   // PA7-PA5设置为输出
        PORTD|=(1<<PD7)|(1<<PD0);                           // PD7 PD1 PD0输出高电平
        DDRD=(1<<PD7)|(1<<PD6)|(1<<PD1)|(1<<PD0);           //  PD7 PD6 PD1 PD0设置为输出
        ADCSRA|=(1<<ADEN);                   // 使能ADC
        lcm12864_init();
        lcm12864_clear();
        lcm12864_cls_gdram();
        lcm12864_dis_string(2,0,"NTC 测温",0);
        lcm12864_dis_string(6,1,"Ω",0);
        lcm12864_dis_string(6,2,"mV",0);
        lcm12864_dis_string(6,3,"℃",0);
        lcm12864_dis_dot(2,1,icon_rt);
        lcm12864_dis_dot(2,2,icon_volt);
        lcm12864_dis_dot(2,3,icon_temp);
        while(1)
         { 

                    adc_volt=(int)((long)GetADC(0)*VREF/1024);
                    rt=(int)(((long)adc_volt*R)/(VCC-adc_volt)); 
                    temp=GetTemp(adc_volt);
                    lcm12864_char_locate(4,1);
                    lcm12864_dis_ascii(0x30+rt/1000);
                    lcm12864_dis_ascii(0x30+rt%1000/100);
                    lcm12864_dis_ascii(0x30+rt%100/10);
                    lcm12864_dis_ascii(0x30+rt%10);      
                    lcm12864_char_locate(4,2);
                    lcm12864_dis_ascii(0x30+adc_volt/1000);
                    lcm12864_dis_ascii(0x30+adc_volt%1000/100);
                    lcm12864_dis_ascii(0x30+adc_volt%100/10);
                    lcm12864_dis_ascii(0x30+adc_volt%10);     
                    lcm12864_char_locate(4,3);
                    if(temp&0x80)
            {
                            lcm12864_dis_ascii('-'); 
            }
              else
            {
                            lcm12864_dis_ascii('+');
            }

                    lcm12864_dis_ascii(0x30+temp%100/10);
                    lcm12864_dis_ascii(0x30+temp%10);
         } 

    }
   

 

 
系统分类:行业·专业
标签:行业   专业   
推送: 无分类 归类:综合

此功能需激活邮箱后生效。
 
色短文---绝对搞笑 < 上一篇
用户回复
首页 上一页 1 下一页 尾页 共 1 页
评分与快速回复

博主推荐
相关文章
  • ·纳税申报一般程序
  • ·纳税申报一般程序
  • ·SKF轴承的命名及基本代号!
  • ·SKF轴承的命名及基本代号!
  • ·夫妻创业:公私必须分明
  • ·夫妻创业:公私必须分明
  • ·解读十大优惠政策惠及返乡农民工创业
  • ·解读十大优惠政策惠及返乡农民工创业
  • ·非诚勿扰给生意人的启示
  • ·非诚勿扰给生意人的启示
  • ·首科电讯东莞机房
  • ·首科电讯东莞机房
  • ·上海货运入境货物报检一般规定(一)
  • ·上海货运入境货物报检一般规定(一)
  • ·“三步法”――解答漫画类试题
  • ·“三步法”――解答漫画类试题
  • ·九年级思想品德中的“一、二、三、四、五”
  • ·九年级思想品德中的“一、二、三、四、五”
  • ·我国公民年龄的法律意义
  • ·我国公民年龄的法律意义
博友热推
  • 一窝蜂现象绝不仅局限于文化产业
  • 我可以选择放弃,但绝不放弃选择
  • 失去了吃醋的位置,所以我要离开
  • 不堪人生背后是恋人们对她的绝情
  • “过五关斩六将”春运回家全攻略
  • 一起走过青春,却最终走不进婚姻
  • 阴天该过去了,不然晴天怎会到来
  • 我不需要在你眼睛里寻找我的存在
  • 越剧女扮男妆是行业内的一枝独秀
  • 总在回首刹那才懂得时光如此匆匆
关于我们 | X5dj动态 | 加入我们 | 友情链接 | 官方日志 | 免责声明 | 举报不良信息
北京开创明天科技有限公司 版权所有 京ICP证040979号