📄 c8051ad.c
字号:
//CPU型号 : C8051F330
// 包含文件
#include <c8051f330.h> // SFR 声明
sfr16 ADC0 = 0xbd; // ADC0 采样数据寄存器地址
#define uchar unsigned char
void main (void); // 主函数
void SYSCLK_Init (void); // 系统时钟初始化
void PORT_Init (void); // IO口初始化
void ADC0_Init (void); // AD转换初始化
void LED4_Display (void); // LED显示
void LED_OUT(uchar X); // LED单字节串行移位函数
unsigned long AD_Sampling (unsigned char Channel); // AD采样子程序
void _16to4bit10(unsigned int dd); // 16进制到4位10进制转换
unsigned char code LED_0F[]; // LED字模表
#define SYSCLK 24500000 / 8 // 系统频率
sbit LED_DOUT = P1^6; //串行数据输入
sbit LED_CLK = P1^5; //时钟脉冲信号——上升沿有效
sbit LED_LATCH = P1^7; //打入信号————上升沿有效
#define AI0 0 // AI1采样通道为P0.0
#define AI1 1 // AI1采样通道为P0.1
#define AI2 2 // AI1采样通道为P0.2
#define AI3 2 // AI1采样通道为P0.3
#define AI4 4 // AI1采样通道为P0.4
#define AI5 5 // AI1采样通道为P0.5
#define AI6 6 // AI1采样通道为P0.6
#define AI7 7 // AI2采样通道为P0.7
uchar LED[4]; //用于LED的4位显示缓存
//*****************************************************************************
// 主程序
//
void main (void)
{
PCA0MD &= ~0x40; // 禁止watchdog timer
SYSCLK_Init (); // 初始化系统时钟到 24.5MHz
PORT_Init (); // 初始化io口与交叉开关
ADC0_Init (); // 初始化AD转换
while(1)
{
unsigned long i0,i1;
i0=AD_Sampling (AI0); //采样
i1=AD_Sampling (AI1); //采样
i0=i0/511;
i0=i0*330;
i0=i0-4;
i0=2401/i0-4;//转换成距离
_16to4bit10(i0); //结果转换为4位10进制数
//并送显示
LED4_Display ();
}
}
// 主程序结束
//*****************************************************************************
//*****************************************************************************
// 初始化程序
//-----------------------------------------------------------------------------
// SYSCLK_Init 系统时钟初始化程序
//
// 使用内部 24.5MHz / 8 振荡器作为时钟源
// 同时允许时钟丢失检测器
//
void SYSCLK_Init (void)
{
OSCICN = 0x80; // 使用内部振荡器;8分频
RSTSRC = 0x04; // 检测到时钟丢失时允许系统复位
}
//-----------------------------------------------------------------------------
// PORT_Init IO端口初始化程序
//
// 定义交叉开关和IO口
// P1.0 - LED (推挽)
//
void PORT_Init (void)
{
P0MDIN = 0x00; // 定义P0.0--P0.7为模拟输入通道
// P0.0——0I1
// P0.7——7I2
P0SKIP = 0xff; // P0.6、P0.7被交叉开关跳过
XBR0 = 0x00; // 未选择任何数字外设
XBR1 = 0x40; // 使能交叉开关和弱上拉
P1MDOUT |= 0xE0; // 设P1.5、P1.6、P1.7为输出端口
}
//-----------------------------------------------------------------------------
// ADC0初始化
//
void ADC0_Init (void)
{
AMX0N = 0x11; // 单端输入方式
ADC0CN = 0x80; // ADC0使能;正常跟踪模式
// 当写AD0BUSY时ADC0转换开始;ADC0数据右对齐
REF0CN = 0xA; // (电压基准控制寄存器)使用VDD
// 禁止片内温度传感器
ADC0CF = (SYSCLK/2500000) << 3; // ADC转换时钟=2.5MHz
EIE1 &= ~0x0C; // 禁止ADC0窗口比较器中断
// 禁止ADC0 EOC中断
}
// 初始化程序结束
//*****************************************************************************
//-----------------------------------------------------------------------------
// AD_Sampling ——AD采样子程序
//
// Channel 采样通道
//
unsigned long AD_Sampling (unsigned char Channel)
{
unsigned int i;
unsigned long z;
z= 0;
for( i=0;i<256;i++)
{
AMX0P = Channel; // 选择模拟转换通道
AD0INT = 0; // 清除转换结束标记
AD0BUSY = 1; // 开始转换
// 防止LED闪烁
LED4_Display ();
while (AD0INT == 0); // 等待转换结束
z = z + ADC0;
}
z=z/256;
return(z); // 读ADC0数据
}
//-----------------------------------------------------------------------------
// 16进制到4位10进制转换
//
// 将dd数据转换为4位10进制数,并存入LED显示缓存
void _16to4bit10(unsigned int dd)
{
unsigned int div;
unsigned char i;
div=1000;
for (i=0;i<4;i++) {
LED[i]=dd/div;
dd%=div;
div/=10;
}
}
//*****************************************************************************
// 表
//*****************************************************************************
//-----------------------------------------------------------------------------
// LED转换表0——F
//
unsigned char code LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -