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智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于