#include "STC12C4052AD.h"
typedef struct
{
BOOL Run; //BOOL量作为定时采样标志,比如每隔3秒,置位一
次该标志
BYTE Curch; //当前通道
BYTE tempCvData[6]; //转换结果临时缓冲
BYTE CvTimes; //采样次数 采样4次,去最大最小,保留4个取平均值
BYTE ADData[MAX_ADCH]; //MAX_ADCH保存各通道最终采样数据
}STADC;
STADC ADC;
void InitADC()
{
Uint16 i;
ADC_CONTR = 0xC0; //ADC模块加电,420周期转换一次
for(i=0;i<20000;i++); //ADC电源开启后,延时
//设置P口外AD模式
P1M0 = 0x03; //ADC0/1 高阻输入
P1M1 = 0x00;
EADC_SPI = 1; //开放ADCSPI总中断
ADC_DATA = 0;
AUXR = EADCI; //开放ADC中断
MEMSet(&ADC,0,sizeof(STADC));
//启动0号通道
ADC.Curch = 0;
ADC_CONTR |= ADC.Curch; //设置下一通道
ADC.Run = TRUE; //标志ADC正在转换
ADC_CONTR |= ADC_START; //启动AD转换器
}
void ADCISR() interrupt ADC_VECTOR
{
ADC_CONTR &= ADC_STOP; //stop AD
ADC.Run = FALSE;
ADC.tempCvData[ADC.CvTimes] = ADC_DATA;//取转换值
ADC_DATA = 0;
ADC.CvTimes++;
ADC.CvTimes %= 6;
if(ADC.CvTimes!=0)
{
ADC_CONTR |= ADC_START; //启动AD转换器
ADC.Run = TRUE;
}
ADC_CONTR &= ADC_FLAG; //清除ADC_FLAG 中断标志
}
void Proc_ADC()
{
Uint16 CvSum = 0,i;
BYTE MaxCv=0,MinCv=0;
if(ADC.Run||ADC.CvTimes!=0) //AD还在进行,等待
return;
for(i=0;i<6;i++)
{
if(ADC.tempCvData[i]>MaxCv)
MaxCv = ADC.tempCvData[i];
if(ADC.tempCvData[i]MinCv = ADC.tempCvData[i];
}
for(i=0;i<4;i++)
CvSum += ADC.tempCvData[i];
CvSum = CvSum-MaxCv-MinCv;
ADC.ADData[ADC.Curch] = (CvSum>>2);
ADC.Curch++;
ADC.Curch %= MAX_ADCH
ADC_CONTR &= 0xF8; //先清除当前通道值
ADC_CONTR |= ADC.Curch; //设置下一通道
ADC.Run = TRUE; //标志ADC正在转换
for(i=0;i<500;i++); //通道切换延时 100us左右
ADC_CONTR |= ADC_START; //启动AD转换器
}
关键字:STC12C4052AD STC单片机 ADC采样
引用地址:
STC12C4052AD STC单片机ADC采样C程序
推荐阅读最新更新时间:2024-03-16 15:52
STC单片机的下载接口
这几天在弄一个STC下载接口,本来想着电路比较简单,个人感觉比较容易做就可以做出来了。谁知画那个PCB图都花了九牛二虎之力,还要某人帮忙(哈哈不点名,人家很低调的)。终于画好,拿去物电做板。谁知天公不作美啊,物电的那台打印机居然打了几张纸就不工作啦。好在,我打了一张出来,那个封装基本符合,有几个要改一下,还有线太小了,我把它加大到0.6MM,打出来感觉好看了很多,后来弄那个打印机,居然不见了最后那张。后来那个打印机就是不工作,没办法,只能打道回府。第二天再杀过去,一开始打印机好好的,后来打印机又不行了。后来发现纸要很好才行的。后来在物电的人指导下,顺着步骤一下步步往下做。 首先看封装对不对,封装没问题,然后打在油纸上。
[单片机]
CC1101/CC1100、stc单片机模拟2262-2272解码
这几天研究了市场上常见的无线遥控开关,它们的无线部分大都是用2262-2272编码实现,在网上找了些2262-2272软解码的资料,发现少的可怜,即使有实用性也不高,于是乎就有了这篇博客。 22262频率计算公式为F=32000/Ros(KΩ)KHz,其中Ros为震荡电阻,发送一位占用32个时钟周期,其中起始位占用128时钟周期。2262编码格式如下图: ‘F’只有地址为才有,数据位只有‘0’‘1’。 cc1101与stc单片机连接如下: SI-P1.5; SO-P1.6; CLK-P1.7; CS-P3.4; GDO0-P4.2(CCP0); GDO2-P4.3(CCP1); cc1101配置如
[单片机]
基于STC单片机的32*32点阵LED显示汉字
图上摆放的是上面一排引脚是行,下面一排引脚是列。行是LED阳极。 行列各由四个74HC573控制,每个控制8个脚。同时注意单片机P0口上拉保持供电充足。 还有注意每行的扫描时间要合理设置。否则会有显示残缺。根据实际设置吧!!! 横向显示4个字:少占鱼制作 其实可以把这个程序和我另外的一个单片机串口与电脑通信的程序结合起来,加上我用VC做的上位机界面。可以自由输入显示内容,还可以反向控制电脑的一些操作。不过我还是热衷不用电脑输入显示内容,而用一只感应笔扫描一个32*32LED模板,实现自己点哪就让哪个LED亮的效果。简单有省事。等我做出实物来再发吧!!!其实就是加个光敏三极管,LED模板上各个LED点
[单片机]
STC单片机AD和EEPROM的驱动C程序设计与编写
stc单片机具有在应用编程,调试起来比较方便;带有10位AD;内部eeprom;可在1T/机器周期下工作,速度是传统51单片机的12倍;下面是我写的AD和EEPROM的驱动C代码: /*---------------------------------------------------------------- *File Name: stc_AD.c - *Description: A/D 转换程序 *Project: - *MCU type: STC12C5410AD -
[单片机]
STC单片机不重新加电烧写方法
###############################main.c############################# #include intrins.h #include myreg.h #include uart.h #include tool.h void RdUART(); void main(void) { volatile unsigned long CNT = 0; UCHAR I=0; UART_init(38400,RdUART); UART_open(); while(1) { while(CNT 10000) {
[单片机]
STC单片机timer2捕获模式测频率
在使用STC单片机测频率最常用的方法是在一定时间内计算脉冲个数,这种方式一般需要一个计数器和一个定时器配合,而且对低频信号也不太准确,下面我们可以用到timer2的捕获模式通过测量两个下降沿的时间,来计算频率,这样做仅使用timer2就好了,而且对低频信号测量准确,经实际测试,在100Hz一下时,精度可达0.05Hz。 下面先介绍一下STC51 timer2的捕获模式: 在捕获模式中,通过T2CON中的EXEN2设置两个选项,如果EXEN2=0,定时器作为一个16位的定时器或计数器,溢出时置位TF2。该位可用于产生中断(ET2=1)。如果EXEN2=1,就增加了一个特性,即外部输入T2EX(P11)有下降沿时,将timer2中
[单片机]
STC单片机AD转换程序设计
#include reg52.H #include intrins.H sfr P1_ADC_EN = 0x97; // A/D 转换功能允许寄存器 sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器 sfr ADC_DATA = 0xC6; //A/D转换结果寄存器 sfr P1M0=0x91; sfr P1M1=0x92; #define uchar unsigned char ; #define uint unsigned int ; void delay(uchar delay_time) // 延时函数 { uchar n; uint m; for (n=0;n delay
[单片机]
【STC单片机学习】第十三课:串口通信和RS485
1.13.1.通信有关的常见概念 1.13.1.1、什么是通信 (1)人和人之间的通信:交谈、写信(滞后)、烽火、手势等 (发收双方+媒介) (2)人和计算机之间的通信:按键、鼠标、触摸屏、显示器等 (以后会不会用脑电波来和计算机通信?) (3)计算机和计算机之间的通信?有线、无线 咱们学习的所有的通信,都是计算机和计算机之间的通信:WiFi、Zigbee、SPI、I2C、GSM/GPRS.....,后面讲的通信都是指计算机和计算机的通信! 1.13.1.2、通信的关键 (1)事先约定(通信格式、速率、时间(同步)、编解码方式) (2)基本信息单元(bit位/字节/数据包...):信息是基本信息单元的整数倍 (3)有效信息的编
[单片机]