久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: lcd1602不能實時顯示探測結果,求大神賜教 [打印本頁]

作者: 周子瑜    時間: 2018-5-19 17:33
標題: lcd1602不能實時顯示探測結果,求大神賜教
不能實時顯示探測結果,求大神賜教;

  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. /******************************************************/
復制代碼







歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 免费网站在线 | 亚洲精品久久久一区二区三区 | 一区二区国产精品 | 日韩欧美中文字幕在线观看 | 亚洲小视频在线播放 | 欧美日韩在线一区二区 | 久久久久久久久综合 | 亚洲欧美视频一区 | 欧美精品一区二区在线观看 | 亚洲社区在线 | 精品一区二区免费视频 | 亚洲视频在线一区 | 青青草网站在线观看 | 久久综合一区 | 国产精品一区久久久 | 欧美一区二区三区久久精品 | 久久精品亚洲 | 久久久久久国产精品 | 综合自拍 | 精品一区二区不卡 | 色噜噜色综合 | 免费看黄视频网站 | 日韩一区和二区 | 欧美激情欧美激情在线五月 | 狠狠干狠狠操 | 午夜在线视频 | 亚洲一区不卡在线 | www.亚洲精品 | 成人国产精品色哟哟 | 久久久久久久久久久国产 | 福利在线观看 | 亚洲高清视频一区 | 国产精品一区二区视频 | 国产精品国产三级国产aⅴ浪潮 | 久久亚洲春色中文字幕久久久 | 麻豆久久久久久久 | aaaaa毛片| 天堂久久久久久久 | 色精品视频 | 国产农村妇女毛片精品久久麻豆 | 久久国产精品免费一区二区三区 |