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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數: 3540 | 評論數: 6 | 收藏 5
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2020-12-16 23:59

正文摘要:

目前程序能夠實現8路AD檢測數據但是顯示有問題,并且使用按鍵進行切換時總會不知道跳到什么地方去。          /* 功能:使用12C5A60S2內部AD讀取外部8 路電壓,顯示在1602上 */ /*&n ...

回復

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

軟件都是基于硬件條件編寫的,同一品牌的MCU不同型號的某功能也不見得相同,不可以生搬硬套。
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口  高電平使能,低跳變執行
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. }
復制代碼



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



ID:555216 發表于 2020-12-17 00:43
感謝樓主 受益匪淺
ID:861836 發表于 2020-12-17 00:01
顯示無法顯示小數,一直是LCD一直是閃爍的,望大神指點

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 好吊妞这里只有精品 | 亚洲视频在线观看一区 | 黄色精品网站 | 欧美日韩国产中文 | 亚洲一级精品 | 欧美综合激情 | av网站免费看| 欧美在线免费观看视频 | 黄网在线 | 在线视频成人 | 日韩三级大片 | 久草福利资源站 | 中文字幕一区二区三区视频 | a毛片视频 | eeuss一区二区三区 | 欧美日本在线观看 | 九色精品| 天海翼一区二区 | 国产午夜影院 | 三上悠亚久久 | 国产精品美女 | 欧美中文字幕在线观看 | 欧美激情免费 | av看片 | 欧美另类z0zx974 | 一区二区三区久久 | 亚洲欧洲视频 | 在线观看av免费 | 久热综合 | 成人a级片 | 秋霞国产 | 久久综合一区 | 成人国产网站 | 久久99精品久久久久久水蜜桃 | 亚洲成人久久久 | 快播少女爱欢乐 | 日韩一区在线视频 | 97视频在线 | 黄色小说网站在线观看 | 成人免费视频网站 | 四虎成人精品 |