找回密码
 立即注册

QQ登录

只需一步,快速开始

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

3位数码管电压表 pcb 原理图 程序都有

  [复制链接]
跳转到指定楼层
楼主

//3位数码电压表
//电压范围:0-50V
//原理:比较器做为ADC
//共阴数码管
//5V稳定性越高,测量的电压越准确

PCB用PADS打开.7z (53.35 KB, 下载次数: 450)

程序如下:
  1. //3位数码电压表
  2. //电压范围:0-50V
  3. //原理:比较器做为ADC
  4. //共阴数码管
  5. //5V稳定性越高,测量的电压越准确
  6. #include "stc15w204s.h"
  7. #include "Led_can.h"
  8. typedef unsigned long u32;  //32位无符号整型数
  9. typedef unsigned int u16;  //16位无符号整型数
  10. typedef unsigned char u8;  //8位无符号整型数

  11. #define MAIN_Fosc                22118400        //定义主时钟
  12. #define        ADC_SCALE                50000                //ADC满量程, 根据需要设置



  13. /*************        本地常量声明        **************/

  14. //CMPCR1
  15. #define        CMPEN        0x80        //1: 允许比较器, 0: 禁止,关闭比较器电源
  16. #define        CMPIF        0x40        //比较器中断标志, 包括上升沿或下降沿中断, 软件清0
  17. #define        PIE                0x20        //1: 比较结果由0变1, 产生上升沿中断
  18. #define        NIE                0x10        //1: 比较结果由1变0, 产生下降沿中断
  19. #define        PIS                0x08        //输入正极性选择, 0: 选择内部P5.5做正输入,           1: 由ADCIS[2:0]所选择的ADC输入端做正输入.
  20. #define        NIS                0x04        //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入, 1: 选择外部P5.4做输入.
  21. #define        CMPOE        0x02        //1: 允许比较结果输出到P1.2, 0: 禁止.
  22. #define        CMPRES        0x01        //比较结果, 1: CMP+电平高于CMP-,  0: CMP+电平低于CMP-,  只读

  23. //CMPCR2
  24. #define        INVCMPO        0x80        //1: 比较器输出取反,  0: 不取反
  25. #define        DISFLT        0x40        //1: 关闭0.1uF滤波,   0: 允许
  26. #define        LCDTY        0x00        //0~63, 比较结果变化延时周期数


  27. #define        Pin0                0x01        //IO引脚 Px.0
  28. #define        Pin1                0x02        //IO引脚 Px.1
  29. #define        Pin2                0x04        //IO引脚 Px.2
  30. #define        Pin3                0x08        //IO引脚 Px.3
  31. #define        Pin4                0x10        //IO引脚 Px.4
  32. #define        Pin5                0x20        //IO引脚 Px.5
  33. #define        Pin6                0x40        //IO引脚 Px.6
  34. #define        Pin7                0x80        //IO引脚 Px.7
  35. #define        PinAll                0xFF        //IO所有引脚
  36. /*************        本地变量声明        **************/
  37. sbit        P_ADC        = P1^5;        //P1.5 比较器转IO输出端
  38. u16                adc;                        //ADC中间值, 用户层不可见
  39. u16                adc_duty;                //ADC计数周期, 用户层不可见
  40. u16                adc_value;                //ADC值, 用户层使用
  41. bit                adc_ok;                        //ADC结束标志, 为1则adc_value的值可用. 此标志给用户层查询,并且清0

  42. /*************        本地函数声明        **************/
  43. void ConfigTimer0();
  44. void ConfigTimer2(u8 ms);

  45. void main(void)
  46. {
  47.         
  48. //IO口初始化

  49.         P1M0 |= (Pin0+Pin1+Pin5);   //P1.0 P1.1 P1.5脚定义为推挽模式
  50.         P3M0 |= (Pin0+Pin1+Pin2+Pin3+Pin6+Pin7);   //P3.0-P3.7脚定义为推挽模式
  51.         P5M1 |= Pin4+Pin5;          //P5.4 P5.5设置为高阻输入
  52.         

  53. //比较器初始化
  54.         CMPCR1 = 0;
  55.         CMPCR2 = 20;                //比较结果变化延时周期数, 0~63
  56.         CMPCR1 |= CMPEN;        //允许比较器                ENABLE,DISABLE
  57. //        CMPCR1 |= PIE;                //允许上升沿中断        ENABLE,DISABLE
  58. //        CMPCR1 |= NIE;                //允许下降沿中断        ENABLE,DISABLE
  59. //        CMPCR1 |= PIS;                //输入正极性选择, 0: 选择内部P5.5做正输入,           1: 由ADCIS[2:0]所选择的ADC输入端做正输入.
  60.         CMPCR1 |= NIS;                //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入, 1: 选择外部P5.4做输入
  61. //        CMPCR1 |= CMPOE;        //允许比较结果输出到P1.2,   ENABLE,DISABLE
  62. //        CMPCR2 |= INVCMPO;        //比较器输出取反,         ENABLE,DISABLE
  63.         CMPCR2 |= DISFLT;        //内部0.1uF滤波,          ENABLE,DISABLE



  64.         ConfigTimer0();
  65.         ConfigTimer2(5);
  66.         EA = 1;                        //允许全局中断

  67.         while (1)
  68.         {
  69.                
  70.                 if(adc_ok)                //等待ADC结束
  71.                 {
  72.                         adc_ok = 0;                                //清除ADC已结束标志                                
  73.                         Led_buff[0] = Led_Char[adc_value / 10000 % 10];
  74.                         Led_buff[1] = Led_Char[adc_value / 1000 % 10];
  75.                         Led_buff[1] &= 0x7f;   //加小数点
  76.                         Led_buff[2] = Led_Char[adc_value / 100 % 10];

  77.                 }
  78.         }
  79. }

  80. /* 配置并启动T0,10us定时时间 */
  81. void ConfigTimer0()
  82. {
  83.         AUXR |= 0x80;                //定时器时钟1T模式
  84.         TMOD &= 0xF0;                //设置定时器模式
  85.         TL0 = 0x23;                //设置定时初值 10微秒@22.1184MHz
  86.         TH0 = 0xFF;                //设置定时初值
  87.         TF0 = 0;                //清除TF0标志
  88.         ET0 = 1;                //允许中断
  89.         PT0 = 1;                //高优先级中断
  90.         TR0 = 1;                //开始运行
  91. }

  92. /* 配置并启动T2,ms-T2定时时间 */
  93. void ConfigTimer2(u8 ms)
  94. {
  95.     u32 tmp;  //临时变量
  96.    
  97.     tmp = MAIN_Fosc / 12;      //定时器计数频率
  98.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  99.     tmp = 65536 - tmp;        //计算定时器重载值
  100.     tmp = tmp + 18;           //补偿中断响应延时造成的误差
  101.     T2H = (u8)(tmp>>8);  //定时器重载值拆分为高低字节
  102.     T2L = (u8)tmp;
  103.            
  104.         AUXR &= 0xEF;  // 启动T2定时器  方式 :16位重装模式计数器
  105.         AUXR |= 0x10;  // 启动T2定时器
  106.            IE2 &= 0xFB;  // 使能T2中断
  107.         IE2 |= 0x04;  // 使能T2中断
  108.            
  109.     //ET2 = 1;        //使能T2中断
  110.     //T2R = 1;        //启动T2定时器
  111. }


  112. /********************* Timer0中断函数************************/
  113. void timer0_int () interrupt 1
  114. {
  115.         if((CMPCR1 & CMPRES) == 0)        P_ADC = 0;        //比较器输出高电平
  116.         else                                //P_ADC输出低电平, 给负输入端做反馈.
  117.         {
  118.                 P_ADC = 1;                        //P_ADC输出高电平, 给负输入端做反馈.
  119.                 adc ++;        //ADC计数+1
  120.         }

  121.         if(--adc_duty == 0)                        //ADC周期-1, 到0则ADC结束
  122.         {
  123.                 adc_duty = ADC_SCALE;        //周期计数赋初值
  124.                 adc_value = adc;                //保存ADC值
  125.                 adc = 0;                                //清除ADC值
  126.                 adc_ok = 1;                                //标志ADC已结束
  127.         }
  128. }

  129. /* T0中断服务函数,执行数码管扫描显示 */
  130. void InterruptTimer2() interrupt 12
  131. {               
  132.    Led_can();
  133.    WDT_CONTR=0x36;             //喂狗 2S

  134. }
