📄 main._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 + -