找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4066|回复: 4
收起左侧

STC15F2K60S2单片机数字电压表制作(不用外围A/D换换)附源程序

[复制链接]
ID:611102 发表于 2020-6-17 21:19 | 显示全部楼层 |阅读模式
最近做了一个用STC15系列单片机内部A/D转换做的数字电压表,1602显示。就想着实现硬件很少,就做着玩玩。

制作出来的实物图如下:

实物图

实物图


`TWJXOWH`_H3}A)A@AK6~]W.png @2DCKK]3GZ6Z0R2`W[[Y@VF.png 8~MX)U[69SU0EJZE80XA)QB.png
把硬件原理图及源程序资料分享一下
  1. #include <STC15F2K60S2.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. unsigned char data adc_datah; //定义保存AD转换结果的绝对地址
  6. unsigned char data adc_datal;

  7. #define LCD1602_DB P2
  8. sbit LCD1602_RS = P4^1;
  9. sbit LCD1602_RW = P4^2;
  10. sbit LCD1602_E = P4^4;

  11. unsigned long int mn0,mn1,mn3,mn4,mn5,mn6,mn7;

  12. void InitLcd1602();
  13. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  14. uchar *tab0[10]={"0","1","2","3","4","5","6","7","8","9"};

  15.   /*** 等待液晶准备好***/
  16. void LcdWaitReady()
  17.         {
  18.             unsigned char sta;
  19.             LCD1602_DB = 0xFF;
  20.             LCD1602_RS = 0;
  21.             LCD1602_RW = 1;
  22.             do         {
  23.                 LCD1602_E = 1;
  24.                 sta = LCD1602_DB;                 //读取状态字
  25.                 LCD1602_E = 0;
  26.                     }while (sta & 0x80);         //bit7 等于 1 表示液晶正忙,重复检测直到其等于 0 为止
  27.         }
  28. /* 向 LCD1602 液晶写入一字节命令,cmd-待写入命令值 */
  29. void LcdWriteCmd(unsigned char cmd)
  30.         {
  31.             LcdWaitReady();
  32.             LCD1602_RS = 0;
  33.             LCD1602_RW = 0;
  34.             LCD1602_DB = cmd;
  35.             LCD1602_E = 1;
  36.             LCD1602_E = 0;
  37.         }
  38. /* 向 LCD1602 液晶写入一字节数据,dat-待写入数据值 */
  39. void LcdWriteDat(unsigned char dat)
  40.         {
  41.             LcdWaitReady();
  42.             LCD1602_RS = 1;
  43.             LCD1602_RW = 0;
  44.             LCD1602_DB = dat;
  45.             LCD1602_E = 1;
  46.             LCD1602_E = 0;
  47.         }
  48. /* 设置显示 RAM 起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
  49. void LcdSetCursor(unsigned char x, unsigned char y)
  50.         {
  51.             unsigned char addr;
  52.             if (y == 0){ //由输入的屏幕坐标计算显示 RAM 的地址
  53.                 addr = 0x00 + x; //第一行字符地址从 0x00 起始
  54.             }else{
  55.                 addr = 0x40 + x; //第二行字符地址从 0x40 起始
  56.             }
  57.             LcdWriteCmd(addr | 0x80); //设置 RAM 地址
  58.         }
  59. /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
  60. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
  61.         {
  62.             LcdSetCursor(x, y); //设置起始地址
  63.             while (*str !=0)
  64.                 { //连续写入字符串数据,直到检测到结束符
  65.                 LcdWriteDat(*str++); //先取 str 指向的数据,然后 str 自加 1
  66.             }
  67.         }
  68. /* 初始化 1602 液晶 */
  69. void InitLcd1602()
  70.         {
  71.             LcdWriteCmd(0x38); //16*2 显示,5*7 点阵,8 位数据接口
  72.             LcdWriteCmd(0x0C); //显示器开,光标关闭
  73.             LcdWriteCmd(0x06); //文字不动,地址自动+1
  74.             LcdWriteCmd(0x01); //清屏
  75.         }
  76. void UartInit()                //9600bps@11.0592MHz
  77. {
  78.         SCON = 0x50;                //8位数据,可变波特率
  79.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  80.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  81.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  82.         TL1 = 0xE0;                //设定定时初值
  83.         TH1 = 0xFE;                //设定定时初值
  84.         ET1 = 0;                //禁止定时器1中断

  85.         ES=1;
  86.         EA=1;
  87.          TR1 = 1;                //启动定时器1
  88. }                 

  89. void Usart_init() interrupt 4
  90. {
  91. uint dataa;
  92. dataa=SBUF;
  93. mn3=dataa;
  94. RI=0;
  95. //SBUF=dataa;
  96. while(!TI);
  97. TI=0;

  98. }
  99. void main()
  100.         {
  101.         uint dataa;
  102.         UartInit();
  103.         InitLcd1602();
  104.     LcdShowStr(0, 0,"home:");
  105.         while(1)
  106.         {
  107.         
  108. //        mn3=123;
  109.     LcdShowStr(6, 0,tab0[mn3/100]);
  110.         LcdShowStr(7, 0,tab0[(mn3%100)/10]);
  111.         LcdShowStr(8, 0,tab0[mn3%10]);        

  112.         }
  113.         }
复制代码
设计文档51hei下载:
基于STC15数字电压表设计.doc (3.37 MB, 下载次数: 91)

评分

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

查看全部评分

回复

使用道具 举报

ID:592145 发表于 2020-8-11 18:11 | 显示全部楼层
LCD1602可以正常显示?STC15F2K60S2的运行速度不是比LCD1602快吗?
回复

使用道具 举报

ID:97023 发表于 2020-11-20 15:04 | 显示全部楼层
在软件中,没有ADC模块的部分。
回复

使用道具 举报

ID:848043 发表于 2020-11-23 22:49 | 显示全部楼层
这能用C++来写吗?
回复

使用道具 举报

ID:852236 发表于 2020-12-2 22:10 | 显示全部楼层
不知道AD部分怎么写
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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