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