不能实时显示探测结果,求大神赐教;
- #include <reg52.h>
- #include <intrins.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar AD_DATA[1]; //保存IN0通道转换后的数据
- uchar addata0;
- uchar addata1;
- /********************adc0809端口定义*******************/
- #define adc0809_data P2// ADC0809模块的D0-D7分别接P2.0-P2.7
- sbit STR=P0^0; //单片机P0.0接模块STR引脚, 启动转换信号
- sbit EOC=P0^1; //单片机P0.1接模块EOC, 转换结束信号,高电平有效
- sbit OE=P0^2; //单片机P0.2接模块OE,输出允许信号,高电平有效
- sbit CLK=P0^3; //单片机P0.3接CLK ,ADC0809时钟,输入50-800KHZ的频率
- sbit ADD_A=P0^4;
- sbit ADD_B=P0^5; //定义地址线
- sbit ADD_C=P0^6;
- /******************************************************/
- /*******************lcd1602端口定义********************/
- #define LCM_Data P1 //LCD1602数据接口
- #define Busy 0x80 //用于检测LCM状态字中的Busy标识
- sbit LCM_RW = P3^3; //读写控制输入端,LCD1602的第五脚
- sbit LCM_RS = P3^4; //寄存器选择输入端,LCD1602的第四脚
- sbit LCM_E = P3^2; //使能信号输入端,LCD1602的第6脚
- /******************************************************/
- /*******************存储模块端口定义*******************/
- sbit P1_0 = P3^5;//busy忙标志管脚
- sbit P1_5 = P3^6 ;//测试板信号指示(指示发送数据)
- /******************************************************/
- /*******************函数声明***************************/
- void WriteDataLCM (uchar WDLCM);//LCD模块写数据
- void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令
- uchar ReadStatusLCM(void);//读LCD模块的忙标
- void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
- void LCMInit(void);//LCD初始
- void delayms(uint ms);//1MS基准延时程序
- void delay(uchar i); //延时函数2
- void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);
- void judge_xianshi(void);//显示处理程序
- void init();//系统初始化设置
- void AD();//读取AD数据
- void Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/);
- void SD();
- uchar flag1;
- /******************************************************/
- /*******************系统初始化*************************/
- void init()
- {
- EA=1; //开总中断
- TMOD=0x02; //设定定时器 T0工作方式
- TH0=216; //利用T0中断产生CLK信号
- TL0=216;
- TR0=1; //启动定时器T0
- ET0=1;
- STR=0;
- OE=0;
- }
- /******************************************************/
- /******************adc0809*****************************/
- void AD()
- {
- STR=1;//ADDR这样如果不是通道0,可以在这边加一条其他地址的程序
- delay(10);
- ADD_A=0;
- ADD_B=0;
- ADD_C=0;
- delay(10);
- STR=0;
- delay(10);
- STR=1; //启动AD转换
- delay(10);
- STR=0;
- while(0==EOC);//等待转换结束
- OE=1;
- AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255
- OE=0;
- delay(10);
- }
- /******************************************************/
- /********************lcd1602***************************/
- void judge_xianshi()
- {
- addata0=255/AD_DATA[0]/1*10;//把数据扩大10,为下面求取小数位后1位做准备
- DisplayListChar(0,0,0, "R="); //在液晶的第二行第0位开始显示"R="
- DisplayOneChar(0,2, addata0/100000+0x30); //显示AD数据的万位
- DisplayOneChar(0,3, addata0/10000%10+0x30);//显示AD数据的千位
- DisplayOneChar(0,4, addata0/1000%10+0x30);//显示AD数据的百位
- DisplayOneChar(0,5, addata0/100%10+0x30);//显示AD数据的十位
- DisplayOneChar(0,6, addata0/10%10+0x30);//显示AD数据的十位
- DisplayListChar(0,7,0, ".");
- DisplayOneChar(0,8, addata0%10+0x30);
- DisplayListChar(0,9,0, "v");
- DisplayListChar(0,10,0, "/");
- DisplayListChar(0,11,0, "a");
- addata1=AD_DATA[0]*5/51/1*10;//把数据扩大10,为下面求取小数位后1位做准备
- DisplayListChar(1,0,0, "P="); //在液晶的第二行第8位开始显示"P="
- DisplayOneChar(1,2, addata1/100000+0x30); //显示AD数据的万位
- DisplayOneChar(1,3, addata1/10000%10+0x30);//显示AD数据的千位
- DisplayOneChar(1,4, addata1/1000%10+0x30);//显示AD数据的百位
- DisplayOneChar(1,5, addata1/100%10+0x30);//显示AD数据的十位
- DisplayOneChar(1,6, addata1/10%10+0x30);//显示AD数据的各位
- DisplayListChar(1,7,0, ".");
- DisplayOneChar(1,8, addata1%10+0x30);
- DisplayListChar(1,10,0, "w");
- }
- /***********************中断***************************/
- void t0(void) interrupt 1 using 0
- {
- CLK=~CLK;
- }
- /******************************************************/
- void DisplayListChar(uchar X,uchar Y,uchar ms, uchar code *DData)
- {
- unsigned char ListLength;
- ListLength = 0;
- X&=0x1;
- Y&=0xF; //限制X不能大于15,Y不能大于1
- while (DData[ListLength]!='\0') //若到达字串尾则退出
- {
- if (Y <= 0xF) //X坐标应小于0xF
- {
- DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
- ListLength++;
- Y++;
- delayms(ms);//延时显示字符串
- }
- else
- break;//跳出循环体
- }
- }
- void LCMInit(void)
- {
- LCM_Data = 0;
- WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
- delayms(5);
- WriteCommandLCM(0x38,0);
- delayms(5);
- WriteCommandLCM(0x38,0);
- delayms(5);
- WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
- WriteCommandLCM(0x08,1); //关闭显示
- WriteCommandLCM(0x01,1); //显示清屏
- WriteCommandLCM(0x06,1); // 显示光标移动设置
- WriteCommandLCM(0x0C,1); // 显示开及光标设置
- delayms(100);
- }
- void WriteDataLCM(uchar WDLCM)
- {
- ReadStatusLCM(); //检测忙
- LCM_Data = WDLCM;
- LCM_RS = 1;
- LCM_RW = 0;
- LCM_E = 0; //若晶振速度太高可以在这后加小的延时
- LCM_E = 0; //延时
- LCM_E = 1;
- }
- void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测
- {
- if (BuysC) ReadStatusLCM(); //根据需要检测忙
- LCM_Data = WCLCM;
- LCM_RS = 0;
- LCM_RW = 0;
- LCM_E = 0;
- LCM_E = 0;
- LCM_E = 1;
- }
- uchar ReadStatusLCM(void)
- {
- LCM_Data = 0xFF;
- LCM_RS = 0;
- LCM_RW = 1;
- LCM_E = 0;
- LCM_E = 0;
- LCM_E = 1;
- while (LCM_Data & Busy); //检测忙信号
- return(LCM_Data);
- }
- void DisplayOneChar( uchar X, uchar Y, uchar ASCII)
- {
- X&=0x1;
- Y&=0xF; //限制Y不能大于15,X不能大于1
- if(X)Y|=0x40; //当要显示第二行时地址码+0x40;
- Y|=0x80; // 算出指令码
- WriteCommandLCM(Y, 0); //这里不检测忙信号,发送地址码
- WriteDataLCM(ASCII);
- }
- /******************************************************/
- /********************延迟函数**************************/
- void delayms(uint Ms)
- {
- uint i,TempCyc;
- for(i=0;i<Ms;i++)
- {
- TempCyc =70;
- while(TempCyc--);
- }
- }
- void delay(uchar i)
- {
- uchar j;
- while(i--)
- {
- for(j=125;j>0;j--);
- }
- }
- /******************************************************/
- /*******************存储模块***************************/
- uchar date_temp[50]={0};//获取系统状态
- code uchar top[]={" 单位:西安工业大学"};//获取系统状态,22
- code uchar item[]={"电阻(Ω) 功率(W) 工作状态"};//获取系统状态,31
- uchar D_date[]={"10000.0 10000.0 正常"};//定义数据格式,28
- void Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/);
- unsigned char a;
- unsigned char addata0;
- unsigned char addata1;
- unsigned char r;
- unsigned char p;
- void CUNCHU (void)
- {
- SCON = 0x50; //0101,0000 串口方式1,允许接收,无奇偶校验位
- TMOD = 0x20; //0010,0000 时器1,定时方式2 自动重装装计数器
- PCON = 0x80; //SMOD=1
- TL1 = 0xfd;
- TH1 = 0xfd;
- TR1 = 1;
- P1_0 = 1;
- delay(2000);
- //写标题
- while(P1_0);
- memcpy(date_temp,top,22);
- Send_UART(22,date_temp);
- //写条目
- while(P1_0);
- memcpy(date_temp,item,31);
- Send_UART(31,date_temp);
-
- while(1)
- {
- r=addata0;
- p=addata1;
- D_date[1] =r/100000%10+'0';
- D_date[2] =r/10000%10+'0';
- D_date[3] =r/1000%10+'0';
- D_date[4] =r/100%10+'0';
- D_date[5] =r/10%10+'0';
- D_date[6] ='.';
- D_date[7] =r%10+'0';
- D_date[12]=p/100000%10+'0';
- D_date[13]=p/10000%10+'0';
- D_date[14]=p/1000%10+'0';
- D_date[15]=p/100%10+'0';
- D_date[16]=p/10%10+'0';
- D_date[17]='.';
- D_date[18]=p%10+'0';
- delay(50);
- memcpy(date_temp,D_date,28);
- Send_UART(28,date_temp);
- delay(50);
- }
- }
- void Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/)
- {
- unsigned int i=0;
- while(i<num)
- {
- TI = 0; //清零串口发送完成中断请求标志
- SBUF = Date_OUT[i]; //date[i]
- while(TI ==0); //等待发送完成
- TI = 0; //清零串口发送完成中断请求标志
- i++;
- }
- //WINDOWS里的是 13 + 10(ASCII码值)作为换行
- //-----------------------------------------------发送换行符0x0D
- SBUF = 0x0d;
- while(TI ==0); //等待发送完成
- TI = 0; //清零串口发送完成中断请求标志
- //-----------------------------------------------发送换行符0x0a
- SBUF = 0x0a;
- while(TI ==0); //等待发送完成
- TI = 0; //清零串口发送完成中断请求标志
- }
- /******************************************************/
- /*********************主函数***************************/
- main()
- {
- while(1)
- {
- init();//系统初始化设置
- LCMInit();
- AD();
- judge_xianshi();
- CUNCHU();
- //if(()()) //报警
- delayms(100);
- }
- }
- /******************************************************/
复制代码
|