AVR单片机+DS18B20简易VB显示程序

发布者:橙子1234最新更新时间:2015-06-23 来源: 51hei关键字:AVR单片机  DS18B20 手机看文章 扫描二维码
随时随地手机看文章
//------AVR代码-----------------
#include               //1602代码
#include
#define RS PORTB_Bit0
#define RW PORTB_Bit1
#define EN PORTB_Bit2
#define DATA PORTA
#define busy 0x80
void delay(uint k)
{
 uint i,j;
for(i=0;i for(j=0;j<1140;j++);
  
}

void wait()
{
  uchar val;
  DATA=0xff;
  RS=0;
  RW=1;
  __no_operation();
  __no_operation();
  EN=1;
  __no_operation();
  __no_operation();
  DDRA=0x00;
  val=PINA;
  while(val&busy)
  {
    val=PINA;
  }
  EN=0;
  DDRA=0xff;
}

void writecmd(uchar cmd)
{
  wait();
  RS=0;
  RW=0;
  __no_operation();
  DATA=cmd;
  __no_operation();
  EN=1;
  __no_operation();
  __no_operation();
  EN=0;
}
void writedata(uchar data)
{
  wait();
  RS=1;
  RW=0;
 __no_operation();
 DATA=data;
 __no_operation();
 EN=1;
 __no_operation();
 __no_operation();
 EN=0;
}

  
void displayonechar(uchar x,uchar y,uchar dda)
{
  y&=0x01;
  x&=0x0f;
  if(y)x|=0x40;
  x|=0x80;
  writecmd(x);
  writedata(dda);
}
 
void displaychar(uchar x,uchar y,uchar *p)
{
  y&=0x01;
  x&=0x0f;
  while(*p!='')
  {
    if(x<=0x0f)
    {
      displayonechar(x,y,*p);
      p++;
      x++;
    }
  }
}

void init1602()
{
 delay(15);
writecmd(0x38);
delay(5);
writecmd(0x38);
delay(5);
writecmd(0x38);
writecmd(0x80);
writecmd(0x01);
writecmd(0x06);
writecmd(0x0c);
}
 
//-------------18B20代码------------
#include
 

uchar teml,temh;
uchar sign;
uchar Flag_1820Error;
uint tempp; //温度值

/*********************************/
void delay_15us(void)  //15us左右 

uchar x=27;
  while(x) 
  { 
    x--; 
  } 

/********************************/
void delay_60us(void)  //60us左右 

uchar x=117;
  while(x) 
  { 
    x--; 
  } 
}

void init_1820(void) 

   uchar i;
   uint j=0;
   PORTC|=(1<<7);  //"1"
   PORTC&=~(1<<7); //"0"
   for(i=0;i<8;i++)delay_60us();//480us以上 
   PORTC|=(1<<7);  //"1"
   DDRC&=~(1<<7);  //"PINC7 is INPUT"
   delay_15us();     //15~60us
   delay_15us(); 
   Flag_1820Error=0;  
   while(PINC&(1<<7)) 
   { delay_60us();
     j++;
  if(j>=18000){Flag_1820Error=1;break;}
   }   
   DDRC|=(1<<7);   //PORTC7 is OUTPUT
   PORTC|=(1<<7);  //"1"
   for(i=0;i<4;i++)delay_60us(); //240us 

/********************************/
void delay_5us(void)  //5us左右 

