找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自制单片机STC12C5A60S2+1602电压表

[复制链接]
跳转到指定楼层
楼主
本帖最后由 405616736 于 2020-4-25 10:14 编辑

LCD1602 D0~D7接P0口,RS=P3.1,RW=P3.2,sbit E=P3.3。
电压测试口接P1.0。供电电压要稳定5V才能准确测量。另外因为没有加电阻,只能测5V以下电压。
废话少说,直接上实物图。



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

  3. #define LCD P0                //LCD1602数据接口
  4. sbit RS=P3^1;                //设置RS引脚接口,RS=0,指令寄存器;RS=1,数据寄存器
  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.                 延时函数
  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发送命令或数据
  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.                 地址转换
  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, 下载次数: 61)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
snygah 发表于 2020-9-16 11:33 | 只看该作者
楼主有完整的keil工程文件吗?
回复

使用道具 举报

板凳
snygah 发表于 2020-9-16 11:33 | 只看该作者
楼主,有完整的keil工程文件吗?
回复

使用道具 举报

地板
luo_yb168 发表于 2020-10-30 07:30 | 只看该作者
用不了哦
回复

使用道具 举报

5#
chang199202 发表于 2020-11-10 00:19 | 只看该作者
这么巧我用的开发板跟你一样的
回复

使用道具 举报

6#
chang199202 发表于 2020-11-10 01:39 | 只看该作者
可以用,跟楼主一样的开发板,由于原来的lcd排针占用了p1口所以要改针脚。按照楼主的引脚接线完全没有问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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