📄 adc_电压表.c
字号:
/*********************************************************************************
( 电位器通过adc处理模拟电压 转换数字信号 数码管输出 )
编写:huhong
日期:2007/10/25
地点:roboteam
版本:1.1
说明:靠ADC0H取样 处理成数码管信号后显示
疑问:?????
描述:用四个共阳级数码管显示 p0.1 p0.3做取样表笔端 p1控制数字值 p0.4--p0.7控制扫描 动态显示
***********************************************************************************/
#include<c8051f330.h>
#include <absacc.h>
#include <Intrins.h>
int a,b,c,d;
float x;
unsigned int code g[] = {0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,0x90,0x0ff,0x0bf}; //数码管显示数字
void sysclk(void) //内部晶振
{
OSCICN = 0x83;
}
void pio(void)
{
P0MDIN = 0x0f0; //P0口输入方式 p0.4做正输入 p0.5 负输入比较值 模拟信号
P0MDOUT = 0x00; //P0口输出方式 p0.1做PWM 没上拉电阻 用推挽好
P0SKIP = 0x0ff; //P0口跳转方式 p0.1做PWM
P1MDIN = 0x0ff; //P1口输入方式
P1MDOUT = 0x0ff; //P1口输出方式 推顽开数码管
P1SKIP = 0x0ff; //P1口跳转方式
XBR0 = 0x00; //XBR0特殊功能关闭
XBR1 = 0x0c0; //XBR1打开CEX0-p1.1
}
void adc(void)
{
AMX0P = 0x01; //0000 0001 用p0.1
AMX0N = 0x03; //0000 0011 用p0.3
ADC0CF = 0x2c;
ADC0CN = 0x90;
REF0CN = 0x08;
}
void delay(m) //延时程序,1=5ms 抄的 没验证 不好意思
{
unsigned i,j;
for(i=0;i<1840;i++) //1840
{
for(j=0;j<m;j++);
}
}
void display(void)
{
P0 = 0x00; //显示
P1 = g[a];
P0 = 0x10;
delay(1);
P0 = 0x00;
P1 = g[b];
P0 = 0x20;
delay(1);
P0 = 0x00;
P1 = g[c]&0x7f; //按位与 出那个小数点
P0 = 0x40;
delay(1);
P0 = 0x00;
P1 = g[d];
P0 = 0x80;
delay(1);
}
void chuli(void)
{
x *=100; //各个数码管取值
a = (int)x%10;
b = ((int)x/10)%10;
c = (int)x/100;
}
main()
{
PCA0MD &=~0x40; //关闭看门狗
sysclk();
pio();
adc();
while( 1 )
{
ADC0CN |= 0x10;
x = ADC0H; //取ADC高8位
if (x < 128)
{
d = 10; //0~~127 为正电压 d管无显示
x = 3.3*(x/127.0); //获取取样电压值
}
else
{
d = 11; //128~~255 为负电压 d管显示负号
x = 3.3*((256.0-x)/128.0); //获取取样电压值
}
chuli();
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -