|
給你寫個簡單示例程序程序,仿真圖不代表實際電路,實際數(shù)碼管電路要加限流電阻。
無標(biāo)題.jpg (147.21 KB, 下載次數(shù): 67)
下載附件
2019-1-8 14:09 上傳
#include <STC12C5A60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit V1 = P3^0;
sbit V2 = P3^1;
sbit V3 = P3^2;
sbit V4 = P3^3;
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks
uchar code table[]={//數(shù)碼管數(shù)組0~F.V
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x3e};
uchar Cnt250us;
uint V_CY;
void Delay(uint n);
void Timer0Init();
void ShowResult();
void InitADC();
uint GetADCResult(uchar ch);
void LB_ADC();
void display();
void main()
{
P1M1 = 0x01; //設(shè)置P1.0高阻:ADC輸入高阻
P1M0 = 0x00; //設(shè)置P1.0高阻:ADC輸入高阻
P2M1 = 0x00; //設(shè)置P2.0~2.7推挽
P2M0 = 0xFF; //設(shè)置P2.0~2.7推挽
P3M1 = 0x00; //設(shè)置P3.0~3.3推挽
P3M0 = 0x0F; //設(shè)置P3.0~3.3推挽
Timer0Init();
InitADC(); //Init ADC sfr
while(1)
{
ShowResult();
}
}
void Timer0Init() //250微秒@11.0592MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設(shè)置定時器模式
TMOD |= 0x02; //設(shè)置定時器模式
TL0 = 0x1A; //設(shè)置定時初值
TH0 = 0x1A; //設(shè)置定時重載值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時器0開始計時
}
/*------------------
演示結(jié)果 周期2ms
--------------------*/
void ShowResult()
{
if(TF0==1)
{
TF0=0;
if(++Cnt250us>=8)
{
Cnt250us=0;
LB_ADC();
display();
}
}
}
/*--------------------------
ADC采樣平均法濾波程序
---------------------------*/
void LB_ADC()
{
static long PJZ_ADC=0; //累加10次采樣的變量
static uchar count=0;
PJZ_ADC += GetADCResult(0); //累加采樣值
count++; //計數(shù)器變量自+1
if(count>=10) //如果計數(shù)到10次采樣
{
count=0; //計數(shù)器清0
V_CY=(PJZ_ADC*5*10+512)/1024;//獲取100倍電壓值四舍五入取整數(shù)
PJZ_ADC=0; //采樣變量清0
}
}
/*--------------------------
Initial ADC sfr
---------------------------*/
void InitADC()
{
P1ASF=0x01; //設(shè)置P1的0通道端口作為模擬輸入
ADC_RES=0; //清除ADC_RES存儲器以前的結(jié)果
ADC_RESL=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDL; //ADC 開啟電源、轉(zhuǎn)換速度 1010 0000
Delay(2);
}
//Get ADC Result
uint GetADCResult(uchar ch) //獲取ADC結(jié)果
{
ADC_CONTR=ADC_POWER|ADC_SPEEDL|ch|ADC_START;//啟動轉(zhuǎn)換1010 1000
_nop_(); //延時確保正確讀到ADC_CONTR寄存器的值
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //等待ADC轉(zhuǎn)換完成標(biāo)志置位 1001 1000
ADC_CONTR &=~ADC_FLAG; //關(guān)閉ADC
return (ADC_RES<<2)|ADC_RESL; //返回十位ADC結(jié)果
}
void display()//數(shù)碼管顯示程序
{
static uchar i=0;
P2=0x00;//消隱
switch(i)
{
case 0: V1=0;V2=1;V3=1;V4=1;P2=table[V_CY/100%10]|0x80;i++;break;//加小數(shù)點
case 1: V1=1;V2=0;V3=1;V4=1;P2=table[V_CY/10%10];i++;break;
case 2: V1=1;V2=1;V3=0;V4=1;P2=table[V_CY%10];i++;break;
case 3: V1=1;V2=1;V3=1;V4=0;P2=table[16];i=0;break;
}
}
/*----------------------------
Software delay function
----------------------------*/
void Delay(uint n)
{
uint x;
while (n--)
{
x = 5000;
while (x--);
}
}
|
|