STC12C5A32S2STC12C5A32S2STC12C5A32S2STC12C5A32S2单片机的 ADCADCADCADC采样功能示例(C51C51C51C51)
//本程序主要演示了
//1、1602液晶的编程与使用,包括显示定位、显示2/4位整数、显示浮点数等
//2、STC12C5A32S2单片机的 ADC采样功能(以第0、1通道为例)
//
//注:本示例仅仅演示如何进行 ADC和显示,每 ADC一次就显示一次,实际应用时,
//应多次 ADC并进行相应处理,比如取平均值后,才能得到比较稳定的 AD值
//广西民族大学物电学院 李映超 2010.5.26
/* 板子的硬件连接
1、1602液晶显示模块的连接:RS:P2.4、EN:P2.5、数据口: P0
2、蜂鸣器:P2.3 低电平有效(发出声音)
3、继电器:P2.2 低电平有效(继电器吸合、两输出脚短路)
4、18B20数据输出脚(DQ):P2.1
5、红外遥控输出脚:P2.0
6、直流电压精密可调电阻输出:P1.0 可通过跳线帽断开
7、光敏电阻:P1.1 可通过跳线帽断开
8、按键:均通过二极管连接到 P3.2(外部中断0口),低电平有效,下降沿触发
K0:P3.3、 K1:P3.4、 K2:P3.5、 K3:
P3.6、 K4:P3.7
9、24C02连接:
SDA:P2.7 (上拉有发光二极管,低电平亮)
SCL:P2.6 (上拉有发光二极管,低电平亮)
*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^3;//定义蜂鸣器与单片机的连接脚
void delay_ms(uint xms);//ms级延时子函数
//---------与 STC12C5A32S2单片机 ADC相关的寄存器声明------------------
sfr P1ASF =0x9d; //P1口模数转换功能控制寄存器
sfr ADC_CONTR =0xbc; //AD转换控制寄存器
sfr ADC_RES =0xbd; //AD转换结果寄存器高
sfr ADC_RESL =0xbe; //AD 转换结果寄存器低
sfr AURX1 =0xa2; //AD转换结果存储方式控制位
//------------------------------------------------------------------
//P1ASF寄存器:8位,对应 P1口8根口线,用于指定哪根口线用作 ADC功能
//哪个口用作 ADC就应置相应的位为“1”,注意:不能位寻址
//------------------------------------------------------------------
#define ADC_POWER 0x80 //ADC电源开
#define ADC_SPEED 0x60 //设为90个时钟周期 ADC一次
#define ADC_START 0x08 //ADC启动控制位设为开
#define ADC_FLAG 0x10 //ADC结束标志位
/*
ADC_CTRL寄存器:
ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_STAR CHS2 CHS1 CHS0
1 2 3 4 5 6 7 8
第 1 位: =1 打开 ADC电源;=0 关闭 ADC电源; ADC前要一定要打开
第2-3位: =1 1 90个时钟周期 ADC 一次; =1 0 180个时钟周期 ADC一次;
=0 1 360个时钟周期 ADC一次; =0 0 540个时钟周期 ADC一次;
第4位: ADC结束标志位,每次 ADC 结束时自动=1,需要用软件清零才可以进行下一次 ADC
第5位: ADC启动控制位,置“1”则 ADC转换开始,转换结束后为0
第6-7-8位:ADC 通道选择 000-->P1.0 ........111-->P1.7
*/
//-------------------------------------------------------------
void ADC_int(uchar n) //第 n通道 ADC初始化函数
{ n&=0x07; //确保 n=0----7通道
AURX1|=0x04; //转换结果存储格式:数据的高2位放 ADC_RES,低8位放 ADC_RESL
P1ASF=1<0;aa--)
for(bb=200;bb>0;bb--); //调整数值以使本句运行时间为1ms
}
//------------------------------------------------------------------------
void lcd_locate(unsigned char x,unsigned char y)
{ unsigned char aa;
if (x==1) aa=0x80;
if (x==2) aa=0x80+0x40;
lcd_write_com(aa+y-1);
}
//------------------------------------------------------------------------
void lcd_2_char(unsigned int data_2_char) //在1602LCD上显示一个2位的整数
{ unsigned char lcd_table[2];
lcd_table[1]=data_2_char/10; //获得十位的数字
lcd_table[2]=data_2_char%10; //获得个位的数字
lcd_write_data(lcd_table[1]+0x30); //显示十位
lcd_write_data(lcd_table[2]+0x30); //显示个位
}
//------------------------------------------------------------------------
void lcd_4_char(unsigned int data_4_char) //在1602LCD上显示一个4位的整数
{ unsigned char lcd_table[4];
lcd_table[1]=data_4_char/1000; //获得千位的数字
lcd_table[2]=data_4_char%1000/100; //获得百位的数字
lcd_table[3]=data_4_char%100/10; //获得十位的数字
lcd_table[4]=data_4_char%10; //获得个位的数字
lcd_write_data(lcd_table[1]+0x30); //显示千位
lcd_write_data(lcd_table[2]+0x30); //显示百位
lcd_write_data(lcd_table[3]+0x30); //显示十位
lcd_write_data(lcd_table[4]+0x30); //显示个位
}
//-----------------------------------------------------------------------
void lcd_float(float f_data) //在1602LCD上显示一个小于100、保留3位小数的浮点数
{ unsigned char lcd_table[4];
unsigned long aa;
aa=f_data*1000; //保留3位小数
lcd_table[0]= aa/10000 ; //分别获取各位上的数
lcd_table[1]= aa%10000/1000 ;
lcd_table[2]= aa%1000/100 ;
lcd_table[3]= aa%100/10 ;
lcd_table[4]= aa%10 ;
if (lcd_table[0]==0) lcd_write_data(' '); //如果整数部分的十位数是0则
不显示(显示空格)
else lcd_write_data(lcd_table[0]+0x30); //显示整数部分的十位数,加上
0x30以便直接得到相应的 ASCII码去显示
lcd_write_data(lcd_table[1]+0x30); //显示整数部分的个位数
lcd_write_data('.'); //显示小数点"."
lcd_write_data(lcd_table[2]+0x30); //显示小数部分的十分位
lcd_write_data(lcd_table[3]+0x30); //显示小数部分的百分位
lcd_write_data(lcd_table[4]+0x30); //显示小数部分的千分位
}
//------------------------------------------------------------------------
void lcd_write_com(unsigned char lcd_com) //LCD送命令子函数
{lcd_rs=0;
lcd_data_port=lcd_com;
delay_ms(5);
lcd_en=1;
delay_ms(5);
lcd_en=0;
}
//-----------------------------------------
void lcd_write_data(unsigned char lcd_data) //LCD 送显示数据子函数
{lcd_rs=1;
lcd_data_port=lcd_data;
delay_ms(5);
lcd_en=1;
delay_ms(5);
lcd_en=0;
}
//----------------------------------------------------------------------
void lcd_int() //LCD初始化子函数
{lcd_en=0;
lcd_write_com(0x38); //设置 LCD工作于16x2、5x7点阵、8位数据接口模式
lcd_write_com(0x0c); //开显示,不显示光标
lcd_write_com(0x06); //写一个字符后地址指针自动加1
lcd_write_com(0x01); //清屏
}
本文档为【STC12C5A32S2单片机的ADC采样功能示例】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。