给你写个简单示例程序程序,仿真图不代表实际电路,实际数码管电路要加限流电阻。
#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[]={//数码管数组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; //设置P1.0高阻:ADC输入高阻
P1M0 = 0x00; //设置P1.0高阻:ADC输入高阻
P2M1 = 0x00; //设置P2.0~2.7推挽
P2M0 = 0xFF; //设置P2.0~2.7推挽
P3M1 = 0x00; //设置P3.0~3.3推挽
P3M0 = 0x0F; //设置P3.0~3.3推挽
Timer0Init();
InitADC(); //Init ADC sfr
while(1)
{
ShowResult();
}
}
void Timer0Init() //250微秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0x1A; //设置定时初值
TH0 = 0x1A; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/*------------------
演示结果 周期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++; //计数器变量自+1
if(count>=10) //如果计数到10次采样
{
count=0; //计数器清0
V_CY=(PJZ_ADC*5*10+512)/1024;//获取100倍电压值四舍五入取整数
PJZ_ADC=0; //采样变量清0
}
}
/*--------------------------
Initial ADC sfr
---------------------------*/
void InitADC()
{
P1ASF=0x01; //设置P1的0通道端口作为模拟输入
ADC_RES=0; //清除ADC_RES存储器以前的结果
ADC_RESL=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDL; //ADC 开启电源、转换速度 1010 0000
Delay(2);
}
//Get ADC Result
uint GetADCResult(uchar ch) //获取ADC结果
{
ADC_CONTR=ADC_POWER|ADC_SPEEDL|ch|ADC_START;//启动转换1010 1000
_nop_(); //延时确保正确读到ADC_CONTR寄存器的值
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成标志置位 1001 1000
ADC_CONTR &=~ADC_FLAG; //关闭ADC
return (ADC_RES<<2)|ADC_RESL; //返回十位ADC结果
}
void display()//数码管显示程序
{
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;//加小数点
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--);
}
}
|