复制代码


评分

参与人数 4黑币 +115 收起 理由
0668866 + 5 绝世好帖!赞一个!
admin + 100 共享资料的黑币奖励!
xmd1972 + 5 共享资料的黑币奖励!
杨雪飞 + 5 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:57657 发表于 2016-9-22 07:11 | 只看该作者
P1.1连接的接线名是P35,应该改成P11,以此类推。
另外78L05的极限输入电压是18v,电流100ma,是不可能直接输入50v的,否则会炸管,应该取9v到15v的的电源进行供电。
回复

使用道具 举报

板凳
ID:141494 发表于 2016-10-6 20:45 | 只看该作者
一直用7107的
回复

使用道具 举报

地板
ID:76408 发表于 2019-8-13 12:01 | 只看该作者
楼主这个程序能不能改成测量0-500v的?谢谢
回复

使用道具 举报

5#
ID:34298 发表于 2020-3-5 19:33 | 只看该作者
应该是共阳数码管吧
回复

使用道具 举报

6#
ID:51443 发表于 2020-3-27 18:51 | 只看该作者
这个原理图设计是为了省那五个300欧电吧
回复

使用道具 举报

7#
ID:51443 发表于 2020-4-8 07:36 | 只看该作者
地方错了
回复

使用道具 举报

8#
ID:859799 发表于 2020-12-16 22:25 | 只看该作者
楼楼请问有仿真图吗
回复

使用道具 举报

9#
ID:868717 发表于 2020-12-27 13:05 | 只看该作者

这里边的程序没有蜂鸣的
回复

使用道具 举报

10#
ID:319331 发表于 2021-8-16 16:08 | 只看该作者
下载下来研究一下,改成0-10v输入显示对应比例放大,不知道行不行
回复

使用道具 举报

11#
ID:319331 发表于 2021-8-16 16:11 | 只看该作者
为什么我下载了原理图和pcb打开啥也没有0.0,14版本的ad
回复

使用道具 举报

12#
ID:466595 发表于 2023-4-6 22:44 | 只看该作者
大佬,AD19打开什么都没有啊
回复

使用道具 举报

13#
ID:61493 发表于 2023-10-1 15:19 | 只看该作者
祝坛友们双节快乐!
回复

使用道具 举报

14#
ID:281040 发表于 2023-10-2 10:29 | 只看该作者

祝坛友们双节快乐!
回复

使用道具 举报

15#
ID:870445 发表于 2023-10-11 18:45 | 只看该作者
有做成的吗,出来冒个泡,希望大家都成功,
回复

使用道具 举报

16#
ID:890642 发表于 2023-12-23 05:43 | 只看该作者
绝对的好帖子
回复

使用道具 举报

17#
ID:71233 发表于 2023-12-23 14:39 | 只看该作者
楼主用的芯片是STC的?
回复

使用道具 举报

18#
ID:1078115 发表于 2023-12-23 15:43 | 只看该作者
原理图和PCB需要用PADS才能打开
回复

使用道具 举报

19#
ID:72088 发表于 2024-2-13 08:37 | 只看该作者
分压电阻就有问题,浪费电阻和空间。设计成65V多好,两个精密电阻分压就搞定了,你原理图用这么多电阻精度还是有误差,我发的帖子看看,做成95V,65V
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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