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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3319|回復: 6
打印 上一主題 下一主題
收起左側

使用STC12單片機實現8路AD檢測程序

[復制鏈接]
跳轉到指定樓層
樓主
目前程序能夠實現8路AD檢測數據但是顯示有問題,并且使用按鍵進行切換時總會不知道跳到什么地方去。
         /* 功能:使用12C5A60S2內部AD讀取外部8 路電壓,顯示在1602上 */ /*     最多可同時輸入8路電壓,設置P1ASF            */

制作出來的實物圖如下:


單片機源程序如下:
#include <STC12C5A60S2.H>

#include<intrins.h>
sbit RS = P0^7;   //定義1602使用的端口
sbit RW = P0^6;
sbit EN = P0^5;
#define uchar unsigned char;
#define uint unsigned int;

#define RS_CLR RS=0
#define RS_SET RS=1

#define RW_CLR RW=0
#define RW_SET RW=1

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P2   //連接1602數據口 P2            

//uchar b,i,ge,shi,bai;
uchar da1=0,da2=0,da3=0,da4=0,da5=0,da6=0,da7=0,da8=0;
double Data,c;
char a[6]="";


uchar ADC_Chanul_Turn=0;


sbit key1=P0^0;
sbit key2=P0^1;
int tongdao=0;
int sum=0;




/*------------------------------------------------
              判忙函數
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);   
}
/*------------------------------------------------
              寫入命令函數
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙則等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;          //
_nop_();
EN_CLR;
}
/*------------------------------------------------
              寫入數據函數
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙則等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函數
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
while(TH0<9);
}
/*------------------------------------------------
              寫入字符串函數
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)//y為行數,x為橫坐標,最后一個是字符
{     
if (y == 0)
     {     
     LCD_Write_Com(0x80 + x);     //表示第一行
     }
else
     {      
     LCD_Write_Com(0xC0 + x);      //表示第二行
     }        
while (*s)
     {     
LCD_Write_Data( *s);     
s ++;     
     }
}
/*------------------------------------------------
              寫入字符函數
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
     {     
     LCD_Write_Com(0x80 + x);     
     }   
else
     {     
     LCD_Write_Com(0xC0 + x);     
     }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函數
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*顯示模式設置*/
   while(TH0<9);
   LCD_Write_Com(0x38);
   while(TH0<9);
   LCD_Write_Com(0x38);
   while(TH0<9);
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*顯示關閉*/
   LCD_Write_Com(0x01);    /*顯示清屏*/
   LCD_Write_Com(0x06);    /*顯示光標移動設置*/
   while(TH0<9);
   LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
   }

/*------------------------------------------------
                  ADC函數
------------------------------------------------*/

void InitADC()//初始AD寄存器
{
        P1ASF=0Xff;     //0xff設置P1口全部為ADC通道,0x07=0000,0111  即使用P10,P11,P12作為輸入
        ADC_RES=0X00;    //清除高8位緩沖數據
        if(ADC_Chanul_Turn%8==0)//外部基準電壓
        {
            ADC_CONTR=0xF0; //AD轉換控制寄存器,1111,0000  P10口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            ADC_CONTR=0xE8;    //1110,1000(清零Flag,置位Start)
         }
        if(ADC_Chanul_Turn%8==1)
        {
            ADC_CONTR=0xF1; // 1111,0001  P11口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            ADC_CONTR=0xE9;    //1110,1001
         }
         if(ADC_Chanul_Turn%8==2)
        {
            ADC_CONTR=0xF2; //1111,0010  P12口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            ADC_CONTR=0xEA;    //1110,1010
         }
                 if(ADC_Chanul_Turn%8==3)
        {
            ADC_CONTR=0xF3; //1111,0011  P13口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            ADC_CONTR=0xEB;    //1110,1011
         }
                  if(ADC_Chanul_Turn%8==4)
        {
            ADC_CONTR=0xF4; //1111,0100  P14口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            ADC_CONTR=0xEC;    //1110,1100
         }
           if(ADC_Chanul_Turn%8==5)
        {
            ADC_CONTR=0xF5; //1111,0101  P15口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            ADC_CONTR=0xED;    //1110,1101
         }   
                   if(ADC_Chanul_Turn%8==6)
        {
            ADC_CONTR=0xF6; //1111,0110  P16口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            ADC_CONTR=0xEE;    //1110,1110
         }   
                  if(ADC_Chanul_Turn%8==7)
        {
            ADC_CONTR=0xF7; //1111,0111  P17口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            ADC_CONTR=0xEF;    //1110,1111
         }                     
}     
void timer0() interrupt 1      //interrupt 1: 定時器0,interrupt3:定時器3
{
    TH0=-9;       //高八位,(需要表示Xms的定時,計數器由65536-X數到65536,由于16位,只能分高低位)

    EA = 1;
    ET0 = 1;
    TR0 = 1;
        InitADC();
}
void adc_isr() interrupt 5      //FLAG標志位置位觸發中斷,沒有設優先級,但是同優先級下定時器0更高
{  

   //V_5REF=V_1REF*256/da_ref;
   if(ADC_Chanul_Turn%8==0)                     //外部基準電壓
   {   
       da1=ADC_RES;                                   //獲取轉換結果
       Data=((double)da1/256)*5;     //取八位計算基準電壓Data,
       c =Data;
       }
   if(ADC_Chanul_Turn%8==1)
   {
       da2=ADC_RES;                                  //獲取轉換結果
       Data=((double)da2/256)*5;     //取八位計算實際值Data,
       c =Data;
       }
   if(ADC_Chanul_Turn%8==2)
   {
       da3=ADC_RES;                                  //獲取轉換結果
       Data=((double)da3/256)*5;     //取八位計算實際值Data,
       c =Data;
       }
        if(ADC_Chanul_Turn%8==3)
   {
       da4=ADC_RES;                                  //獲取轉換結果
       Data=((double)da4/256)*5;     //取八位計算實際值Data,
       c =Data;
       }
       if(ADC_Chanul_Turn%8==4)
   {
       da5=ADC_RES;                                  //獲取轉換結果
       Data=((double)da5/256)*5;     //取八位計算實際值Data,
       c =Data;
       }
           if(ADC_Chanul_Turn%8==5)
   {
       da6=ADC_RES;                                  //獲取轉換結果
       Data=((double)da6/256)*5;     //取八位計算實際值Data,
       c =Data;
       }
           if(ADC_Chanul_Turn%8==6)
   {
       da7=ADC_RES;                                  //獲取轉換結果
       Data=((double)da7/256)*5;     //取八位計算實際值Data,
       c =Data;
       }
           if(ADC_Chanul_Turn%8==7)
   {
       da8=ADC_RES;                                  //獲取轉換結果
       Data=((double)da8/256)*5;     //取八位計算實際值Data,
       c =Data;
       }                                                                                                                                                                                                                                                                 
   a[0]=((int)c%10+0x30);//個位(電壓<5,僅有個)     //0x30: ASCAI碼里代表“0”,必須轉換成字符存在字符型數組里才可以在1602液晶屏上顯示
   a[1]=0x2e;                    //小數點
   a[2]=((int)(c*10)%10+0x30); // 十分位
   a[3]=((int)(c*100)%10+0x30);// 百分位
   a[4]=((int)(c*1000)%10+0x30);// 千分位
//   a[5]=((int)(c*10000)%10+0x30);// 萬分位
//   a[6]=((int)(c*100000)%10+0x30);// 十萬分位
   a[5]='\0';                  //  加了串尾符才成了字符串哦


        
                   if(key1==0)
                     {
                        while(TH0<9);
                        if(key1==0)
                        {
                        tongdao++;
                        }
                        if(tongdao==8)
                        {
                        tongdao=0;
                        }
                   }
                     if(key2==0)
                     {
                        while(TH0<9);
                        if(key2==0)
                        {
                        tongdao--;
                        }
                        if(tongdao==-1)
                        {
                        tongdao=7;
                        }
                   }
                   switch(tongdao)
                   {
                   case 0: if(ADC_Chanul_Turn%8==0)
                           {
                                   LCD_Write_String(0,0,a);
                                   LCD_Write_String(5,1,0x30);
                                   }
                                           break;
                   case 1: if(ADC_Chanul_Turn%8==1)  
                                      {
                               LCD_Write_String(0,0,a);
                                   LCD_Write_String(5,1,0x31);
                                      }
                                        break;
                   case 2: if(ADC_Chanul_Turn%8==2)
                           {
                                   LCD_Write_String(0,0,a);
                                   LCD_Write_String(5,1,0x32);
                                      }
                                   break;
                   case 3: if(ADC_Chanul_Turn%8==3)
                                           {
                                        LCD_Write_String(0,0,a);
                                           LCD_Write_String(5,1,0x33);
                                        }
                                        break;
                   case 4: if(ADC_Chanul_Turn%8==4)
                                           {
                                        LCD_Write_String(0,0,a);
                                           LCD_Write_String(5,1,0x34);
                                        }
                                        break;
                   case 5: if(ADC_Chanul_Turn%8==5)
                                           {
                                        LCD_Write_String(0,0,a);
                                           LCD_Write_String(5,1,0x35);
                                        }
                                        break;
                   case 6: if(ADC_Chanul_Turn%8==6)
                                           {
                                        LCD_Write_String(0,0,a);
                                           LCD_Write_String(5,1,0x36);
                                        }
                                        break;
                   case 7: if(ADC_Chanul_Turn%8==7)
                                           {
                                        LCD_Write_String(0,0,a);
                                           LCD_Write_String(5,1,0x37);
                                        }
                                        break;
                   }





   ADC_CONTR&=0xEF;               //標志位清零

   ADC_Chanul_Turn++;
   if(ADC_Chanul_Turn==252)
      ADC_Chanul_Turn=0;   
}
void main()
{
    LCD_Init();
    LCD_Clear();                     //清屏
    LCD_Write_String(0,1,"P");
        LCD_Write_String(1,1,"A");
        LCD_Write_String(2,1,"S");
        LCD_Write_String(3,1,"S");
        LCD_Write_String(4,1,":");
        
        TMOD=0x11;
    TH0=0;
        TL0=;           //開定時器0        TR0=1;
    EA=1;                             //開全局中斷
    ET0=1;
        EX0 = 1;                             //允許定時器零中斷
    EADC=1;                          //允許ADC中斷

    while(1);
}

全部資料51hei下載地址:
AD003.rar (35.58 KB, 下載次數: 13)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:861836 發表于 2020-12-17 00:01 | 只看該作者
顯示無法顯示小數,一直是LCD一直是閃爍的,望大神指點
回復

使用道具 舉報

板凳
ID:555216 發表于 2020-12-17 00:43 | 只看該作者
感謝樓主 受益匪淺
回復

使用道具 舉報

地板
ID:213173 發表于 2020-12-17 08:33 | 只看該作者
樓主這程序寫得也太啰嗦,而且還有不少錯誤。不如把STC官方示例稍改一下,串口顯示改LCD顯示即可。
  1. /***************************************************************/
  2. /*------------------------------------------------------------------*/
  3. /* --- STC MCU Limited ---------------------------------------------*/
  4. /* --- STC12C5Axx Series MCU A/D Conversion Demo -------------------*/

  5. /* If you want to use the program or the program referenced in the  */
  6. /* article, please specify in which data and procedures from STC    */
  7. /*------------------------------------------------------------------*/

  8. #include "reg51.h"
  9. #include "intrins.h"

  10. #define FOSC    11059200L
  11. #define BAUD    9600

  12. typedef unsigned char BYTE;
  13. typedef unsigned int WORD;

  14. /*Declare SFR associated with the ADC */
  15. sfr ADC_CONTR   =   0xBC;           //ADC control register
  16. sfr ADC_RES     =   0xBD;           //ADC hight 8-bit result register
  17. sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
  18. sfr P1ASF       =   0x9D;           //P1 secondary function control register

  19. /*Define ADC operation const for ADC_CONTR*/
  20. #define ADC_POWER   0x80            //ADC power control bit
  21. #define ADC_FLAG    0x10            //ADC complete flag
  22. #define ADC_START   0x08            //ADC start control bit
  23. #define ADC_SPEEDLL 0x00            //420 clocks
  24. #define ADC_SPEEDL  0x20            //280 clocks
  25. #define ADC_SPEEDH  0x40            //140 clocks
  26. #define ADC_SPEEDHH 0x60            //70 clocks

  27. void InitUart();
  28. void SendData(BYTE dat);
  29. void Delay(WORD n);
  30. void InitADC();

  31. BYTE ch = 0;                        //ADC channel NO.

  32. void main()
  33. {
  34.     InitUart();                     //Init UART, use to show ADC result
  35.     InitADC();                      //Init ADC sfr
  36.     IE = 0xa0;                      //Enable ADC interrupt and Open master interrupt switch
  37.                                     //Start A/D conversion
  38.     while (1);
  39. }

  40. /*----------------------------
  41. ADC interrupt service routine
  42. ----------------------------*/
  43. void adc_isr() interrupt 5
  44. {
  45.     ADC_CONTR &= !ADC_FLAG;         //Clear ADC interrupt flag

  46.     SendData(ch);                   //Show Channel NO.
  47.     SendData(ADC_RES);              //Get ADC high 8-bit result and Send to UART

  48. //if you want show 10-bit result, uncomment next line
  49. //    SendData(ADC_LOW2);             //Show ADC low 2-bit result
  50.    
  51.     if (++ch > 7) ch = 0;           //switch to next channel
  52.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  53. }

  54. /*----------------------------
  55. Initial ADC sfr
  56. ----------------------------*/
  57. void InitADC()
  58. {
  59.     P1ASF = 0xff;                   //Set all P1 as analog input port
  60.     ADC_RES = 0;                    //Clear previous result
  61.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  62.     Delay(2);                       //ADC power-on delay and Start A/D conversion
  63. }

  64. /*----------------------------
  65. Initial UART
  66. ----------------------------*/
  67. void InitUart()
  68. {
  69.     SCON = 0x5a;                    //8 bit data ,no parity bit
  70.     TMOD = 0x20;                    //T1 as 8-bit auto reload
  71.     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
  72.     TR1 = 1;                        //T1 start running
  73. }

  74. /*----------------------------
  75. Send one byte data to PC
  76. Input: dat (UART data)
  77. Output:-
  78. ----------------------------*/
  79. void SendData(BYTE dat)
  80. {
  81.     while (!TI);                    //Wait for the previous data is sent
  82.     TI = 0;                         //Clear TI flag
  83.     SBUF = dat;                     //Send current data
  84. }

  85. /*----------------------------
  86. Software delay function
  87. ----------------------------*/
  88. void Delay(WORD n)
  89. {
  90.     WORD x;

  91.     while (n--)
  92.     {
  93.         x = 5000;
  94.         while (x--);
  95.     }
  96. }
復制代碼



回復

使用道具 舉報

5#
ID:213173 發表于 2020-12-17 14:45 | 只看該作者
me262c919 發表于 2020-12-17 00:01
顯示無法顯示小數,一直是LCD一直是閃爍的,望大神指點

給你改寫成了ADC查詢方式,如果硬件沒有錯誤應該可以直接用于你的實驗板。
  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. /***宏定義ADC的操作命令***/
  6. #define ADC_POWER   0x80            //ADC power control bit
  7. #define ADC_FLAG    0x10            //ADC complete flag
  8. #define ADC_START   0x08            //ADC start control bit
  9. #define ADC_SPEEDLL 0x00            //420 clocks
  10. /***LCD端口定義***/
  11. //#define DataPort P2                           //連接1602數據口 P2
  12. sbit LCD_RS=P0^7;                                        //液晶屏RS口  寫指令低,寫數據高
  13. sbit LCD_RW=P0^6;                                        //液晶屏RW口  寫數據低,讀數據高 如果不查忙RW可以直接接地,去掉LCD_RW=0;
  14. sbit LCD_EN=P0^5;                                        //液晶屏EN口  高電平使能,低跳變執行
  15. /********本地全局變量聲明**************/
  16. uchar table1[]="Voltmeter No.1";        //LCD第一行字符
  17. uchar table2[]="CH0: 0.000 V";        //LCD第二行字符
  18. uint  dis_buf[8]; //ADC轉換數據緩存
  19. uint  Cnt2ms;                //計時變量
  20. uchar Channel;                //通道變量
  21. uchar num=0;                //輪流顯示變量
  22. uint  ADC_V;                //ADC電壓值變量
  23. /********本地函數聲明**************/
  24. void Timer0Init();                                //定時器初始化函數
  25. void InitADC();                                        //ADC初始化函數
  26. uint GetADCResult(uchar ch);        //ADC轉換函數
  27. void delay(uint x);                                //延時函數
  28. void write_com(uchar com);                //LCD寫命令函數
  29. void write_date(uchar date);        //LCD寫數據函數
  30. void LCD_init();                                        //初始化LCD函數
  31. void Filter();                                                //采樣濾波函數

  32. void main()
  33. {
  34.         uchar a;
  35.         P1M0=0x00;                        //P1口全部為高阻輸入
  36.         P1M1=0xff;                        //P1口全部為高阻輸入
  37.         Timer0Init();                //初始化定時器
  38.         InitADC();                   //初始化ADC
  39.         LCD_init();                        //初始化LCD
  40.         write_com(0x80+1);//初始化LCD第一行字符
  41.         for(a=0;a<14;a++)       
  42.                 write_date(table1[a]);
  43.         write_com(0xc0+2);//初始化LCD第二行字符
  44.         for(a=0;a<12;a++)
  45.                 write_date(table2[a]);
  46.         while(1)
  47.         {
  48.                 if(TF0)                        //查詢2msT0中斷請求標志
  49.                 {
  50.                         TF0=0;                //清除T0中斷請求標志
  51.                         Filter();        //讀取ADC轉換數據
  52.                         Cnt2ms++;
  53.                         if(Cnt2ms>=500)//1秒刷新LCD顯示數據
  54.                         {
  55.                                 Cnt2ms=0;
  56.                                 //輪流取緩存中數據強制轉換數據類型(32位)運算,得到(4舍5入)mV,顯示在LCD
  57.                                 ADC_V=(5*(long)dis_buf[num]*10000/1024+5)/10;//
  58.                                 table2[5]=ADC_V/1000%10+'0';
  59.                                 table2[7]=ADC_V/100%10+'0';
  60.                                 table2[8]=ADC_V/10%10+'0';
  61.                                 table2[9]=ADC_V%10+'0';
  62.                                 write_com(0xc0+4);                        //顯示通道數
  63.                                         write_date(num+1+'0');
  64.                                 write_com(0xc0+7);                        //顯示電壓值
  65.                                 for(a=0;a<5;a++)
  66.                                         write_date(table2[a+5]);
  67.                                 num++;
  68.                                 if(num>=8)
  69.                                         num=0;
  70.                         }
  71.                 }
  72.         }
  73. }
  74. /*******1ms延時程序********/
  75. void delay(uint x)//1T/11.0592MHz
  76. {
  77.         uint a,b;
  78.         for(a=x;a>0;a--)
  79.                 for(b=829;b>0;b--);
  80. }
  81. /*******1602液晶屏寫指令程序********/
  82. void write_com(uchar com)
  83. {
  84.         LCD_RS=0;        //允許寫指令
  85.         P2=com;                //傳遞指令
  86.         delay(1);        //延時1ms
  87.         LCD_EN=1;        //使能寫入
  88.         delay(1);        //延時1ms
  89.         LCD_EN=0;        //低跳變執行
  90.        
  91. }
  92. /*******1602液晶屏寫數據程序********/
  93. void write_date(uchar date)
  94. {
  95.         LCD_RS=1;        //允許寫數據
  96.         P2 =date;        //傳遞數據
  97.         delay(1);        //延時1ms
  98.         LCD_EN=1;        //使能寫入
  99.         delay(1);        //延時1ms
  100.         LCD_EN=0;        //低跳變執行
  101.        
  102. }
  103. /*******1602液晶屏初始化程序********/
  104. void LCD_init()                //設置顯示模式、
  105. {
  106.         LCD_RW=0;
  107.         LCD_EN=0;                //初始設置LCD_EN低電平
  108.         write_com(0x38);//設置16*2顯示,5*7點陣,8位數據接口
  109.         write_com(0x01);//顯示清零,數據指針清零
  110.         write_com(0x0c);//設置開顯示,不顯光標
  111.         write_com(0x06);//設置寫一個字符后地址指針加1
  112. }
  113. /*----------------------------
  114.         Init Timer0
  115. ----------------------------*/
  116. void Timer0Init()                //2毫秒@11.0592MHz
  117. {
  118.         AUXR |= 0x80;                //定時器時鐘1T模式
  119.         TMOD &= 0xF0;                //設置定時器模式
  120.         TL0 = 0x9A;                        //設置定時初值
  121.         TH0 = 0xA9;                        //設置定時初值
  122.         TF0 = 0;                        //清除TF0標志
  123.         TR0 = 1;                        //定時器0開始計時
  124. }
  125. /*----------------------------
  126. Get ADC result
  127. ----------------------------*/
  128. uint GetADCResult(uchar ch)
  129. {
  130.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  131.         _nop_();                        //Must wait before inquiry
  132.         _nop_();
  133.         _nop_();
  134.         _nop_();
  135.         while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  136.         ADC_CONTR &= ~ADC_FLAG;         //Close ADC
  137.         return (ADC_RES<<2|ADC_RESL);    //返回10位ADC
  138. }
  139. /*----------------------------
  140. Initial ADC sfr
  141. ----------------------------*/
  142. void InitADC()
  143. {
  144.         P1ASF = 0xff;                   //Open 8 channels ADC function
  145.         ADC_RES = 0;                    //Clear previous result
  146.         ADC_RESL= 0;
  147.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  148.         delay(2);        //延時2ms            //ADC power-on and delay
  149. }
  150. //采樣濾波
  151. void Filter()
  152. {
  153.         static uchar count=0;
  154.         static uint V_ADC;
  155.         V_ADC+=GetADCResult(Channel);
  156.         count++;
  157.         if(count>=10)                                //如果計數十次采樣
  158.         {
  159.                 count=0;                                        //計數器清0
  160.                 dis_buf[Channel]=(V_ADC+5)/10;//四舍五入獲取平均值保存在緩存中
  161.                 V_ADC=0;                                        //采樣變量清0
  162.                 Channel++;
  163.                 if(Channel==8)
  164.                         Channel=0;
  165.         }
  166. }
復制代碼



回復

使用道具 舉報

6#
ID:1045846 發表于 2024-3-10 17:12 | 只看該作者
wulin 發表于 2020-12-17 14:45
給你改寫成了ADC查詢方式,如果硬件沒有錯誤應該可以直接用于你的實驗板。

老師你好,我將LCD屏的接口改成以下三個,屏幕上不顯示數據。
我系統板的LCD的數據接口在P0,還要改哪個地方,才能顯示數據,謝謝。
sbit LCD_RS=P2^5;                                        //液晶屏RS口  寫指令低,寫數據高
sbit LCD_RW=P2^6;                                        //液晶屏RW口  寫數據低,讀數據高 如果不查忙RW可以直接接地,去掉LCD_RW=0;
sbit LCD_EN=P2^7;                                        //液晶屏EN口  高電平使能,低跳變執行
回復

使用道具 舉報

7#
ID:213173 發表于 2024-3-10 21:21 | 只看該作者
本帖最后由 wulin 于 2024-3-11 06:02 編輯
jony1122 發表于 2024-3-10 17:12
老師你好,我將LCD屏的接口改成以下三個,屏幕上不顯示數據。
我系統板的LCD的數據接口在P0,還要改哪個 ...

軟件都是基于硬件條件編寫的,同一品牌的MCU不同型號的某功能也不見得相同,不可以生搬硬套。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av在线播放 | 色婷婷一区二区三区四区 | 国产激情视频在线观看 | 亚洲成a人片 | 精品视频久久久久久 | www日本在线 | 日韩中文视频 | 亚洲aⅴ | 国产精品国产精品国产专区不片 | 日韩一区二区在线视频 | 日韩av福利在线观看 | 视频一区在线 | 日韩欧美在线不卡 | 午夜一区| 国产二区三区 | 久草免费在线视频 | 国产精品久久久久久吹潮 | 中文字幕一区二区三区四区五区 | 久久午夜精品 | 色婷婷国产精品综合在线观看 | 精品欧美黑人一区二区三区 | 国产小视频在线观看 | 国产成人精品一区二区三区在线观看 | 伊人久久国产 | 国产一区二区三区高清 | 免费人成激情视频在线观看冫 | 免费看黄色国产 | 情侣酒店偷拍一区二区在线播放 | 美国一级片在线观看 | 精品国产一区二区三区av片 | 国产欧美精品一区 | 成人久久18免费网站图片 | 欧美激情一区二区三区 | 国产精品一区二区三 | 色综合九九 | 日韩不卡三区 | 99国产精品99久久久久久 | 天天综合网永久 | 黄色免费在线网址 | 美女视频h | 在线观看中文字幕 |