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

📄 mega16l_tc__.c

📁 基于51单片机/GSM模块西门子tc35i的远程控制源程序
💻 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 + -