📄 adc.c
字号:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//
// 文件名:ADC.c
//
//
// 目标器件: C8051F02x
//
// 编译工具: Silicon Laboratories IDE
//
// 程序说明: 此程序模/数转化通道AIN0.0的输入值,测试前将S6的第一拨码开关拨到ON
//------------------------------------------------------------------------------------
// // 头文件包含
//------------------------------------------------------------------------------------
#include <c8051f020.h>
//------------------------------------------------------------------------------------
// 特殊功能寄存器定义
//------------------------------------------------------------------------------------
sfr16 TMR3RL = 0x92;
sfr16 TMR3 = 0x94;
sfr16 ADC0 = 0xbe;
//------------------------------------------------------------------------------------
// 常量定义
//------------------------------------------------------------------------------------
#define SYSCLK 2000000
bit LCDBit;
unsigned long x;
//-----------------------------------------------------------------------------------
// 函数定义
//------------------------------------------------------------------------------------
void PORT_Init (void);
void Timer3_Init (int counts);
void ADC_Init(void);
void ADC_ISR (void);
void LCD_Init(void);
//------------------------------------------------------------------------------------
//主程序
//------------------------------------------------------------------------------------
void main (void) {
unsigned char data1,i;
unsigned char *lcdpoint; //指向 lcddata数组的指针
unsigned char ADC0Data[10]={0x0a,0x0d,0x0c,0x00,0x68,0x68};
WDTCN = 0xde;
WDTCN = 0xad; //禁止看门狗定时器
LCDBit=0;
PORT_Init();
LCD_Init();
Timer3_Init (SYSCLK / 12 /5 );
ADC_Init();
EA = 1;
AMX0SL |=0x00; //通道0
for(x=0;x<=50000;x++);
//AMX0SL |=0x01; //通道1
//for(i=0;i<=50000;i++);
//AMX0SL |=0x02; //通道2
//for(i=0;i<=50000;i++);
//AMX0SL |=0x03; //通道3
//for(i=0;i<=50000;i++);
//AMX0SL |=0x04; //通道4
//for(i=0;i<=50000;i++);
//AMX0SL |=0x05; //通道5
//for(i=0;i<=50000;i++);
//AMX0SL |=0x06; //通道6
//for(i=0;i<=50000;i++);
//AMX0SL |=0x07; //通道7
while (1)
{
if(LCDBit==1){
TMR3CN &= 0xfb; //关定时器3
LCDBit=0; //清LCD显示位
P7 = 0x02; //返回初始位置
P6 = 0x08;
P6 = 0x09;
ADC0Data[9]=ADC0&0x0f; //将A/D转化值存到显示数组
ADC0Data[8]=(ADC0>>4)&0x0f;
ADC0Data[7]=(ADC0>>8)&0x0f;
ADC0Data[6]=(ADC0>>12)&0x0f;
P6 = 0x0d; //准备送数据
for(x=0;x<5000;x++);
lcdpoint = &ADC0Data;
for(i=10;i>0;i--) //显示第一行字符
{
data1=*lcdpoint;
if(data1>=0x0a) data1 += 0x37; //将显示数据转化为液晶的显示字符码
else data1 += 0x30;
P7 = data1;
P6 = 0x0c;
P6 = 0x0d;
lcdpoint++;
for(x=0;x<100;x++);
}
TMR3CN |= 0x04; //使能定时器3
}
}
}
//-----------------------------------------------------------------------------
// //函数名称: LCD_Init ()
//函数功能: LCD初始化
//入口参数: 无
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//-----------------------------------------------------------------------------
void LCD_Init(void)
{
P6 = 0x09;
for(x=0;x<50000;x++);
//P7 = 0x30; /*一行显示*/
P7 = 0x38; /*两行显示*/
P6 = 0x08;
P6 = 0x09;
for(x=0;x<1000;x++);
P7 = 0x0e; //开显示,开光标,字符不闪烁
P6 = 0x08;
P6 = 0x09;
for(x=0;x<1000;x++);
P7= 0x06; //AC自动增1,整体显示不移动
P6 = 0x08;
P6 = 0x09;
for(x=0;x<5000;x++);
P7 = 0x01; //清除DDRAM,置AC=0
P6 = 0x08;
P6 = 0x09;
for(x=0;x<5000;x++);
}
//------------------------------------------------------------------------------------
//函数名称: PORT_Init ()
//函数功能: 通用I/O口及交叉开关初始化
//入口参数: 无
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//------------------------------------------------------------------------------------
//
void PORT_Init (void)
{
XBR2 = 0x40; //使能交叉开关
P74OUT |= 0x0ff; //推挽输出
}
//------------------------------------------------------------------------------------
//函数名称: Timer3_Init ()
//函数功能: 定时器3初始化
//入口参数: int counts
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//------------------------------------------------------------------------------------
void Timer3_Init (int counts)
{
TMR3CN = 0x00;
TMR3RL = -counts; //初始化重载值
TMR3 = 0xffff; //设置自动重载值
TMR3CN |= 0x04;
}
//--------------------------------------------------------------------------
//函数名称: ADC_Init ()
//函数功能: ADC0初始化
//入口参数: int counts
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//--------------------------------------------------------------------------
void ADC_Init(void)
{
ADC0CN |=0x84; /*ADC0使能,定时器3溢出使能模/数转换*/
REF0CN |=0x03; /*内部电压基准提供从VREF脚输出,ADC0电压基准取自VREF0*/
ADC0CF |=0x50; /*转换周期和增益为1*/
AMX0CF |=0x00; /*单端输入*/
EIE2 |=0x02; /*ADC0转换结束中断*/
}
//------------------------------------------------------------------------------------
//函数名称: ADC_ISR ()
//函数功能: 定时器3中断服务程序
//入口参数: 无
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//------------------------------------------------------------------------------------
void ADC_ISR (void) interrupt 15
{
AD0INT=0; //清A/D中断标志
LCDBit=1; //置LCD显示位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -