STC单片机与串口触摸屏通讯程序

10 篇文章 0 订阅
6 篇文章 0 订阅

/***串口1切换通讯测试,单片机发送数据给触摸屏***/
/***切换到3.0 3.1发送数据到串口通信软件    ***/
/***设置温度 加热时间读写EEPROM正确        ***/
              #include     <REG52.H>      //2023 3 5  L330 CODE2667
              #include     <intrins.H>    //发送到串口助手 触摸屏正确
              #include     "stdio.h"
              #include     "stdio.h"
              #include     <math.h>
              #include     <string.h>
              #define      uint unsigned int  
              #define      uchar unsigned char
              typedef      unsigned char   u8;
              #define      WT_12M   0x83         //IAP_CONTR
              #define      IAP_ADDRESS 0x0400    //EEPROM首地址
              sfr          IAP_TPS=0xF5;
              typedef      unsigned char BYTE;
              typedef      unsigned int WORD;
              sbit         SCK=P1^6;                  //P3.4口与SCK相连
              sbit         CS=P1^1;                   //P3.5口与CS相连
              sbit         SO=P1^0;                   //P3.6口与SO相连
              sbit         OUT1=P3^4;                 /****输出***/
              sbit         OUT2=P3^5;                 /****输出***/
              sbit         WARNING=P5^5;              /****输入***/
              sbit         INTPUT1=P5^4;              /****输入***/
              sbit         BP=P3^2;                   /***输出LED指示***/
              static       uint   i;                  //串口字节计数器
              uchar        Spray_Time;                //喷雾时间
              uchar        Delay_Time;                //加热时间
              uchar        kcounter,kstatus;          //按键计数标志 按键状态标志
              bit          Receive_Flag;              //串口数据缓冲接收标志
              bit          WARNING_Flag;              //低电平报警标志
              bit          S_Flag;                    //计时标志
              uint         WARNING_Time;              //报警计时计数器
              uint         DAT2=0;
              uint         val1,val2,val3;
              uchar        val5;                      //定时器计数器
              uint         Receive_Total;
              uint         a[10];                     //定义数组a 存储串口数据串
              uchar        s;                       
              uint         TEST;
              uint         set_temper;
              sbit         ledred=P5^4;                    //LU024N
              sbit         ledgreen=P3^3;               //LU024N
              sbit         ledwhite=P3^4;               //
              sbit         ledblack=P3^5;               //
              sbit         output=P1^1;                    //RED
/*---------------延时子程序----------------*/
              void delay1 (uint ms)
              {
              uint i,j;
              for(i=0;i<ms;i++)
              for(j=0;j<200;j++)
              ;
              }    
/*------------------延时子程序------------------------*/
              void delay10ms(uint x)
              {
               uint i, j;
               for (i=0;i<x;i++)
               for (j=0;j<500;j++);
              }
/*-----------延时100ms子程序12MHz --------*/
               void Delay_100ms(uint x)          //
               {
               uint i,j;
                for(i=0;i<x;i++)
                {
                for(j=0;j<18000;j++);
                }
               }
/****************按键计数器状态寄存器归零*************/
              void RstKey()
              {
              kcounter=0;                       //按键计数器归零
              kstatus=0;                        //状态寄存器归零
              }
/*****************按键低电平检测函数*****************/
              void   LowVoltKey(void)           //按键计数器状态标志加一
              {
              kcounter++;                       
              kstatus++;     
              _nop_();                         //延时                  
              }
/*****************按键高电平检测函数*****************/
              void    HighVoltKey(void)         //按键计数器加一 状态标志归零
              {
              kcounter++;                       //按键计数器加一
              kstatus=0;                        //按键状态标志归零
              _nop_();                          //延时
              }
/*----关闭IAP----------------------------*/
              void IapIdle()
              {
              IAP_CONTR=0;                       //关闭IAP功能     ISP/IAP 控制寄存器
              IAP_CMD=0;                         //清除命令寄存器
              IAP_TRIG=0;                        //清除触发寄存器
              IAP_ADDRH=0X80;                    //将地址设置到非IAP区域
              IAP_ADDRL=0;
              }
