⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main._c

📁 PC通过串口控制LCD1602显示!MCU为AVR单片机!
💻 _C
字号:
/*********************************Copyright (c)*********************************
**                                深 圳 德 先 电 子 有 限 公 司
**                                     开	发	部
**                                 http://www.t-sum.com
** 文   件   名: main.c
** 最后修改日期: 2005年06月8日
** 描        述: 主函数
** 版	     本: V1.0
** 主  控  芯 片:M16  晶振频率:8 MHZ
*******************************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "define.h"
#include "function.h"
#include "defineDS18B20.h"
#include "defineLCD.h"
#define b9600   0x33
#define baud   b9600
#define fone   0x2a
#define ftwo   0x2b
#define fclr   0x2d
#define fend   0x3c
#define floop  0x3e
/******************************************************************************
                  定义全局变量
*******************************************************************************/
const unsigned char table[]="0123456789.C "  ;         //显示常量
unsigned char i=0                            ;         //中断里的计数变量
char string[18]                              ;         //字符串
unsigned char  clr   = 0                      ;         //清屏命令标志
unsigned char  two   = 0                      ;		   //第二行显示标志
unsigned char   end  = 0						 ;	  // 结束标志
unsigned char  start = 0                      ;         //接收完成标志
unsigned char  one   = 0						 ;		   //第一行显示标志


//void draw(unsigned long int m );
/*****************************************************************************
                       函数声明
******************************************************************************/
void puts(unsigned int data );
void display(void)           ;
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00; 				  			   		 //输出
 PORTC = 0x00;  								 //m103 output only
 DDRC  = 0x00;  								 //输出 
 DDRD  = 0x00;
 PORTD = 0x00;
}

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

  		//字符输入函数 
*******************************************************************************/		 
unsigned char getchar(void)
  	{
	 while(!(UCSRA& (1<<RXC)));
     return UDR;
	}
	
	
/*******************************************************************************
        串行口接收中断
*******************************************************************************/	
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
 string[i]= UDR ;
 if(i==0)
  {switch (string[0])
   {
    case fone : {one=1;two=0;i++;}break;
	case ftwo : {two=1;one=0;i++;}break;
	case fclr : {clr=1;i=0;}      break;
	default:                      break ;
	}
	}
 else if (string[i]==fend) {end=i-1;start=1;}
 
 else i++;

}

/******************************************************************************
函数名称:1号通道采集函数
函数功能:返回采集一次的模拟量
函数参数:无
返回值 : 16 位型 ,变量

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

unsigned int ad_1(void)       //ad0采集函数,返回ad0的值
 {
  unsigned int value;
  ADMUX=0xc1;
  ADCSR=0x86;
  BIT_SET(ADCSR,ADSC);
  while(ADCSR & (1<<ADSC));   //waitting ADC complete 
  value=ADCL;                 //Read 8 low bits first (important) 
  value|=( int)ADCH << 8;      //read 2 high bits and shift into top byte 
  return(value);
  }

  
 
void main(void)
{    
/*****************************************************************************
                               变量定义
*******************************************************************************/     
	 unsigned long int  m=0         ;             //温度采集后的值
	 char temp                      ;			//循环变量
	 unsigned int data,vdata        ;          //温度和电压的值
/******************************************************************************
                                端口初始化和晶体频率校正
******************************************************************************/
	 
	 
	 port_init()                     ;            //端口初始话~~~!
	 OSCCAL=0xb0					 ;
	 
/*------------------------------------------------------------------
 初始化完成,初始化温度计,初始化液晶
--------------------------------------------------------------------*/

     resetDS18B20()                  ;       	  //初始化温度计
     DDRA|=LCD_DATA                  ;            // 数据为输出
	 DDRC|=LCD_RS|LCD_EN             ;       	  //置位RS.EN
     LCD_init()                      ;    	 	  //液晶初始化 
	 
/*****************************************************************************
					 初始化串口
******************************************************************************/
	// UBRR=0x33;						 ;		     //波特率9600
	// UCR=0x18						 ;			 //设置串口接收发送有效
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = baud; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x98;
 
/****************************************************************************
					初始化ad口
使用内部基准2.56 v , 使用 pa1(ad1)口采集电压,并发送到串口														   
*****************************************************************************/
    BIT_CLR(DDRA,1);
	BIT_CLR(PORTA,1);//设置采集端口为高祖状态
	SEI();

/******************************************************************************
 主循环体,循环测温,电压,并发送到上位机
******************************************************************************/	

     while(1)
	 
       {
	     resetDS18B20()              	  ;
	     m=readTempDS18B20()		      ;       //测试终端温度
		 
		 data=m;
		  vdata = ad_1()                     ;     //测试终端工作电压
		  puts(data)                         ;
		  puts(vdata)                        ;     //发送电压和温度到上位机
		  if(start==1)      display() 		 ;     // 普通模式
		  else if(clr==1)   
		  {
		   LCD_write_char(0x01,0);
		   clr=0;
		   one=0;
		   two=0;
		   start=0;
		   end=0;
		   }
		  else
		  delay_nms(1000)					 ;
	  
       }//主循环结束
}//主程序结束


void puts(unsigned int data )
    {
	      // UDR=data>>8;
		  unsigned char h , l ;
		   h=*((unsigned char *)(&data)+1);
		   UDR=h;
		   while(!(USR&0x40));
		   USR |= 0x40;
		   //UDR=data;
		   l=*(unsigned char *)(&data);
		   UDR=l;
		   while(!(USR&0x40));
		   USR |= 0x40;
		  
    }
	
void display(void)
  {
  unsigned char k ;
  if(one==1)
      {
	   LCD_set_xy(0,0);
	   for(k=1;k<=end;k++)
          {
		   LCD_write_char(0,string[k]);
		   
		   }
       start=0;
       i=0;
	   }
   else if(two==1)
      {
	   LCD_set_xy(0,1);
	   for(k=1;k<=end;k++)
	     {
		  LCD_write_char(0,string[k]);
		  
		  }
	   start = 0 ;
	   i= 0;
	  }
   }

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -