找回密码
 立即注册

QQ登录

只需一步,快速开始

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

实现数字电压表,通过液晶显示测量的电压值,电路形式可以变化

[复制链接]
ID:1147107 发表于 2025-4-4 19:36 | 显示全部楼层 |阅读模式
要求如图的,提供keil代码就可以, 麻烦各位大佬!
1.png
回复

使用道具 举报

ID:879809 发表于 2025-4-5 10:34 | 显示全部楼层
这么简单的东西还要别人提供代码你还是改行吧。
回复

使用道具 举报

ID:1147107 发表于 2025-4-5 19:26 | 显示全部楼层
rundstedt 发表于 2025-4-5 10:34
这么简单的东西还要别人提供代码你还是改行吧。

学习需要 并非专业
回复

使用道具 举报

无效楼层,该帖已经被删除
ID:731755 发表于 2025-4-6 07:06 来自手机 | 显示全部楼层
小耿666 发表于 2025-4-5 19:27
呵呵,你行你上啊?

年轻人,说话要有礼貌,在论坛里混的人好多都是大哥级别的人,求人要有个求人的态度。明白?
回复

使用道具 举报

ID:940483 发表于 2025-4-8 16:39 | 显示全部楼层
这个是8路巡检的,你自己根据需要截取吧。
  1. #include "reg52.h"
  2. #define TIME0H 0x3C
  3. #define TIME0L 0xB0
  4. #define OUTPORT P2
  5. #define LCDPORT P0

  6. sbit LCDRS = P3^0;
  7. sbit LCDRW = P3^1;
  8. sbit LCDE  = P3^2;
  9. sbit START = P3^4;
  10. sbit EOC   = P3^3;

  11. unsigned char uc_Clock = 0;
  12. bit b_DATransform = 0;

  13. /* LCD 基础操作 */
  14. void vDelay() {
  15.     unsigned char uc = 10;
  16.     while(uc--);
  17. }

  18. void vWriteCMD(unsigned char ucCommand) {
  19.     LCDRS = 0;
  20.     LCDRW = 0;
  21.     LCDPORT = ucCommand;
  22.     LCDE = 1;
  23.     vDelay();
  24.     LCDE = 0;
  25. }

  26. void vWriteData(unsigned char ucData) {
  27.     LCDRS = 1;
  28.     LCDRW = 0;
  29.     LCDPORT = ucData;
  30.     LCDE = 1;
  31.     vDelay();
  32.     LCDE = 0;
  33. }

  34. /* LCD 显示功能 */
  35. void vShowOneChar(unsigned char ucChar) {
  36.     vWriteData(ucChar);
  37. }

  38. void vShowStr(const unsigned char *pStr) {
  39.     while(*pStr) {
  40.         vShowOneChar(*pStr++);
  41.     }
  42. }

  43. /* ADC 转换 */
  44. unsigned int uiADTransform() {
  45.     START = 1;
  46.     START = 0;
  47.     while(!EOC);                // 等待转换完成
  48.     return (100UL * OUTPORT) / 51; // 优化计算过程
  49. }

  50. /* 数值显示 */
  51. void vShowVoltage(unsigned int uiVolt) {
  52.     unsigned char digits[3];
  53.    
  54.     digits[0] = uiVolt / 100;
  55.     uiVolt %= 100;
  56.     digits[1] = uiVolt / 10;
  57.     digits[2] = uiVolt % 10;

  58.     vShowOneChar(digits[0] + '0');
  59.     vShowOneChar('.');
  60.     vShowOneChar(digits[1] + '0');
  61.     vShowOneChar(digits[2] + '0');
  62. }

  63. /* 定时器中断 */
  64. void Time0() interrupt 1 {
  65.     TH0 = TIME0H;
  66.     TL0 = TIME0L;
  67.    
  68.     if(--uc_Clock == 0) {
  69.         uc_Clock = 20;
  70.         b_DATransform = 1;
  71.     }
  72. }

  73. /* 主程序 */
  74. void main() {
  75.     unsigned char channel = 0;
  76.    
  77.     // 定时器初始化
  78.     TMOD = 0x01;
  79.     TH0 = TIME0H;
  80.     TL0 = TIME0L;
  81.     TR0 = 1;
  82.     ET0 = 1;
  83.     EA = 1;

  84.     // LCD 初始化
  85.     vWriteCMD(0x01);  // 清屏
  86.     vWriteCMD(0x38);  // 8位模式
  87.     vWriteCMD(0x0C);  // 显示开
  88.     vWriteCMD(0x84);  // 第一行位置
  89.     vShowStr("RONALDO:");//通道数
  90.     vWriteCMD(0xC4);  // 第二行位置
  91.     vShowStr("V");

  92.     while(1) {
  93.         if(b_DATransform) {
  94.             P1 = channel;  // 设置当前通道
  95.             
  96.             // 更新通道显示
  97.             vWriteCMD(0x8C);
  98.             vShowOneChar(channel + '1');
  99.             
  100.             // 显示电压值
  101.             vWriteCMD(0xC8);
  102.             vShowVoltage(uiADTransform());

  103.             // 切换通道
  104.             if(++channel >= 8) channel = 0;
  105.             b_DATransform = 0;
  106.         }
  107.     }
  108. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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