ATMEGA16L实现时间和温度的循环显示程序分享

2019-11-09来源: 51hei关键字:ATMEGA16L  时间和温度  循环显示

//ICC-AVR application builder : 2/13 20:52:33

/*******************************************************************************

* 版权:     

*

* 单片机:   ATMAGE16L

* 晶振:     外部8MHz

* 编译器:   ICC 7.22

*

* 文件名:   main.c

* 作者:     木子工作室

* 版本:     1.0

* 完成日期: 

* 功能描述: 在12M晶振下,实现时间和温度的循环显示

*******************************************************************************/

//#include

#include

#include


#define LED0 PORTD

#define LED1 PORTB


#define BEEL_OFF PORTC |= BIT(0);

#define BEEL_ON PORTC &= ~BIT(0);


unsigned char i=0,f=0,n=0,xx=0,fangduan=0,ADC_LL=0,ADC_HH=0;

unsigned int x = 0,t=0,t1=0,s0=0,s1=0,m0=0,m1=0,h0=0,h1=0,s=0,h=8,m=15,mid=0,a=0,g=240,b=180,c,d,e,o=1,p,q,r,T,ADC_H=0;

unsigned char tab[16] = {0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0X77,0X7c,0X39,0X5e,0X79,0X71};//正常字模

unsigned char tab1[10] = {0Xbf,0X86,0Xdb,0Xcf,0Xe6,0Xed,0Xfd,0X87,0Xff,0Xef};//带下小数点字模

unsigned char tab2[2] = {0X61,0X40};//度C,"-"号



unsigned int CBM[130] = {19,33,38,44,56,59,61,63,65,67,69,71,73,76,78,81,83,86,89,92,94,98,101,104,108,111,115,119,123,127,131,135,140,145,149,154,160,165,171,176,182,188,194,200,207,214,220,228,235,243,250,258,267,275,284,293,302,311,321,331,341,351,361,372,382,393,405,416,428,439,451,463,475,487,500,512,525,537,550,562,576,588,601,613,626,638,645,651,657,663,675,688,699,711,723,734,746,757,768,779,789,799,809,818,828,837,846,855,863,871,878,886,893,900,907,913,919,925,931,936,941,946,951,952,959,963,967,970,980,990};

unsigned int CBT[130] = {1190,995,950,900,820,800,790,780,770,760,750,740,730,720,710,700,690,680,670,660,650,640,630,620,610,600,590,580,570,560,550,540,530,519,511,501,490,481,470,460,450,440,430,420,410,400,391,380,371,360,351,341,330,320,310,300,290,281,270,260,250,240,230,220,210,200,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0,2005,2010,2015,2020,2030,2040,2050,2060,2070,2080,2090,2100,2110,2120,2130,2140,2150,2160,2170,2180,2190,2200,2210,2220,2230,2240,2250,2260,2270,2280,2290,2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,2400,2450,2460};


/******************************************************************************* 

* 函数名称: WDCB()

* 入口参数: 

* 出口参数: 

* 功能描述:  温度查表

*******************************************************************************/

int WDCB() //用int 类型的函数是想让return命令生效!使一旦查到结果就跳出FOR,节省CPU资源。

