找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2877|回复: 0
打印 上一主题 下一主题
收起左侧

lcd1602不能实时显示探测结果,求大神赐教

[复制链接]
跳转到指定楼层
楼主
ID:318531 发表于 2018-5-19 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不能实时显示探测结果,求大神赐教;

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <string.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. uchar         AD_DATA[1]; //保存IN0通道转换后的数据
  7. uchar          addata0;
  8. uchar          addata1;
  9. /********************adc0809端口定义*******************/
  10. #define adc0809_data  P2// ADC0809模块的D0-D7分别接P2.0-P2.7
  11. sbit STR=P0^0; //单片机P0.0接模块STR引脚, 启动转换信号
  12. sbit EOC=P0^1; //单片机P0.1接模块EOC, 转换结束信号,高电平有效
  13. sbit OE=P0^2; //单片机P0.2接模块OE,输出允许信号,高电平有效
  14. sbit CLK=P0^3; //单片机P0.3接CLK ,ADC0809时钟,输入50-800KHZ的频率
  15. sbit ADD_A=P0^4;
  16. sbit ADD_B=P0^5;        //定义地址线
  17. sbit ADD_C=P0^6;               
  18. /******************************************************/
  19. /*******************lcd1602端口定义********************/
  20. #define LCM_Data     P1    //LCD1602数据接口
  21. #define Busy         0x80   //用于检测LCM状态字中的Busy标识
  22. sbit    LCM_RW     = P3^3;  //读写控制输入端,LCD1602的第五脚
  23. sbit    LCM_RS     = P3^4;  //寄存器选择输入端,LCD1602的第四脚
  24. sbit    LCM_E      = P3^2;  //使能信号输入端,LCD1602的第6脚
  25. /******************************************************/
  26. /*******************存储模块端口定义*******************/
  27. sbit P1_0 = P3^5;//busy忙标志管脚
  28. sbit P1_5 = P3^6 ;//测试板信号指示(指示发送数据)
  29. /******************************************************/
  30. /*******************函数声明***************************/
  31. void    WriteDataLCM                (uchar WDLCM);//LCD模块写数据
  32. void    WriteCommandLCM        (uchar WCLCM,BuysC); //LCD模块写指令
  33. uchar   ReadStatusLCM(void);//读LCD模块的忙标
  34. void    DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
  35. void    LCMInit(void);//LCD初始
  36. void    delayms(uint ms);//1MS基准延时程序
  37. void    delay(uchar i); //延时函数2
  38. void    DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);
  39. void        judge_xianshi(void);//显示处理程序
  40. void    init();//系统初始化设置
  41. void    AD();//读取AD数据
  42. void    Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/);
  43. void        SD();
  44. uchar         flag1;
  45. /******************************************************/


  46. /*******************系统初始化*************************/

  47. void init()
  48. {  
  49.   EA=1; //开总中断
  50.   TMOD=0x02; //设定定时器 T0工作方式
  51.   TH0=216; //利用T0中断产生CLK信号
  52.   TL0=216;  
  53.   TR0=1; //启动定时器T0
  54.   ET0=1;
  55.   STR=0;
  56.   OE=0;

  57. }  

  58. /******************************************************/
  59. /******************adc0809*****************************/
  60. void AD()
  61. {
  62.         STR=1;//ADDR这样如果不是通道0,可以在这边加一条其他地址的程序
  63.         delay(10);
  64.         ADD_A=0;
  65.         ADD_B=0;
  66.         ADD_C=0;
  67.         delay(10);
  68.         STR=0;
  69.     delay(10);  
  70.     STR=1; //启动AD转换
  71.         delay(10);
  72.     STR=0;  
  73.     while(0==EOC);//等待转换结束
  74.     OE=1;
  75.     AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255
  76.            OE=0;
  77.            delay(10);
  78. }
  79. /******************************************************/
  80. /********************lcd1602***************************/
  81. void   judge_xianshi()
  82. {
  83.         addata0=255/AD_DATA[0]/1*10;//把数据扩大10,为下面求取小数位后1位做准备
  84.           DisplayListChar(0,0,0, "R="); //在液晶的第二行第0位开始显示"R="
  85.           DisplayOneChar(0,2, addata0/100000+0x30); //显示AD数据的万位
  86.         DisplayOneChar(0,3, addata0/10000%10+0x30);//显示AD数据的千位
  87.         DisplayOneChar(0,4, addata0/1000%10+0x30);//显示AD数据的百位
  88.           DisplayOneChar(0,5, addata0/100%10+0x30);//显示AD数据的十位
  89.          DisplayOneChar(0,6, addata0/10%10+0x30);//显示AD数据的十位
  90.           DisplayListChar(0,7,0, ".");
  91.           DisplayOneChar(0,8, addata0%10+0x30);
  92.           DisplayListChar(0,9,0, "v");
  93.           DisplayListChar(0,10,0, "/");
  94.           DisplayListChar(0,11,0, "a");

  95.           addata1=AD_DATA[0]*5/51/1*10;//把数据扩大10,为下面求取小数位后1位做准备
  96.           DisplayListChar(1,0,0, "P="); //在液晶的第二行第8位开始显示"P="
  97.           DisplayOneChar(1,2, addata1/100000+0x30); //显示AD数据的万位
  98.           DisplayOneChar(1,3, addata1/10000%10+0x30);//显示AD数据的千位
  99.           DisplayOneChar(1,4, addata1/1000%10+0x30);//显示AD数据的百位
  100.           DisplayOneChar(1,5, addata1/100%10+0x30);//显示AD数据的十位
  101.           DisplayOneChar(1,6, addata1/10%10+0x30);//显示AD数据的各位
  102.           DisplayListChar(1,7,0, ".");
  103.           DisplayOneChar(1,8, addata1%10+0x30);
  104.           DisplayListChar(1,10,0, "w");
  105. }
  106. /***********************中断***************************/
  107. void t0(void) interrupt 1 using 0
  108. {  
  109.            CLK=~CLK;
  110. }
  111. /******************************************************/
  112. void DisplayListChar(uchar X,uchar Y,uchar ms, uchar code *DData)
  113. {
  114.         unsigned char ListLength;
  115.         ListLength = 0;
  116.         X&=0x1;
  117.          Y&=0xF; //限制X不能大于15,Y不能大于1
  118.          while (DData[ListLength]!='\0') //若到达字串尾则退出
  119.           {
  120.              if (Y <= 0xF) //X坐标应小于0xF
  121.              {
  122.         DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
  123.         ListLength++;
  124.         Y++;
  125.             delayms(ms);//延时显示字符串
  126.              }
  127.              else
  128.             break;//跳出循环体
  129.   }
  130. }
  131. void LCMInit(void)
  132. {
  133.          LCM_Data = 0;
  134.          WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
  135.          delayms(5);
  136.          WriteCommandLCM(0x38,0);
  137.          delayms(5);
  138.          WriteCommandLCM(0x38,0);
  139.         delayms(5);
  140.          WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
  141.          WriteCommandLCM(0x08,1); //关闭显示
  142.          WriteCommandLCM(0x01,1); //显示清屏
  143.          WriteCommandLCM(0x06,1); // 显示光标移动设置
  144.          WriteCommandLCM(0x0C,1); // 显示开及光标设置
  145.          delayms(100);
  146. }
  147. void WriteDataLCM(uchar WDLCM)
  148. {
  149.          ReadStatusLCM(); //检测忙
  150.          LCM_Data = WDLCM;
  151.          LCM_RS = 1;
  152.          LCM_RW = 0;
  153.          LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  154.          LCM_E = 0; //延时
  155.          LCM_E = 1;
  156. }
  157. void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测
  158. {
  159.          if (BuysC) ReadStatusLCM(); //根据需要检测忙
  160.          LCM_Data = WCLCM;
  161.          LCM_RS = 0;
  162.          LCM_RW = 0;
  163.          LCM_E = 0;
  164.          LCM_E = 0;
  165.          LCM_E = 1;
  166. }
  167. uchar ReadStatusLCM(void)
  168. {
  169.          LCM_Data = 0xFF;
  170.          LCM_RS = 0;
  171.          LCM_RW = 1;
  172.          LCM_E = 0;
  173.          LCM_E = 0;
  174.          LCM_E = 1;
  175.          while (LCM_Data & Busy); //检测忙信号  
  176.          return(LCM_Data);
  177. }
  178. void DisplayOneChar( uchar X, uchar Y, uchar ASCII)
  179. {
  180.           X&=0x1;
  181.           Y&=0xF; //限制Y不能大于15,X不能大于1
  182.           if(X)Y|=0x40; //当要显示第二行时地址码+0x40;
  183.           Y|=0x80; // 算出指令码
  184.           WriteCommandLCM(Y, 0); //这里不检测忙信号,发送地址码
  185.           WriteDataLCM(ASCII);
  186. }
  187. /******************************************************/
  188. /********************延迟函数**************************/
  189. void delayms(uint Ms)
  190. {
  191.           uint i,TempCyc;
  192.           for(i=0;i<Ms;i++)
  193.           {
  194.             TempCyc =70;
  195.             while(TempCyc--);
  196.           }
  197. }
  198. void delay(uchar i)
  199. {
  200.         uchar j;
  201.         while(i--)
  202.         {  
  203.                 for(j=125;j>0;j--);
  204.         }
  205. }  
  206. /******************************************************/
  207. /*******************存储模块***************************/
  208. uchar  date_temp[50]={0};//获取系统状态
  209. code uchar   top[]={"    单位:西安工业大学"};//获取系统状态,22
  210. code uchar  item[]={"电阻(Ω)  功率(W)  工作状态"};//获取系统状态,31
  211. uchar     D_date[]={"10000.0    10000.0      正常"};//定义数据格式,28
  212. void Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/);

  213. unsigned char a;
  214. unsigned char addata0;
  215. unsigned char addata1;
  216. unsigned char r;
  217. unsigned char p;
  218. void CUNCHU (void)
  219. {

  220.         SCON    =   0x50;   //0101,0000 串口方式1,允许接收,无奇偶校验位
  221.     TMOD    =   0x20;   //0010,0000 时器1,定时方式2 自动重装装计数器
  222.     PCON = 0x80;  //SMOD=1
  223.         TL1 = 0xfd;
  224.         TH1 = 0xfd;
  225.         TR1 = 1;

  226.         P1_0 = 1;
  227.         delay(2000);
  228.         //写标题
  229.         while(P1_0);
  230.         memcpy(date_temp,top,22);
  231.     Send_UART(22,date_temp);
  232.         //写条目
  233.         while(P1_0);
  234.         memcpy(date_temp,item,31);
  235.     Send_UART(31,date_temp);
  236.         
  237.         while(1)
  238.         {
  239.           r=addata0;
  240.           p=addata1;
  241.           D_date[1] =r/100000%10+'0';
  242.           D_date[2] =r/10000%10+'0';
  243.           D_date[3] =r/1000%10+'0';
  244.           D_date[4] =r/100%10+'0';
  245.           D_date[5] =r/10%10+'0';
  246.           D_date[6] ='.';
  247.           D_date[7] =r%10+'0';

  248.           D_date[12]=p/100000%10+'0';
  249.           D_date[13]=p/10000%10+'0';
  250.           D_date[14]=p/1000%10+'0';
  251.           D_date[15]=p/100%10+'0';
  252.           D_date[16]=p/10%10+'0';
  253.           D_date[17]='.';
  254.           D_date[18]=p%10+'0';

  255.           delay(50);
  256.           memcpy(date_temp,D_date,28);
  257.       Send_UART(28,date_temp);
  258.           delay(50);
  259.         }                                                   
  260. }


  261. void Send_UART(unsigned int num/*字节数*/,unsigned char *Date_OUT/*数据数组*/)
  262. {
  263.    unsigned int i=0;


  264.    while(i<num)
  265.    {
  266.                 TI     =   0;  //清零串口发送完成中断请求标志
  267.              SBUF   =   Date_OUT[i];        //date[i]
  268.              while(TI ==0); //等待发送完成
  269.              TI     =   0;  //清零串口发送完成中断请求标志
  270.              i++;
  271.    }

  272.    //WINDOWS里的是 13 + 10(ASCII码值)作为换行
  273.    //-----------------------------------------------发送换行符0x0D
  274.    SBUF   =  0x0d;
  275.    while(TI ==0); //等待发送完成
  276.    TI     =   0;  //清零串口发送完成中断请求标志

  277.    //-----------------------------------------------发送换行符0x0a
  278.    SBUF   =  0x0a;
  279.    while(TI ==0); //等待发送完成
  280.    TI     =   0;  //清零串口发送完成中断请求标志


  281. }
  282. /******************************************************/
  283. /*********************主函数***************************/
  284. main()   
  285. {   
  286.         while(1)
  287.            {
  288.                 init();//系统初始化设置
  289.                 LCMInit();
  290.                AD();
  291.                judge_xianshi();
  292.                 CUNCHU();
  293.                  //if(()())                          //报警
  294.                delayms(100);   
  295.            }

  296. }
  297. /******************************************************/
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表