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

相关文章

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

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

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