找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2156|回复: 0
打印 上一主题 下一主题
收起左侧

我想做个无线双向通信,仿真出来了,程序不太懂 改,谁能帮个忙啊

[复制链接]
跳转到指定楼层
楼主
ID:109572 发表于 2016-5-24 19:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long  uint32;
typedef char int8;
typedef int int16;
typedef long int32;
// LCD1602
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit BUSY = P0^7;
// KEYS
sbit Key1 = P3^4;
sbit Key2 = P3^5;
sbit Key3 = P3^6;
sbit Key4 = P3^7;
sbit BUZZ = P1^2; //BUZZER
//LED
sbit LED1 = P1^0;
#define KEY_DELAY 5 // 按键扫描延时
//键值
#define K_ALARM        1
#define K_TL        2
#define K_ADD        3
#define K_SUB        4
sfr DBPort  = 0x80;     //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

/********     1602函数声明     ********/
void LCD_Initial();
void GotoXY(unsigned char x, unsigned char y);
void Print(unsigned char *str);
void LCD_Write(bit style, unsigned char input);


//1602程序


//内部等待函数**************************************************************
unsigned char LCD_Wait(void)
{
    RS=0;
    RW=1;    _nop_();
    E=1;    _nop_();           
    E=0;
    return DBPort;  
}
//向LCD写入命令或数据********************************************************
#define LCD_COMMAND         0      // Command
#define LCD_DATA            1      // Data
#define LCD_CLEAR_SCREEN    0x01      // 清屏
#define LCD_HOMING          0x02      // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
    E=0;
    RS=style;
    RW=0;        _nop_();
    DBPort=input;   _nop_();//注意顺序
    E=1;        _nop_();//注意顺序
    E=0;        _nop_();
    LCD_Wait();
}

//设置显示模式************************************************************
#define LCD_SHOW            0x04    //显示开
#define LCD_HIDE            0x00    //显示关

#define LCD_CURSOR          0x02    //显示光标
#define LCD_NO_CURSOR       0x00    //无光标        

#define LCD_FLASH           0x01    //光标闪动
#define LCD_NO_FLASH        0x00    //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)
{
    LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}

//设置输入模式************************************************************
#define LCD_AC_UP       0x02
#define LCD_AC_DOWN         0x00      // default

#define LCD_MOVE            0x01      // 画面可平移
#define LCD_NO_MOVE         0x00      //default

void LCD_SetInput(unsigned char InputMode)
{
    LCD_Write(LCD_COMMAND, 0x04|InputMode);
}

//初始化LCD************************************************************
void LCD_Initial()
{
    E=0;
    LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
    LCD_Write(LCD_COMMAND,0x38);
    LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
    LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
}

//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
    if(y==0)
        LCD_Write(LCD_COMMAND,0x80|x);
    if(y==1)
        LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}

//将字符输出到液晶显示
void Print(unsigned char *str)
{
    while(*str!='\0')
    {
        LCD_Write(LCD_DATA,*str);
        str++;
    }
}



void rece_init(void)
{   EA=1;    /*CPU开放所有中断*/
    ES=1;   /*允许串行口中断*/
    TMOD=0x20; /*定时器/计时器T1为定时器模式,工作于方式2*/
    TH1=0xfd; /*向T1置初值*/
    TL1=0xfd;
    PCON=0x00; /*SMOD=0*/
    SCON=0x50; /*数据串行传输工作于方式1,波特率9600bit/s,允许接收*/
    TR1=1;/*启动定时器T1*/
  }               




receive(void)
{        while(!RI);                 /*等待等待数据接受*/
        RI=0;
        return SBUF;
}


   // 远程温湿度控制
uint32 Count=0;
uint8 Rev_dat[16]=0, Alarm=0, Tl=0;
int8 k_val=0,Top=40, Low=10;
void delay(uint16 n)
{        while (n--);
}
void delay_ms(uint16 m)
{   uint16 n;
        for (; m>0; m--)
                for (n=125; n>0; n--);
}


void main()
{
        unsigned char error;                    //用于检验是否出现错误
        unsigned char checksum;                        //CRC                         
        uchar TEMP1[7];                                         //用于记录温度
        uchar HUMI1[6];                                         //用于记录湿度
       
        delay_ms(500);                    // 上电延时                                 
        LCD_Initial();                                           //初始化液晶                  
           GotoXY(0,0);                                           //选择温度显示位置
           Print("Temp:      C");                           //5格空格
        GotoXY(0,1);                                           //选择湿度显示位置
           Print("Humi:     %RH");                           //5格空格

  Rev_dat[0]=receive();



                  GotoXY(5,0);                                                //设置温度显示位置
                      TEMP1[0]= Rev_dat[0]/1000+'0';                     //温度百位
                        if (TEMP1[0]==0x30) TEMP1[0]=0x20;
                        TEMP1[1]= Rev_dat[0]%1000/100+'0';             //温度十位       
                        if (TEMP1[1]==0x30 && TEMP1[0]!=0x30) TEMP1[1]=0x20;
                           TEMP1[2]= Rev_dat[0]%100/10+'0';                        //温度个位
                      TEMP1[3]=0x2e;                                                //小数点
                           TEMP1[4]= Rev_dat[0]%10+'0';                                //温度小数点后第一位               
                        TEMP1[5]=0xdf;                                                //显示温度符号℃
                        Print(TEMP1);                                                //输出温度                     
                    GotoXY(5,1);                                                //设置湿度显示位置                                         
                        HUMI1[0]= Rev_dat[0]/1000+'0';                     //湿度百位
                      if (HUMI1[0]==0x30) HUMI1[0]=0x20;
                        HUMI1[1]= Rev_dat[0]%1000/100+'0';             //湿度十位       
                           if (HUMI1[1]==0x30 && HUMI1[0]!=0x30) HUMI1[1]=0X20;  
                            HUMI1[2]= Rev_dat[0]%100/10+'0';                        //湿度个位
                      HUMI1[3]=0x2E;                                                //小数点
                               HUMI1[4]= Rev_dat[0]%10+'0';                                //湿度小数点后第一位       
                        Print(HUMI1);                                                //输出湿度          

                delay(800);                             //等待足够长的时间,以进行下一次转换                    

}




发送部分发出温湿度,帮忙加个报警系统,和怎么在1602显示屏显示

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表