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

2024-04-20 19:04

本文主要是介绍STC单片机与串口触摸屏通讯程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/***串口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

这篇关于STC单片机与串口触摸屏通讯程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921069

相关文章

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T