|
1488343160889_編輯.jpg (595.79 KB, 下載次數: 248)
下載附件
2017-3-1 12:50 上傳
1488343178717_編輯.jpg (625.81 KB, 下載次數: 233)
下載附件
2017-3-1 12:50 上傳
電壓表頭.png (21.03 KB, 下載次數: 225)
下載附件
2017-3-1 12:50 上傳
做的電壓表頭,受限于單片機的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);
- ………余下程序請下載附件………
復制代碼
0.png (69.63 KB, 下載次數: 232)
下載附件
2017-3-1 22:15 上傳
完整代碼下載:
電壓表頭.rar
(27.61 KB, 下載次數: 561)
2017-3-1 12:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|