/*-从ISP/IAP/EEPROM区域读取一字节-*/
              char IapRead(int addr)
              {
              char dat;
              IAP_CONTR = 0x80;                            //使能IAP
              IAP_TPS = 12;                                //设置等待参数12MHz
              IAP_CMD = 1;                                 //设置IAP读命令
              IAP_ADDRL = addr;                            //设置IAP低地址
              IAP_ADDRH = addr >> 8;                       //设置IAP高地址
              IAP_TRIG = 0x5a;                             //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                             //写触发命令(0xa5)
              _nop_();
              dat = IAP_DATA;                              //读IAP数据
              IapIdle();                                   //关闭IAP功能
              return dat;
              }
/*********字节写*********************/
              void IapProgram(int addr, char dat)
              {
              IAP_CONTR = 0x80;                           //使能IAP
              IAP_TPS = 12;                               //设置等待参数12MHz
              IAP_CMD = 2;                                //设置IAP写命令
              IAP_ADDRL = addr;                           //设置IAP低地址
              IAP_ADDRH = addr >> 8;                      //设置IAP高地址
              IAP_DATA = dat;                             //写IAP数据
              IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
              _nop_();
              IapIdle();                                  //关闭IAP功能
              }
/*---扇区擦除---------------*/
              void IapErase(int addr)
              {
              IAP_CONTR = 0x80;                           //使能IAP
              IAP_TPS = 12;                               //设置等待参数12MHz
              IAP_CMD = 3;                                //设置IAP擦除命令
              IAP_ADDRL = addr;                           //设置IAP低地址
              IAP_ADDRH = addr >> 8;                      //设置IAP高地址
              IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
              _nop_();                                    //
              IapIdle();                                  //关闭IAP功能
              }
/*************写参数到EEPROM*******************************/
              void Write_EEprom()
              {
               IapErase(IAP_ADDRESS); //扇区擦除
               IapProgram(IAP_ADDRESS+1,set_temper>>8&0XFF);/*设定温度高八位*/   
               IapProgram(IAP_ADDRESS+2,set_temper&0x00FF);/*设定温度低八位*/
               IapProgram(IAP_ADDRESS+3,TEST>>8&0XFF);/*加热时间高八位*/  
               IapProgram(IAP_ADDRESS+4,TEST&0x00FF);/*加热时间低八位*/
              }
/***********************************/
              void red_eeprom(void)
              {
              uint m,n;         
              m=IapRead(IAP_ADDRESS+1);          //设定温度高八位
              n=IapRead(IAP_ADDRESS+2);          //设定温度低八位
              set_temper=(m*256+n)&0X7FFF;               //设定温度 屏蔽最高负位 111 1111
              m=IapRead(IAP_ADDRESS+3);          //加热时间高八位
              n=IapRead(IAP_ADDRESS+4);          //加热时间低八位
              TEST=(m*256+n)&0X7FFF;                     //加热时间  屏蔽最高负位 111 1111
              }                           
/******************************************************/
              void serve_T0() interrupt 1 using 1
              {
               TH0=0x2f;
               TL0=0x40;
               val5++;
               if(val5>=100)
               {
               val5=0;
          //     ledgreen=~ledgreen;
               S_Flag=1;
               }
              }
 /*------------初始化串口---------------------*/
              void InitUart()
              {
              SCON=0X50;                         //8位数据,可变波特率
              AUXR|=0x01;                        //串口1选择定时器2为波特率发生器
              AUXR|=0X04;                        //定时器2时钟为Fosc,即1T
              T2L=0XE0;                          //设置定时器处置  110592》9600
              T2H=0XFE;                          //设置定时器处置  110592》9600
              AUXR|=0X10;                        //启动定时器2
              TI=1;
              ES=1;                        //
              EA=1;
              }
/*--------UART中断服务程序---串口4接收触摸屏数据---*/
              void Uart() interrupt 4 using 1
              {
               if(RI)
               {
                Receive_Total++;
                a[i]=SBUF;                       //数组下标位置的数据等于SBUF
                i++;
                if(i==9)                         //触摸屏结束码    FRAMELENGTH
                {
                 Receive_Flag=1;                     //接收数据标志置一
                                 ledblack=~ledblack;   
                 }
                RI=0;                             //
               }
              }
/**************串口发送*****************************/
              void Send(uchar temp)
              {
              unsigned serial;
              serial=temp;
              SBUF=(uchar)temp;
              while(TI!=1);
              TI=0;
              }