uchar x=7;
  while(x) 
  { 
    x--; 
  } 
}
/********************************/
void write_1820(uchar x) 
{    
   uchar m; 
   for(m=0;m<8;m++) 
   { 
    if(x&(1<      {PORTC&=~(1<<7);delay_5us(); //"0",5us
   PORTC|=(1<<7); //write"1"
   delay_15us(); //15~45us
   delay_15us();
   delay_15us();
  }
     else 
     {PORTC&=~(1<<7);delay_15us();//"0",15us 
   delay_15us(); //write"0"
   delay_15us(); //15~45us
   delay_15us();
      PORTC|=(1<<7);  //"1"
  }
   } 
   PORTC|=(1<<7); //"1"

/*******************************/
uchar read_1820(void) 
{     
   uchar temp,k,n; 
   temp=0; 
   for(n=0;n<8;n++) 
   { 
    PORTC&=~(1<<7);  //"0"
    delay_5us();      
    PORTC|=(1<<7);   //"1"
    delay_5us();
    DDRC&=~(1<<7);   //"PINC7 is INPUT"
    k=(PINC&(1<<7)); //读数据,从低位开始 
    if(k) 
     temp|=(1<     else 
     temp&=~(1<     delay_15us();      //45us
 delay_15us();
 delay_15us();     
    DDRC|=(1<<7);    //PORTC7 is OUTPUT
   } 
   return (temp); 
}  
/*************************************/
uint read_temper(void)

    uchar TX;  //小数位
    uchar TZ;  //整数位
    init_1820();        //复位18b20 
    write_1820(0xcc);   // 发出转换命令 
    write_1820(0x44); 
     ;;;;;;
    init_1820(); 
    write_1820(0xcc);  //发出读命令 
    write_1820(0xbe); 
    teml=read_1820();  //读数据byte1 
    temh=read_1820();  //byte2
    TX=teml&0x0f;
    temh=temh<<4;
    temh|=(teml&0xf0)>>4;
    TZ=temh;
    tempp=TZ*10+TX;
       
        return tempp;
 
}[page]
 
//---串口代码------------
 
#define UDRE 5
#define RXC 7
void serial_init()  //串口初始化
{
 UCSRB=0x00;
 UCSRA=0x02;
 UCSRC=0x06;
 UBRRL=0x67;
 UBRRH=0x00;
 UCSRB=0x18; 
}
void serial_sendbyte(uchar u)
{
  while(!(UCSRA&(1<   UDR=u;
}
uchar serial_receive()
{
 while(!(UCSRA&(1<  return UDR; 
}
void serial_str(uchar *p)
{
 while(*p)
 {
  serial_sendbyte(*p);
  p++;
 }
  
}
void serial_sendtemp(uint tt)  //发送温度值
{
  serial_sendbyte((tt/100)+48);
  serial_sendbyte((tt%100/10)+48);
  serial_sendbyte('.');
  serial_sendbyte((tt%10)+48);
  serial_sendbyte(' ');
  serial_sendbyte(' '); 
}
 
//--------------按键代码-------
 
 
#define k1 PIND_Bit4
#define k2 PIND_Bit5

void key1()
{
  static uchar i,j;
   if(k1==0)
   {
     if(i==0)
     {
      j++;
      if(j>2)
      {
       if(k1==0)
       {
         i=1;j=0;
     tempset++;
     if(tempset>50)tempset=0;
       }
      } 
     } 
   }
   else
   {
    i=0;
    j=0;
    } 
}
 
//----------------定时器代码--------------
 
 

void time0_init()  //定时器1 初始化
{
  TCCR0=0x05;  //1024分频
  TCNT0=0x4b;
  TIMSK=0x01;
  SREG=0x80;  
}
#pragma vector = 0x24
__interrupt void time0_event()
{
  SREG=0x00;
  TCNT0=0x4b;
 static uchar i;
 i++;
 if(i==40)
 { i=0;
   displayflag=1;  //到达1秒刷屏标志启动
  sec++;
  if(sec==100)sec=0; 
 }
}
//------------------------主函数----------------------
#include
#define uchar unsigned char
#define uint unsigned int
 
 
#define light PORTB_Bit7   //过温报警闪灯
uchar sec;
uchar displayflag;   // 刷屏标志
 uint tempset=25; //温度设定
 
 
#include"1602.h"
#include"18b20.h"
#include"serial.h"
#include "time1.h"
#include "key.h"
 
void port_init()
{
  PORTA=0xff;
  DDRA=0xff;
  PORTB=0xff;
  DDRB=0xff;
  PORTC=0xff;
  DDRC=0xff;
  PORTD=0xff;
  DDRD=0x00; 
}
void show_temp(uint k)   //显示温度值
{
  displayonechar(1,1,(k/100)+48);
  displayonechar(2,1,(k%100/10)+48);
  displayonechar(3,1,'.');
  displayonechar(4,1,(k%10)+48);
  
}
void show_sec(uchar k)    //显示秒表
{
  displaychar(7,1,"Sec :");
 displayonechar(13,1,(k/10)+48);
 displayonechar(14,1,(k%10)+48);
  
}
void show_tempset(uchar k)     //显示设定值
{
  displaychar(10,0,"SET:");
  displayonechar(14,0,(k/10)+48);
  displayonechar(15,0,(k%10)+48);
  
}
void main()
{
 uint TT; //显示的温度值
 uint kk;
 port_init();
 serial_init();
 time0_init();
 delay(1000);
 init1602();
  displaychar(0,0,"Test");
  while(1)
 {
 TT=read_temper();
 show_temp(TT);
 serial_sendtemp(TT);
 show_tempset(tempset);
 if(displayflag==1)  //秒钟变化后才刷屏
 {
 show_sec(sec);
 displayflag=0;
  }
 if(TT>tempset*10)  //温度大于设定值报警
 {
  kk++;
  if(kk>20)
  {
   light=~light;
   kk=0;
  }
 }
 key1();   //按键设定温度值
}
}

如果网页上的代码发生格式错乱请到这里下载完整版的: http://www.51hei.com/f/avrdsvb.rar



 

//---------------VB代码----------
Option Explicit
Private Sub Command1_Click()
MSComm1.CommPort = 6
MSComm1.PortOpen = True
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeText
MSComm1.InputLen = 0
End Sub
 
Private Sub MSComm1_OnComm()
Text1.Text = MSComm1.Input
End Sub
关键字:AVR单片机  DS18B20 引用地址:AVR单片机+DS18B20简易VB显示程序

上一篇:AVR的EEPROM简单实验
下一篇:1602自定义字符显示摄氏度符号

推荐阅读最新更新时间:2024-03-16 14:04

基于AVR单片机的温度测量系统
1 引言   传统温度测量系统中,一般选用模拟式温度传感器。常用的模拟式温度传感器,其中一个共同特点是输出为模拟量,因此在测量电路中必须经过A/D转换才能成为计算机所能处理的数字量。数字式温度传感器将非电模拟量转换到数字信号这一处理过程的多个环节集成在单芯片上,实现了在测量点将温度值数字化,有效解决了传统温度传感器外围电路复杂,抗干扰能力差的弊病,降低了对系统的要求。   该系统以Atmel公司的ATmega8L单片机为控制中心,温度测量使用DS18B20单总线数字温度传感器,采用1602字符型液晶显示器作为温度值的显示输出。编程使用CodeVision AVR C Compiler编译器,该编译软件自带了使用器件库函数文件
[单片机]
基于<font color='red'>AVR单片机</font>的温度测量系统
DS18B20-64位序列码读取程序
/*******************************************************************/ /* */ /*51hei单片机开发系统演示程序 - DS18B20-64位序列码读取程序 */ /* * * LCD1602显示 * * * * 工作芯片:STC89C516 晶振频率:11.0592MHz * *
[单片机]
基于AVR单片机的智能家届监控系统
0 引言 随着科技的发展和人民生活水平的提高,智能家居成为了一个热门的研究领域。智能家居问题中面临的主要问题就是安全防盗、电器控制等问题。智能家居不仅能够完成出现问题对主人进行的报警功能,还应提供智能家居设备执行主人的命令操作,比如通过手机或是平板电脑等终端控制电器进行做饭或是空气清洁等工作。 因此,智能家居中用到的传感器主要有红外传感器、门磁传感器、实时时钟芯片等。 1 家居监控系统工作原理 系统主要由门磁报警、红外传感器报警、煤气传感器报警、正常工作、用户命令执行动作构成。 1.1 门磁报警 门磁系统完成对门出入安全的监测,主要有磁铁和干簧管组成。当主人离开房子的时候可以启动防盗功能,如果两者保持正对,那么在
[单片机]
基于<font color='red'>AVR单片机</font>的智能家届监控系统
AVR单片机—(五)、ATMEGA16的USART与PC机串行通信—01(补充)
//------------------------------------------------------------------------------ //ATMEGA16与PC机的通信实验1 //PC机发送一个字符给单片机,单片机收到后既在发光二极管进行显示,同时将其回传给PC //单片机的发送和接收都采用查询方式 #include ioavr.h #include intrinsics.h #include delayics.h //------------------------------------------------------------------------------ typedef u
[单片机]
<font color='red'>AVR单片机</font>—(五)、ATMEGA16的USART与PC机串行通信—01(补充)
AVR单片机万年历程序
AVR 单片机 万年历程序 //***************************FileName:RTC.C************************// //***************************I CC AVR V6.30编译**********************// #include io8535v.h //寄存器定义文件 #include macros.h //使用到宏 #define uchar unsigned char //数据类型定义 #define uint unsigned char //数据类型定义 #d
[单片机]
<font color='red'>AVR单片机</font>万年历程序
基于ARM和DS18B20设计网络化的智能温度传感器
1 网络化智能传感器简介 网络化智能传感器使传感器由单一功能、单一检测向多功能和多点检测发展;从被动检测向主动进行信息处理方向发展;从就地测量向远距离实时在线测控发展。网络化使得传感器可以就近接入网络,传感器与测控设备间再无需点对点连接,大大简化了连接线路,易于系统的维护和扩充。网络化智能传感器一般由信号采集单元、数据处理单元和网络接口单元组成。这3个单元可以是采用不同芯片构成合成式的,也可以是单片式结构。网络化智能传感器的核心便是嵌入式微处理器。嵌入式微处理器具有体积小、功耗低、可靠性高、可抗干扰能力强等特点。本系统就是采用嵌入式微处理器作为核心,使用数字式的温度传感器作为采集单元。系统设计中采用的是信息技术领域最新的B/S(B
[单片机]
基于ARM和<font color='red'>DS18B20</font>设计网络化的智能温度传感器
AVR单片机JTAG与ISP的区别
(1)、JTAG是一个通信标准,用于计算机和单片机进行实时快速通讯。 AVR 的JTAG功能(只有部分型号才有)使得AVR的调试工作非常简单,可以通过JTAG 接口对Flash、EEPROM、熔丝位和锁定位进行编程。使用AVR studio软件和JTAG硬件( AVR JTAG编程器,AVR JTAG仿真器)可以进行程序下载(编程)和程序在线调试。 JTAG接口有四个引脚。以JTAG的术语来说,这些引脚组成了测试访问端口TAP。这些引脚是: TMS:测试模式选择。此引脚用来实现TAP 控制器各个状态之间的切换。 TCK:测试时钟。JTAG 操作是与TCK 同步的。 TDI: 测试数据输入--需要移位到指令寄存器或数据寄存器(扫
[单片机]
基于单片机ATmega16的无线温度监测系统
0 引言 随着社会的发展和进步,越来越多的场合对温度的要求日臻严格,温度监控系统的应用日趋受到重视。在农业发展领域,农业大棚、冷库、培育温室等众多场合都需要温度测量技术。传统的测温系统都是有线系统,对于一些需要多点测温的场合,使用传统有线测温方式在布设、维护和更新方面存在着很多不便。为了解决这个问题,设计了一种基于单片机和无线收发模块的无线温度监控系统,结合温度传感器可以很方便构建一个多点分布式智能无线温度监控系统。 1 无线温度监控系统构成 系统主要由两部分组成。如图1所示,第一部分是节点温度测量系统,第二部分是温度显示管理终端。节点温度测量系统负责测量温度,并将温度值通过无线通信发送到温度显示管理终端。管理终端接收温度信
[单片机]
基于单片机ATmega16的无线温度监测系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved