单片机AD转换后将值串口发送到触摸屏 本文介绍了一个基于STC单片机的串口屏下位机测试程序主要实现AD转换并通过串口将数据传输到触摸屏显示。程序使用STC12系列单片机通过P1.2口进行AD采样并将转换结果通过串口发送至触摸屏控件。系统包含多个IO控制功能如模板升降、指示灯控制等采用9600bps波特率进行串口通信。AD转换采用540个时钟周期通过ADC_RES和ADC_RESL寄存器组合获取10位精度数据。主循环中持续采集AD值并通过printf函数格式化输出至串口数据格式为n1.valxxx的指令协议供触摸屏解析显示。程序包含初始化、延时、LED状态控制等辅助功能模块实现了稳定的数据采集与传输功能。/***串口屏下位机测试数据传送到控件程序PAST 2020 5 3***//***单片机AD转换后将值串口发送到触摸屏L132CODE1496****/#include REG52.H#include intrins.H#include stdio.h#define uint unsigned int#define uchar unsigned charsfr P1ASF0x9D; //P1口第2功能控制寄存器#define ADC_SPEEDLL 0x00 //540个时钟int ADvalue; //存放AD转换返回的结果sbit OUT1P1^0; /****输出***/sbit OUT2P1^1; /****输出***/sbit Table_UpP1^3; /****模板上升***/sbit Table_DownP1^4; /****模板下降***/sbit Press_OpenP1^5; /****模板下降***/sbit Red_DisplayP1^6; /****红色指示***/sbit Green_DisplayP1^7; /****红色指示***/sbit Yellow_DisplayP5^4; /****黄色指示***/void delay(uint k); /****延时****/uchar DAT20;bit Receive_Flag;/*------------------------------------------*/void delay(uint t){uint i,j;for(i0;it;i)for(j0;j10;j);}/*---------------延时子程序----------------*/void delay1 (uint ms){uint i,j;for(i0;ims;i)for(j0;j2000;j);}/******************************************/void DisLed(){OUT10; /****输出***/OUT20; /****输出***/Table_Up0; /****模板上升***/Table_Down0; /****模板下降***/Press_Open0; /****模板下降***/Red_Display0; /****红色指示***/Green_Display0; /****红色指示***/Yellow_Display0; /****黄色指示***/}/******************************************/void Clear_Led(){OUT11; /****输出***/OUT21; /****输出***/Table_Up1; /****模板上升***/Table_Down1; /****模板下降***/Press_Open1; /****模板下降***/Red_Display1; /****红色指示***/Green_Display1; /****红色指示***/Yellow_Display1; /****黄色指示***/}/*****************************************/uint ADC_P12() //{uint i;uchar status0; //AD转换结束标志uint AD_Dat0; //10位AD转换值ADC_CONTR|0X80; //打开ADC转换电源第一次使用时要打开内部电源for(i0;i10000;i) //等待电源稳定1msP1ASF|0X08; //0000 1000ADC_CONTR0XE2; //1110 0010 P1.2for(i0;i1000;i) //如果多通道测量更换通道后延时200usADC_CONTR|0X08; //启动AD转换while(status0) //等待AD转换结束{statusADC_CONTR0X10; //判断ADC_FLAG是否等于1}ADC_CONTR0XE7; //将ADC_FLAG清零AD_Dat(ADC_RES2)|(ADC_RESL0X03); //return AD_Dat; //}/*------------初始化串口---------------------*/void InitUart(){SCON0X50; //8位数据可变波特率AUXR|0x01; //串口1选择定时器2为波特率发生器AUXR|0X04; //定时器2时钟为Fosc即1TT2L0XE0; //设置定时器处置 110592》9600T2H0XFE; //设置定时器处置 110592》9600AUXR|0X10; //启动定时器2TI1;ES1; //EA1;}/*--------UART 中断服务程序----BuffSBUF---------------*/void Uart() interrupt 4 using 1{if(RI){DAT2SBUF; //数组下标位置的数据等于jRI0; //Receive_Flag1; //接收数据标志置一}}/*------------------主循环程序----------------*/void main( ) /*主程序开始*/{int MyData11298;AUXR0X80; //STC系列的1T 设置TMOD0X01;P_SW10x00; //RXD/P3.0, TXD/P3.1Receive_Flag0;InitUart(); //初始化串口delay(100);DisLed();delay1(100);Clear_Led();delay1(100);DisLed();delay1(100);Clear_Led();while(1){OUT10; /****输出***/OUT20; /****输出***/ADvalueADC_P12(); //采样P1.1口模拟输入电压 9根据输入电压芯片电压测试得出delay1(200);OUT11; /****输出***/OUT21; /****输出***/printf(n1.val%d\xff\xff\xff,ADvalue); //}}********************单片机串口发送******************************#include REG51.H#include intrins.h#include absacc.h#include uart.hsfr P3M0 0xb1;sfr P3M1 0xb2;/*******************测试单片机STC12LE5A60S2******************************//*******************晶振 33MHz*******************************************//**************************************************************************- 功能描述51单片机的串口初始化- 隶属模块STC51串口操作- 函数属性外部使用户使用- 参数说明无- 返回说明无**************************************************************************/void UART_Init(){PCON|0x00; //PCON的最高位SMOD1时波特率加倍TMOD0x20; //时器1为方式2 初值自动装入 产生波特率TH10xf7; //定时器初始为0XF7晶振为33MHz本函数实际产生的波特率为9600bpsTL10xf7; //同上 f7SCON0x50; //串口设置为方式1,REN1,允许接收TR11; //启动定时器1ES1; //使能串口接收中断// EA1; //打开所有中断}/**************************************************************************- 功能描述51单片机的串口发送字节的函数- 隶属模块STC51串口操作- 函数属性外部使用户使用- 参数说明mydata:要发送的一个字节- 返回说明无- 注发送一个字节是串口发送的基础操作**************************************************************************/void UART_Send_Byte(unsigned char mydata){ES0;TI0;SBUFmydata;while(!TI);TI0;ES1;}/**************************************************************************- 功能描述51单片机的串口发送字符串- 隶属模块STC51串口操作- 函数属性外部使用户使用- 参数说明s:指向字符串的指针- 返回说明无**************************************************************************/void UART_Send_Str(char *s){int i0;while(s[i]!0){UART_Send_Byte(s[i]);i;}}void UART_Send_END(void){UART_Send_Byte(0xFF);UART_Send_Byte(0xFF);UART_Send_Byte(0xFF);}void delayms(int count) // /* X1ms */{int i,j;for(i0;icount;i)for(j0;j2000;j);}void main(void){P3M0 ~0X02;P3M1|0X02; //TX强上拉UART_Init(); //初始化串口板上的晶振为33MHz实际的波特率为9600bpsdelayms(80);//等待屏幕初始化,建议50ms以上UART_Send_END();//发送一次结束符清除上电产生的串口杂波数据while(1){UART_Send_Str(cls BLACK);//发控制指令UART_Send_END(); //发结束符delayms(2000);UART_Send_Str(cls RED);UART_Send_END();delayms(2000);UART_Send_Str(page 4);UART_Send_END();UART_Send_Str(t0.txt\春风不度玉门关\);UART_Send_END();UART_Send_Str(xstr 0,0,40,40,0,RED,BLACK,1,1,1,\中国\);//不建议使用这种指令去显示汉字建议在上位机上输入你要显示的汉字UART_Send_END();delayms(2000);}}