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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用JDK自带工具进行JVM内存分析之旅

进行jvm内存分析可以排查存在和潜在的问题。 通过借助jdk自带的常用工具&#xff0c;可以分析大概可能的问题定位以及确定优化方向。 JVM内存分析有很多好处。 内存泄漏排查&#xff1a;JVM 内存泄漏是指应用程序中的对象占用的内存无法被垃圾回收器释放&#xff0c;导致内存…

遥瞻智慧:排水系统远程监控的卓越解决方案

遥瞻智慧&#xff1a;排水系统远程监控的卓越解决方案 在城市脉络的深层肌理中&#xff0c;排水系统犹如一条条隐秘的生命线&#xff0c;默默承载着城市的呼吸与律动。然而&#xff0c;如何以科技之眼&#xff0c;赋予这些无形网络以实时感知、精准调控的能力&#xff0c;使之…

基于机器学习的车辆状态异常检测

基于马氏距离的车辆状态异常检测&#xff08;单一传感器&#xff09; 基于多元自动编码器的车辆状态异常检测 基于单传感器平滑马氏距离的车辆状态异常检测 工学博士&#xff0c;担任《Mechanical System and Signal Processing》等期刊审稿专家&#xff0c;擅长领域&#xff1…

数据分析场景,连号相关业务

连号相关业务 业务场景&#xff1a;现在需要从a列一堆编号中&#xff0c;将连号范围在10以内的数据分别分成一组。 先看实先效果 演示的为db2数据库&#xff0c;需要含有窗口函数&#xff0c;或者可以获取到当前数据偏移的上一位数据 第一步&#xff1a;将A列数据正序第二步…

量子密钥分发系统的设计与实现(三):量子信号的产生、调制及探测技术讨论

之前的文章我们对量子密钥分发系统功能的光路子系统进行了较为全面的分析&#xff0c;我们理解了光路子系统是量子密钥分发系统的基础。本文我们主要探讨下量子信号产生、调制及探测的基础技术&#xff0c;算是一篇承上启下的文章吧&#xff0c;对相关的原理进行探讨&#xff0…

如何使用 ArcGIS Pro 制作边界晕渲效果

在某些出版的地图中&#xff0c;边界有类似于“发光”的晕渲效果&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 制作这种晕渲效果&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的行政区划数据&#xff0c;除了行政区划数据&#xff0c…

wsl2 Ubuntu子系统内存只有一半的解决办法

物理机的内存是64G&#xff0c;在wsl2安装完Ubuntu20.04后&#xff0c;输入命令&#xff1a; free -g 发现只有32G&#xff0c;原因是默认只能获得物理机一半的内存&#xff1a; WSL 中的高级设置配置 | Microsoft Learn 因此可手动修改为与物理机同等大小&#xff1a; 1&a…

如何解决DDoS攻击?群联科技做出回答。

DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;是一种恶意利用多台傀儡机协同发起大规模网络流量&#xff0c;旨在压垮目标系统或网络资源&#xff0c;使其无法正常服务的网络攻击手段。由于现代计算机和网络性能的提升&#xff0c;单点发起的DoS攻击已难以奏效&#xff…

Day01——NestJS学习之了解、安装、运行

什么是 Nest.js&#xff1f; NestJs 官方简介: Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#x…

数据仓库作业五:第8章 关联规则挖掘

目录 第8章 关联规则挖掘作业题 第8章 关联规则挖掘 作业题 1、设4-项集 X { a , b , c , d } X\{a,b,c,d\} X{a,b,c,d}&#xff0c;试求出由 X X X 导出的所有关联规则。 解&#xff1a; 首先生成项集的所有非空真子集。这包括&#xff1a; { a } , { b } , { c } , {…

ansible执行mysql脚本

目录 概述实践环境要求ansible yml脚本命令离线包 概述 ansible执行mysql脚本 实践 官网文档 环境要求 环境需要安装以下内容: 1.mysql客户端(安装了mysql即会有)2.安装MySQL-python (Python 2.X) 详细插件安装链接 ansible yml脚本 关键代码如下&#xff1a; # 剧本…

ROS2学习笔记(一) 基本概念

1. Node 节点 节点: 完成具体功能的模块 相关命令 #运行命令 ros2 run <package_name> <executable_name>#当前节点查询查询 ros2 node list#重映射 Remapping ros2 run <package_name> <executable_name> --ros-args --remap __node:<node_na…

KaiwuDB CTO 魏可伟:AIoT,用行业定义数据库

4月12日&#xff0c;由中国 DBA 联盟&#xff08;ACDU&#xff09;与墨天轮社区联合主办的第十三届数据技术嘉年华&#xff08;DTC 2024&#xff09;于北京盛大召开。KaiwuDB CTO 魏可伟受邀发表《智创当下&#xff0c;KaiwuDB 从多模到 AI 的探索实践》主题演讲&#xff0c;向…

Axure如何实现限制选择项数量的交互

大家经常会看到这样的功能设计&#xff1a;可以多选&#xff0c;但是限制多选。比如某招聘网站城市的选择只能选择5个。再选择第6个的时候会提示最多只能选择5项。 这个效果是我们经常会遇到的&#xff0c;在工作中也经常会遇到需要制作这样的效果。今天我们一起来看看&#xf…

Mac M3 安装Ollama和llama3,本地部署LobeChat和刘皇叔聊三国!

OllamaLobeChat&#xff0c;本地部署聊天助手 Ollama安装下载OllamaOllama常用指令和链接运行OllamaAPI 交互Ollama基于Llama 3角色扮演 LobeChat安装首先安装docker安装LobeChat的docker 镜像和运行 Ollama安装 下载Ollama 网址&#xff1a;https://ollama.com/ 支持macOS、…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备&#xff0c;实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息&#xff0c;为了保障车辆及运输人员 的安全&#xff0c;应合理选择摄录设…

LeetCode 349.两个数组的交集(HashSet的使用)

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums1 …

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

学习大数据的第一天

今天学习如何安装hapood安装 1.安装hapood安装 2.需要的资料 3.开始安装 1.创建目录 mkdir -p /export/server 2.进入目录下 cd /export/server/ 3.安装 安装需要的依赖 yum install gcc gcc-c make autoconf automake libtool curl lzo-devel zlib-devel openssl opens…

安装SSL证书之后还会有不安全提示怎么办?

安装SSL证书过程中如果遇到错误&#xff0c;不要慌&#xff0c;按照以下步骤进行排查和解决&#xff1a; 1. 仔细阅读错误信息&#xff1a; - 错误消息通常会明确指出问题所在&#xff0c;如证书过期、证书链不完整、域名不匹配等。记下或截图保存具体的错误代码和描述&#xf…