#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint adc_finished;
float a;
uchar shi,ge,bai;
int b;
sfr adc_contr=0xbc;//adc控制寄存器,不可位尋址,用或運算來設置
sfr adc_res=0xbd;//轉換結果寄存器,高八位
sfr adc_low2=0xbe;//轉換結果寄存器,低兩位
sfr p1asf=0x9d;//設置p1的那一口為輸入口,不可位尋址.
/*以下都是控制寄存器的各位地址*/
#define adc_power 0x80;//adc電源,第7位
#define adc_flag 0x10;//轉換結束標志位,第4位
#define adc_start 0x08;//轉換開始,第3位
#define adc_speedll 0x00;//速度位,第5,6位
#define adc_speedl 0x20;
#define adc_speedh 0x40;
#define adc_speedhh 0x60;
#define adc_chs 0x00;//輸入通道為第p1.0,1,2,3三位可設置p10-p17
//位定義完成
void adcinit() //adc初始化函數
{
p1asf=0x01; //設置p10 為ad轉換輸入口
adc_contr=0xe0; //打開電源,設最高速度
_nop_();
_nop_(); //設置好ADC控制寄存器之后要加>4us
_nop_(); //的延時才能繼續正確讀取ADC控制寄存器的值
_nop_();
adc_contr|=adc_chs; //設置頻道
_nop_();
_nop_(); //設置好ADC控制寄存器之后要加>4us
_nop_(); //的延時才能繼續正確讀取ADC控制寄存器的值
_nop_();
}
uint huqushuju() //adc轉換函數,數據得到
{
adcinit();
adc_res=0;
adc_low2=0;
adc_contr|=adc_start;//啟動ad轉換,置1為起動,轉換結束后自動置0
_nop_();
_nop_();
_nop_();
_nop_();
adc_finished=0;
while(adc_finished==0)
{
adc_finished=adc_contr&adc_flag;//檢測是否轉換結束,沒結束一直等
}
adc_contr=adc_contr&0xef;//轉換結束標志清零
//也可寫成
_nop_();
_nop_(); //設置好ADC控制寄存器之后要加>4us
_nop_(); //的延時才能繼續正確讀取ADC控制寄存器的值
_nop_();
a=adc_res*4+adc_low2;
a=a*5/1023;
a=100-20*a;
a=a*10;
adc_contr|=adc_start;
_nop_();
_nop_(); //設置好ADC控制寄存器之后要加>4us
_nop_(); //的延時才能繼續正確讀取ADC控制寄存器的值
_nop_();
return a;
}
void display(uchar bai,uchar shi,uchar ge)
{
uint i,t;
for(i=0;i<3;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=table[ge]; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; P0=table[shi];break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0;P0=table[bai]; break;//顯示第2位
}
t=1000;
while(t--);
}
}
void main()
{
while(1)
{
b=(int)a;
ge=b%10;
shi=b/10/10;
bai=b/100;
display(bai,shi,ge);
}
}
這是我的程序 但是數碼管顯示000 模擬信號沒問題
|