{

  for(c=0;c<129;c++)

     {

          if(CBM[c]==ADC_H)

            {

                 d=c;

                 T=CBT[d];

                 if(T>2000)

                   {

                    f=1;

                    T=(T-2000)/10;

                         }

                 return ;//使一旦查到结果就跳出FOR,节省CPU资源。

                 }

          if(c<=84 & ADC_H>CBM[c] & ADC_H

            {

                 T=CBT[c]-((ADC_H-CBM[c])*((CBT[c]-CBT[c+1])*10/(CBM[c+1]-CBM[c])))/10; //按照CBM[]和CBT[]的区间比例关系折算实际温度,可大幅降低数组容量又不失精确。

                 f=0;  //判断正负温度

                 return ;//用int 类型的函数是想让return命令生效!使一旦查到结果就跳出FOR,节省CPU资源。

                 }

          if(c>=85 & ADC_H>CBM[c] & ADC_H

            {

                 T=((CBT[c]+((ADC_H-CBM[c])*((CBT[c+1]-CBT[c])*10/(CBM[c+1]-CBM[c])))/10)-2000)/10; //按照CBM[]和CBT[]的区间比例关系折算实际温度,可大幅降低数组容量又不失精确。

                 f=1;  //判断正负温度

                 return ;//使一旦查到结果就跳出FOR,节省CPU资源。return后面加不加T,好像对返回T值没啥影响。

                 }         

          }


}



/******************************************************************************* 

* 函数名称: Disp_Time()

* 入口参数: 

* 出口参数: 

* 功能描述:  显示时间

*******************************************************************************/

void Disp_Time(void)

        {        

        //BEEL_ON;   

           for(i=0;i<4;i++)

             {


                   PORTD = 0X1F;

                   if(xx==1)

                     {q=a%30;} //设置闪烁周期

                   if(xx==2)

                     {r=a%30;}//设置闪烁周期

                   if(i==0)

             {

                     LED1 = tab[m0];

                         if(q<15 | o==0)//q设置亮屏时长,o是按键之后一小段时间内,并上o的条件是让校时操作别闪炼太快。

                       {PORTD&= ~BIT(3);}

                         else

                           {PORTD|= BIT(3);}  //黑屏

                          }

                   if(i==1)

             {

                     LED1 = tab[m1];

                         PORTD|= BIT(4);//B端口4位置1, ":"号

                         if(q<15 | o==0)//q设置亮屏时长,o是按键之后一小段时间内,并上o的条件是让校时操作别闪炼太快。

                       {PORTD&= ~BIT(2);}

                         else

                           {PORTD|= BIT(2);}

                          }

                   if(i==2)

             {

                     LED1 = tab[h0];

                         if(r<15 | o==0)//q设置亮屏时长,o是按键之后一小段时间内,并上o的条件是让校时操作别闪炼太快。

                       {PORTD&= ~BIT(1);}

                         else

                           {PORTD|= BIT(1);}

                          }

                   if(i==3)

             {

                     LED1 = tab[h1];

                         if(r<15 | o==0)//q设置亮屏时长,o是按键之后一小段时间内,并上o的条件是让校时操作别闪炼太快。

                       {PORTD&= ~BIT(0);}

                         else

                           {PORTD|= BIT(0);}

                         }

                   delay_ms(60);

                   PORTB = 0X00;

                  }//FOR尾

        }


        

        

/******************************************************************************* 

* 函数名称: Disp_Wd()

* 入口参数: 

* 出口参数: 

* 功能描述: 显示

[1] [2]
关键字:ATMEGA16L  时间和温度  循环显示 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479511.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:二轮平衡机器人控制器代码
下一篇:关于AVR单片机,你了解多少?

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

atmega16与24l01按键主程序
#include<avr/io.h>#include<avr/delay.h>#include"NRF24L01.h"//#define Open_TX#define Open_RXtypedef unsigned char  uint8;                   /* defined for unsigned 8-bits integer variable     无符号8位整型变量 
发表于 2019-11-08
ATMEGA168+L298控制电机正反转的代码与Proteus仿真
这是之前课程设计做的遥控小车,简单的控制电机转速使小车前进和后退,左转右转也是参考了网上别人的,有需要的可以看看,哪里有不足也请指出ATMEGA168单片机+L298仿真原理图如下 单片机源码:int Foreward_key=2;//正转按钮int Reverse_key=3;//反转按钮int Stop_key=4;//停止按钮int Trunleft_key=0;//左转按钮int Trunright_key=1;//右转按钮int Foreward_led=5;//正转指示灯int Reverse_led=6;//反转指示灯int Stop_led=7;//停止指示灯int pinI1=8;//定义电机1正转接
发表于 2019-10-24
ATMEGA168+L298控制电机正反转的代码与Proteus仿真
Atmega16l单相逆变器SPWM原理图PCB及源程序
Altium Designer画的原理图和PCB图Atmega16l单片机源码如下:#include<iom16v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned charuchar zd=0,c=0;uint iv=0,ii=0,ov=0,oi=0,sj=0,b=0;uchar table[3]={8,8,8};#pragma data:codeflash uint table1[]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0X77,0X7c,0X39
发表于 2019-10-21
Atmega16l单相逆变器SPWM原理图PCB及源程序
基于ATmega16单片机 NRF24L01无线收发驱动程序源代码
完成中断响应,16位CRC   ,主接收    Hign_24L01_CE;     inerDelay_us(130);}/******************************************************************************************************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中
发表于 2018-06-21
AVR单片机(ATmega16L)DS18B20温度传感器驱动程序
注释掉,1602液晶马上显示出来正确的温度。心中大喜。马上把程序移植到AVR上,修改了头文件、延时参数、I/O口方向仍然不能正常运行,又纠结了一天,结果发现检测输入时,检测了PORTB,而非PINB,改正后程序终于正常了。明天把程序移植到PIC单片机上,希望不要再纠结了。  AVR单片机的程序比51单片机的稍微麻烦点,与PIC单片机基本相同。通过宏修改寄存器名,可以直接移植到PIC上,应该没有大问题。把AVR单片机的程序贴出来,希望对新手有所帮助。#include<iom16v.h>  #define uchar unsigned char  #define uint unsigned
发表于 2018-06-21
AVR单片机(ATmega16L)DS18B20温度传感器驱动程序
温度计记录器可进行更长时间的监测
2016年6月7日,Maxim Integrated Products, Inc (NASDAQ: MXIM)推出DS1925 iButton®数据记录器,支持更长时间地监测冷链和其它温度敏感的产品或过程。 温度敏感的产品或过程如果暴露于太高或太低温度就会被损毁,数据记录器能够帮着解决此问题。以往,企业只能保留每次关键温度监测任务的16KB数据,并且往往不得不降低数据采样率。DS1925具有122KB数据记录存储器,比其它数据记录产品的监测时间更长,并且同时保证相应的采样率。   DS1925在较宽温度范围内具有高精度,并且能够测量电池寿命。即使电池在更换记录器之前耗尽,器件也能保存测量数据。与其它温度
发表于 2016-06-24
温度计记录器可进行更长时间的监测
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved