標題: 自制單片機STC12C5A60S2+1602電壓表 [打印本頁]

作者: 405616736    時間: 2020-4-25 00:15
標題: 自制單片機STC12C5A60S2+1602電壓表
本帖最后由 405616736 于 2020-4-25 10:14 編輯

LCD1602 D0~D7接P0口,RS=P3.1,RW=P3.2,sbit E=P3.3。
電壓測試口接P1.0。供電電壓要穩(wěn)定5V才能準確測量。另外因為沒有加電阻,只能測5V以下電壓。
廢話少說,直接上實物圖。



單片機源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define LCD P0                //LCD1602數(shù)據(jù)接口
  4. sbit RS=P3^1;                //設置RS引腳接口,RS=0,指令寄存器;RS=1,數(shù)據(jù)寄存器
  5. sbit RW=P3^2;                //設置R/W引腳接口,R/W=0,寫;R/W=1,讀
  6. sbit E=P3^3;                //設置E引腳接口,E允許信號

  7. /*Declare SFR associated with the ADC */
  8. sfr ADC_CONTR=0xBC;                //ADC control register
  9. sfr ADC_RES=0xBD;                //ADC high 8-bit result register
  10. sfr ADC_LOW2=0xBE;                //ADC low 2-bit result register
  11. sfr P1ASF=0x9D;                //P1 secondary function control register

  12. unsigned char V[]="000000";
  13. unsigned int ADC_temp=0;

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


  22. /******************************
  23.                 延時函數(shù)
  24. ******************************/
  25. void Delay(unsigned int n)
  26.         {
  27.     unsigned int i=0,j=0;
  28.     for(i=0;i<n;i++)
  29.                 for(j=0;j<123;j++);
  30.         }

  31. /******************************
  32.                 初始化ADC
  33. ******************************/
  34. void InitADC()
  35.         {
  36.                 P1ASF=0xff;
  37.     ADC_RES=0;
  38.     ADC_CONTR=ADC_POWER | ADC_SPEEDLL;
  39.     Delay(2);
  40.                 }

  41. /******************************
  42.                 讀取ADC
  43. ******************************/
  44. unsigned char GetADCResult(unsigned char ch)
  45.         {
  46.                 ADC_CONTR=ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  47.                 _nop_();
  48.                 _nop_();
  49.                 _nop_();
  50.                 _nop_();
  51.                 while (!(ADC_CONTR & ADC_FLAG));
  52.                 ADC_CONTR &=~ADC_FLAG;
  53.                 return ADC_RES;
  54.                 }

  55. /******************************
  56.                 LCD忙檢測
  57. ******************************/
  58. void CheckBusy(void)
  59.         {
  60.                 unsigned int nTimeOut=0;
  61.                 RS=0;
  62.                 RW=1;
  63.                 E=0;
  64.                 E=1;
  65.                 while((LCD&0x80)&&(++nTimeOut !=0));
  66.                 E=0;
  67.                 RS=0;
  68.                 RW=1;
  69.         }

  70. /******************************
  71.                 LCD發(fā)送命令或數(shù)據(jù)
  72. ******************************/
  73. void SendCmdorData(unsigned char byCmdorData,bit DI)
  74.         {
  75.                 CheckBusy();
  76.                 RS=DI;
  77.                 RW=0;
  78.                 E=0;
  79.                 LCD=byCmdorData;
  80.                 Delay(5);
  81.                 E=1;
  82.                 Delay(5);
  83.                 E=0;
  84.                 RW=1;
  85.                 RS=0;
  86.         }

  87. /******************************
  88.                 LCD初始化子
  89. ******************************/
  90. void Init(void)
  91.         {
  92.                 SendCmdorData(0x38,0);
  93.                 Delay(50);
  94.                 SendCmdorData(0x01,0);
  95.                 Delay(50);
  96.                 SendCmdorData(0x06,0);
  97.                 Delay(50);
  98.                 SendCmdorData(0x0c,0);
  99.                 Delay(50);
  100.         }

  101. /******************************
  102.                 地址轉(zhuǎn)換
  103. ******************************/
  104. void SetAddress(unsigned char x,y)
  105.         {
  106.                 unsigned char byAddress;
  107.                 switch(x)
  108.                         {
  109.                         case 1:
  110.                                 byAddress=0x80+y;
  111.                         break;
  112.                         case 2:
  113.                                 byAddress=0xC0+y;
  114.                         break;
  115.                         default:break;
  116.                         }
  117.                         SendCmdorData(byAddress,0);
  118.         }
復制代碼
所有資料51hei提供下載:
5.zip (1.43 KB, 下載次數(shù): 175)





作者: snygah    時間: 2020-9-16 11:33
樓主有完整的keil工程文件嗎?
作者: snygah    時間: 2020-9-16 11:33
樓主,有完整的keil工程文件嗎?
作者: luo_yb168    時間: 2020-10-30 07:30
用不了哦
作者: chang199202    時間: 2020-11-10 00:19
這么巧我用的開發(fā)板跟你一樣的
作者: chang199202    時間: 2020-11-10 01:39
可以用,跟樓主一樣的開發(fā)板,由于原來的lcd排針占用了p1口所以要改針腳。按照樓主的引腳接線完全沒有問題
作者: rambo.hu    時間: 2020-12-2 22:26
這個程序是完整的嗎?頭文件樓主是自己改過了嗎?STC12C5A60S2 不是這個頭文件嗎?
作者: 405616736    時間: 2022-3-28 01:02
snygah 發(fā)表于 2020-9-16 11:33
樓主有完整的keil工程文件嗎?

有的,附近里面有
作者: 405616736    時間: 2022-3-28 01:02
luo_yb168 發(fā)表于 2020-10-30 07:30
用不了哦

可以用吧,我都測試過的
作者: 405616736    時間: 2022-3-28 01:02
chang199202 發(fā)表于 2020-11-10 00:19
這么巧我用的開發(fā)板跟你一樣的

哈哈哈,淘寶就這個便宜
作者: 405616736    時間: 2022-3-28 01:03
chang199202 發(fā)表于 2020-11-10 01:39
可以用,跟樓主一樣的開發(fā)板,由于原來的lcd排針占用了p1口所以要改針腳。按照樓主的引腳接線完全沒有問題

嗯嗯,程序里面我標注好的了,改一下就可以用了
作者: 405616736    時間: 2022-3-28 01:03
本帖最后由 405616736 于 2022-3-28 18:14 編輯
rambo.hu 發(fā)表于 2020-12-2 22:26
這個程序是完整的嗎?頭文件樓主是自己改過了嗎?STC12C5A60S2 不是這個頭文件嗎?

附件里面的是完整的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1