/*------------------主循环程序----------------*/      
              void   main( )                     /*主程序开始*/
              {                                  /**加一**/
              P0M0 = 0x00;
              P0M1 = 0x00;
              P3M0 = 0x00;
              P3M1 = 0x00;
              P5M0 = 0x00;
              P5M1 = 0x00;
              AUXR=0X80;                         //STC系列的1T 设置
              val5=0;
              i=0;                             //数组计数器归零
              Receive_Total=0;
              TH0=0x2f;
              TL0=0x40;                             //ledred=P5^4;
              ET0=1;                             //使能定时器中
              TR0=1;                             //启动定时器
              BP=1;  
              delay1(2000);
              BP=0;
              delay1(2000);
              BP=1;  
              delay1(2000);
              BP=0;
              delay1(2000);
              BP=1;  
              delay1(2000);
              BP=0;
              red_eeprom();
              InitUart();                        //初始化串口
              P_SW1=0x40;                        //RXD_2/P3.6, TXD_2/P3.7
              delay10ms(100);
              printf("XFF,XFF,XFF");          //向串口屏发启动信号
              delay1(20);
              printf("t3.txt=\"系统启动\"" );    //    
              printf("0XFF,0XFF,0XFF");          //向串口屏发启动信号
              delay10ms(100);
              printf("t3.txt=\"系统启动\"" );    //    
              printf("XFF,XFF,XFF");          //向串口屏发启动信号
              delay10ms(50);
              val1=0x40;
              printf("n0.val=%d\xff\xff\xff",set_temper);
              printf("n0.val=%d\xff\xff\xff",set_temper);     //设定温度
              val2=0x90;
              printf("n2.val=%d\xff\xff\xff",TEST);     //加热计时
              delay1(20);
              Receive_Flag=0;                     //接收数据标志置零
              S_Flag=0;                             //秒计时标志
              ET0=1;
              TR0=1;
              WARNING_Time=0;                          //报警计时计数器
              WARNING_Flag=0;                          //低电平报警标志
              while(1)
              {
              // ledred=~ledred;
               ledwhite=1;
               printf("n3.val=%d\xff\xff\xff",Receive_Total);     //测试
               delay10ms(200);
               if(Receive_Flag==1)
                {
                 i=0;                             //数组计数器归零
                 ledred=0;
                 Receive_Flag=0;
                 if (a[0]==0X55&&a[1]==0X01)                     //
                 {
                 set_temper=a[3]*256+a[2];             //温度
                 Write_EEprom();
                 }
                 else if (a[0]==0X55&&a[1]==0X02)    //时间
                 {
                 TEST=a[3]*256+a[2];             //喷雾时间
                 Write_EEprom();
                 }
                  InitUart();                        //初始化串口
                  P_SW1=0x00;               //RXD/P3.0, TXD/P3.1
                  delay10ms(200);
                  Send(a[0]);
                  Send(a[0]);
                  Send(a[1]);
                  Send(a[2]);
                  Send(a[3]);
                  Send(a[4]);
                  Send(a[5]);
                  Send(a[6]);
                  Send(a[7]);
                  Send(a[8]);
                  Delay_100ms(100);
                  InitUart();                        //初始化串口
                  P_SW1=0x40;                        //RXD_2/P3.6, TXD_2/P3.7
                  Delay_100ms(100);
                  ledred=1;
                  DAT2=a[0];
                  printf("n4.val=%d\xff\xff\xff",DAT2);
                  DAT2=a[1];
                  printf("n5.val=%d\xff\xff\xff",DAT2);
                  DAT2=a[2];
                  printf("n6.val=%d\xff\xff\xff",DAT2);
                  DAT2=a[3];
                  printf("n7.val=%d\xff\xff\xff",DAT2);
                  DAT2=a[4];
                  printf("n8.val=%d\xff\xff\xff",DAT2);
                  DAT2=a[5];
                  printf("n9.val=%d\xff\xff\xff",DAT2);
                  DAT2=a[6];
                  printf("n10.val=%d\xff\xff\xff",DAT2);
                  DAT2=a[7];
                  printf("n11.val=%d\xff\xff\xff",DAT2);
                  DAT2=a[8];
                  printf("n12.val=%d\xff\xff\xff",DAT2);
                }    
                ledwhite=0;
                delay10ms(200);     //等待上一个数据发送完成
                RstKey();
                LowVoltKey();
                HighVoltKey();
               }
              }                                     //2023 3 5  L330 CODE2667

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值