标题: 3位数码管电压表 pcb 原理图 程序都有 [打印本页]

作者: 0o000000    时间: 2016-9-21 20:58
标题: 3位数码管电压表 pcb 原理图 程序都有

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

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

程序如下:
  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. }
复制代码



作者: npn    时间: 2016-9-22 07:11
P1.1连接的接线名是P35,应该改成P11,以此类推。
另外78L05的极限输入电压是18v,电流100ma,是不可能直接输入50v的,否则会炸管,应该取9v到15v的的电源进行供电。
作者: whsy138    时间: 2016-10-6 20:45
一直用7107的
作者: 成森林    时间: 2019-8-13 12:01
楼主这个程序能不能改成测量0-500v的?谢谢
作者: fancunwu    时间: 2020-3-5 19:33
应该是共阳数码管吧

作者: 职教电子    时间: 2020-3-27 18:51
这个原理图设计是为了省那五个300欧电吧
作者: 职教电子    时间: 2020-4-8 07:36
地方错了
作者: 蜡笔小新2727    时间: 2020-12-16 22:25
楼楼请问有仿真图吗
作者: 试卷313    时间: 2020-12-27 13:05

这里边的程序没有蜂鸣的
作者: lcl1260519806    时间: 2021-8-16 16:08
下载下来研究一下,改成0-10v输入显示对应比例放大,不知道行不行
作者: lcl1260519806    时间: 2021-8-16 16:11
为什么我下载了原理图和pcb打开啥也没有0.0,14版本的ad
作者: 天使的眼泪    时间: 2023-4-6 22:44
大佬,AD19打开什么都没有啊
作者: vivianb    时间: 2023-10-1 15:19
祝坛友们双节快乐!
作者: 科林科技    时间: 2023-10-2 10:29

祝坛友们双节快乐!
作者: xlhlydd    时间: 2023-10-11 18:45
有做成的吗,出来冒个泡,希望大家都成功,
作者: huangguanhua    时间: 2023-12-23 05:43
绝对的好帖子
作者: lmn2005    时间: 2023-12-23 14:39
楼主用的芯片是STC的?
作者: happysxk    时间: 2023-12-23 15:43
原理图和PCB需要用PADS才能打开
作者: 新乡家电维修    时间: 2024-2-13 08:37
分压电阻就有问题,浪费电阻和空间。设计成65V多好,两个精密电阻分压就搞定了,你原理图用这么多电阻精度还是有误差,我发的帖子看看,做成95V,65V





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1