|
做的电压表头,受限于单片机的AD转换精度是10位的,用5V电源,分辨率只有5MV.加了电流取样电路,也可以作为电流检测使用。如果需要高精度。设置了2.5V的431取样电路,可以把电源的变动矫正过来。也可以作为低电压检测用
源程序:
- /* 采用STC15W401AS单片机。12M晶振。三位数码管显示电压值。*/
-
- #include "STC15F408.h"
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ADC_POWER 0x80 //AD电源控制位
- #define ADC_FLAG 0x10 //转换结束标志位。1 结束
- #define ADC_START 0x08 //开始转换位
- #define ADC_SPEEDLL 0x00 //转换速度540个时钟
- uchar ADC_POSITION; //0x00 AD通道位置P1.0, 0x01 AD通道位置P1.1
- sbit bai=P1^2;
- sbit shi=P1^4;
- sbit ge=P1^5;
- uchar s1,sec;
- uint adval=0; //AD转换值
- uint show; //电压值
- uint show1; //基准电压
- uchar code table[]={0xF5,0x05,0xD3,0x57,0x27,0x76,0xF6,0x15,0xF7,0x77,0x40}; //P3数码管数字0-9
- uchar code table1[]={0xFD,0x0D,0xDB,0x5F,0x2F,0x7E,0xFE,0x1D,0xFF,0x7F,0x40}; //P3数码管数字0-9带小数点
- /*****************************************
- 系统初始化
- *****************************************/
- void system_init(void)
- {
-
- TMOD=0x01; //定时器0工作在方式1,的定时模式
- ET0=1; //定时器0中断允许
- EA=1; //系统中断允许
- TR0=1; //定时器1和定时器0开始定时
- TH0=(65536-30000)/256; //定时器0的初值30ms
- TL0=(65536-30000)%256;
- sec=59;
- P3M1=0x00;
- P3M0=0xff;
- P5M1=0x00;
- P5M0=0xff;
- P1M1=0x00;
- P1M0=0x1c;
- }
- /********************************************************
- * 函数名称:delay
- * 输 入:z 延时时间
- * 输 出:无
- * 功能描述: 毫秒级延时
- ********************************************************/
- void delay(uchar n) //延时n ms
- {
- uchar a,b,c;
- for(c=n;c>0;c--)
- for(b=222;b>0;b--)
- for(a=12;a>0;a--);
- }
- /********************显示温度值***************************/
- void display()
- {
- uchar c,d,e,f;
- uint su;
- if(show1>850)
- c=d=e=10;
- else
- {
- su=show;
- c=su/100; //分离温度的各位数值
- f=su%100;
- d=f/10;
- e=f%10;
- }
- P3=table1[c]; //显示百位
- P5=table[c];
- bai=1;
- delay(5);
- bai=0;
-
- P3=table[d]; //显示十位
- P5=table[d];
- shi=1;
- delay(5);
- shi=0;
-
- P3=table[e]; //显示个位
- P5=table[e];
- ge=1;
- delay(5);
- ge=0;
-
- }
- /*****************************************************
- ** 函数名称: void adc_isr() interrupt 5
- ** 功能描述: AD中断,获取AD数据
- ** 输 入: 无
- ** 输 出: show
- ** 全局变量: show
- ** 调用模块: Delay_ms
- ********************************************************/
- get_ad()
- {
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_POSITION; //启动ADC转换
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- //默认ADRJ=0; 高8位+低2位
- while(!(ADC_CONTR & ADC_FLAG)); //等待ADC转换结束
- ADC_CONTR &= ~ADC_FLAG; //必须软件清0
- adval=ADC_RES; //00000000 00000011 高8位
- adval=ADC_RES<<2|ADC_RESL; //00000011 11111111 右对齐 高8位+低2位 // a|b;
- adval=adval/1.024;
- return (adval);
- }
- /******************取20次AD转换值 求平均值*****************/
- AD_work()
- {
- uint advalf=0; //定义处理后的数值AD_val为浮点数
- uchar i;
- for(i=0;i<50;i++)
- {
- advalf=advalf+get_ad(); //转换20次求平均值(提高精度)
- delay(2);
- ………余下程序请下载附件………
复制代码
完整代码下载:
电压表头.rar
(27.61 KB, 下载次数: 561)
|
评分
-
查看全部评分
|