📄 mega16l_tc__.c
字号:
#include <mega16.h>
#include "LCD.h"
#include "DELAY.h"
#include <USART.h>
#include <ds18b20.h>
#include <1wire.h>
#include <stdlib.h>
#include <stdio.h>
#asm
.equ __w1_port=0x1b //Port A.0
.equ __w1_bit=0
#endasm
unsigned char rom_code[1][9];
extern char rx_buffer[100];
extern unsigned char rx_counter;
bit rx_buffer_overflow;
/********************************************************************
函 数 名:USART_RX_ISR
入口参数:无
出口参数:无
建立日期:2008年5月6日
修改日期:
函数作用:串口接收中断
说 明:
********************************************************************/
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_counter]=data;
if (++rx_counter == 100)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
void main(void)
{
unsigned char mymessage1[]={"正在初始化"};
unsigned char mymessage2[]={"初始化完毕"};
// unsigned char mymessage3[]={"ERROR"};
unsigned char mymessage4[]={"传输温度数据"};
unsigned char mymessage5[]={"温度数据传输完毕"};
unsigned char temp_print[10];
float temp=0;
int i;
DDRA = 0xFF;
PORTA = 0xFF;
Clr_CS();
Clr_SID();
Clr_SCLK();
LCD_INIT();
LCD_DISPLAY(mymessage1);
USART_INIT();
DELAY_1MS(10);
// i=w1_init();
i= w1_search(0xF0, rom_code);
ds18b20_init(&rom_code[0][0],0,0,DS18B20_9BIT_RES);
DELAY_1S(1);
#asm("sei")
TC35_INIT();
DELAY_1MS(10);
DELAY_1S(2);
LCD_CLEAR();
DELAY_1MS(10);
LCD_DISPLAY(mymessage2);
while (1)
{
#asm("cli")
temp=ds18b20_temperature(&rom_code[0][0]);
DELAY_100MS(1);
#asm("sei")
ftoa(temp,5,temp_print); //转换浮点数temp为字符串temp_print,其中第二位参数指定四舍五入保留小数位(最多五位)。
DELAY_1MS(10);
LCD_CLEAR();
DELAY_1MS(10);
LCD_DISPLAY(temp_print);
DELAY_1S(4);
LCD_CLEAR();
LCD_DISPLAY(mymessage4);
DELAY_100MS(1);
TC35_SENDMESSAGE(temp_print);
DELAY_100MS(1);
LCD_CLEAR();
LCD_DISPLAY(mymessage5);
DELAY_1S(60);
}
}
#include "DELAY.h"
//********************************************************************
//函 数 名:DELAY_1MS
//入口参数:ms
//出口参数:无
//建立日期:2007年8月15日
//修改日期:
//函数作用:毫秒级的延时程序
//说 明:
//********************************************************************
void DELAY_1MS(unsigned int ms)
{
unsigned int i;
while(ms--)
{
for(i=1;i<(unsigned int)(xtal*143-2);i++);
}
}
//********************************************************************
//函 数 名:DELAY_100MS
//入口参数:mms
//出口参数:无
//建立日期:2007年8月15日
//修改日期:
//函数作用:100毫秒级的延时程序
//说 明:
//********************************************************************
void DELAY_100MS(unsigned int mms)
{
while(mms--)
{
DELAY_1MS(100);
}
}
//********************************************************************
//函 数 名:DELAY_1S
//入口参数:s
//出口参数:无
//建立日期:2007年8月15日
//修改日期:
//函数作用:1秒级的延时程序
//说 明:
//********************************************************************
void DELAY_1S(unsigned int s)
{
while(s--)
{
DELAY_1MS(1000);
}
}
#include "LCD.h"
#include "DELAY.h"
#include "mega16.h"
/*******************************************************************
函 数 名:LCD_INIT
入口参数:无
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:液晶初始化
说 明:
********************************************************************/
void LCD_INIT(void)
{
LCD_WR1BYTE(0,0,0x30); //功能设置 8位数据,基本指令
DELAY_1MS(2);
LCD_WR1BYTE(0,0,0x0C); //显示状态 ON,游标OFF,反白OFF
DELAY_1MS(2);
LCD_WR1BYTE(0,0,0x01); //清除显示
DELAY_1MS(2);
LCD_WR1BYTE(0,0,0x02); //地址归位
DELAY_1MS(2);
LCD_WR1BYTE(0,0,0x80); //设置DDRAM地址
DELAY_1MS(2);
LCD_WR1BYTE(0,0,0x30); //关闭绘图模式,进入字符模式
DELAY_1MS(2);
}
/********************************************************************
函 数 名:LCD_WR8BITS
入口参数:W_bits
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:负责串行输出8个bit位
说 明:
********************************************************************/
void LCD_WR8BITS(unsigned int wbits)
{
unsigned int i,Temp_data;
for(i=0; i<8; i++)
{
Temp_data = wbits;
Temp_data <<= i;
if((Temp_data&0x80)==0) //bit7 is zero
{
Clr_SID();
#asm("nop");
Set_SCLK();
#asm("nop");
#asm("nop");
Clr_SCLK();
#asm("nop");
Clr_SID();
}
else //bit7 is one
{
Set_SID();
#asm("nop");
Set_SCLK();
#asm("nop");
#asm("nop");
Clr_SCLK();
#asm("nop");
Clr_SID();
}
}
}
/*******************************************************************
函 数 名:LCD_WR1BYTE
入口参数:RW、RS、W_data
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:写一个字节的数据到12864液晶,包括指令和数据
说 明:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;
一般RW都设为0,即只向液晶写数据,不读数据
RS=1,写入的是数据;RS=0,写入的是指令;
一般模式:RW=0,RS=1;写数据
RW=0,RS=0;写指令
********************************************************************/
void LCD_WR1BYTE(unsigned char RW,unsigned char RS,unsigned char wdata)
{
unsigned int H_data,L_data,S_ID = 0xf8; //11111RWRS0
if(RW == 0)
{
S_ID &=~ 0x04;
}
else //if(RW==1)
{
S_ID |= 0X04;
}
if(RS == 0)
{
S_ID &=~ 0x02;
}
else //if(RS==1)
{
S_ID |= 0X02;
}
H_data = wdata;
H_data &= 0xf0; //屏蔽低4位的数据 //为什么要这样,见SG12864J501C2.pdf第18页
L_data = wdata; //xxxx0000格式
L_data &= 0x0f; //屏蔽高4位的数据
L_data <<= 4; //xxxx0000格式
Set_CS();
LCD_WR8BITS(S_ID); //发送S_ID
LCD_WR8BITS(H_data); //发送H_data
LCD_WR8BITS(L_data); //发送L_data
Clr_CS();
}
/********************************************************************
函 数 名:LCD_DISPLAY
入口参数:*message
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:在LCD上显示*message所指向的内容
说 明:
********************************************************************/
void LCD_DISPLAY(unsigned char *message)
{
unsigned char i = 0;
for(i=0;message[i]!='\0';i++)
{
LCD_WR1BYTE(0,1,message[i]);
}
}
/*******************************************************************
函 数 名:LCD_CLEAR
入口参数:无
出口参数:无
建立日期:2007年8月17日
修改日期:
函数作用:清屏
说 明:
********************************************************************/
void LCD_CLEAR(void)
{
#asm("nop");
LCD_WR1BYTE(0,0,0x01);
#asm("nop");
}
#include "USART.h"
#include "mega16.h"
#include <string.h>
#define RX_BUFFER_SIZE 100
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
#define TX_BUFFER_SIZE 100
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index;
//unsigned char tx_rd_index;
unsigned char tx_counter;
#else
unsigned int tx_wr_index;
unsigned int tx_rd_index;
unsigned int tx_counter;
#endif
unsigned char OK[]="OK";
unsigned char *p;
unsigned char OK1='>';
unsigned char TC35_AT[]="AT"; // 连机命令
unsigned char TC35_CMGF[]="AT+CMGF=1"; // 选择短消息信息格式 (0:PDU,1:文本)
unsigned char TC35_CSMP[]="AT+CSMP=17,167,0,0"; // 设置短消息文本模式参数
unsigned char TC35_CSCS[]="AT+CSCS=GSM"; // 设置字符集
unsigned char TC35_CMGS[]="AT+CMGS=13915006560"; // 文本模式时设置对方电话号码,PDU模式时设置PDU长度
unsigned char TC35_RESET[]="ATZ"; // 软复位
//unsigned char TC35_CSQ[]="AT+CSQ"; // 检查信号质量
//unsigned char TC35_CONNECT[]="ATD*99***1#\r"; // 拨号
//unsigned char TC35_CONNECT1[]="AT+CGDCONT=1,"IP","CMNET"\r";
/********************************************************************
函 数 名:USART_Init
入口参数:无
出口参数:无
建立日期:2008年4月20日
修改日期:
函数作用:串口初始化
说 明:
********************************************************************/
void USART_INIT(void)
{
UCSRA=0x00;
UCSRB=0x98; //接收器、发生器和接收中断使能
UCSRC=0x86; //设置帧格式:8 Data, 1 Stop, No Parity
UBRRH=0x00; //设置波特率
UBRRL=0x33;
}
/********************************************************************
函 数 名:USART_GETCHAR
入口参数:无
出口参数:无
建立日期:2008年5月6日
修改日期:
函数作用:接收一位字符
说 明:
********************************************************************/
char USART_GETCHAR(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
/********************************************************************
函 数 名:USART_SENDCHAR
入口参数:无
出口参数:无
建立日期:2008年5月6日
修改日期:
函数作用:发送一位字符
说 明:
********************************************************************/
void USART_SENDCHAR(unsigned char c)
{
while(!(UCSRA&(1<<UDRE)));
UDR=c;
}
/********************************************************************
函 数 名:USART_SENGSTR
入口参数:*ptr
出口参数:无
建立日期:2008年4月20日
修改日期:
函数作用:发送字符串
说 明:
********************************************************************/
void USART_SENGSTR(unsigned char *ptr)
{
while (*ptr)
{
USART_SENDCHAR(*ptr++);
}
USART_SENDCHAR(0x0D);
USART_SENDCHAR(0x0A); //结尾发送回车换行
}
/********************************************************************
函 数 名:TC35_INIT
入口参数:无
出口参数:无
建立日期:2008年5月6日
修改日期:
函数作用:TC35初始化
说 明:
********************************************************************/
void TC35_INIT(void)
{
USART_SENGSTR(TC35_AT);
do
p=strstr(rx_buffer,OK);
while(p==NULL);
memset(rx_buffer,'',sizeof(rx_buffer));
rx_counter=0;
}
/********************************************************************
函 数 名:TC35_MESSAGEINIT
入口参数:无
出口参数:无
建立日期:2008年5月10日
修改日期:
函数作用:TC35短消息发送初始化
说 明:
********************************************************************/
void TC35_MESSAGEINIT(void)
{
USART_SENGSTR(TC35_CMGF);
do
p=strstr(rx_buffer,OK);
while(p==NULL);
memset(rx_buffer,'',sizeof(rx_buffer));
rx_counter=0;
USART_SENGSTR(TC35_CSMP);
do
p=strstr(rx_buffer,OK);
while(p==NULL);
memset(rx_buffer,'',sizeof(rx_buffer));
rx_counter=0;
USART_SENGSTR(TC35_CSCS);
do
p=strstr(rx_buffer,OK);
while(p==NULL);
memset(rx_buffer,'',sizeof(rx_buffer));
rx_counter=0;
}
/********************************************************************
函 数 名:TC35_SENDMESSAGE
入口参数:*TC35_Message
出口参数:无
建立日期:2008年5月10日
修改日期:
函数作用:TC35短消息发送
说 明:
********************************************************************/
void TC35_SENDMESSAGE(unsigned char *TC35_Message)
{
TC35_MESSAGEINIT();
USART_SENGSTR(TC35_CMGS);
do
p=strstr(rx_buffer,&OK1);
while(p==NULL);
memset(rx_buffer,'',sizeof(rx_buffer));
rx_counter=0;
USART_SENGSTR(TC35_Message);
USART_SENDCHAR(0x1A);
do
p=strstr(rx_buffer,OK);
while(p==NULL);
memset(rx_buffer,'',sizeof(rx_buffer));
rx_counter=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -