STC12C5A60S2单片机的AD转换

合集下载

单片机STC12C5A60S2简介

单片机STC12C5A60S2简介

STC12C5A60S2简介STC12C5A60S2是STC生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场合。

1、增强型8051CPU,1T(1024G),单时钟/机器周期2、工作电压 5.5-3.5V3、1280字节RAM4、通用I/O口,复位后为:准双向口/弱上拉可设置成四种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA5、有EEPROM功能6、看门狗7、内部集成MAX810专用复位电路8、外部掉电检测电路9、时钟源:外部高精度晶体/时钟,内部R/C振荡器常温下内部R/C振荡器频率为:5.0V单片机为:11~17MHz3.3V 单片机为:8~12MHz10、4个16位定时器两个与传统8051兼容的定时器/计数器,16位定时器T0和T111、3个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,独立波特率发生器可以在P1.0口输出时钟12、外部中断I/O口7路,传统的下降沿中断或电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0,CCP0/P1.3,CCP0/P1.313、PWM2路14、A/D转换,10位精度ADC,共8路,转换速度可达250K/S15、通用全双工异步串行口(UART)16、双串口,RxD2/P1.2,TxD2/P1.317、工作范围:-40~8518、封装:LQFP-48,LQFP-44,PDIP-40,PLCC管脚说明P0.0~P0.7 P0:P0口既可以作为输入/输出口,也可以作为地址/数据复用总线使用。

STC12C5A60S2中的AD转换

STC12C5A60S2中的AD转换

STC12C5A60S2中的AD转换逐次逼近原理AD 里面包含da,当输入电压Vin时,da的最高位是1,即为0.5Vref与输入信号比较,如果输入大于0.5Vref则比较器输出为1,同时da的最高位为1,反之DA最高位则为0,通过8次比较后得到8个01数据即完成ad转换。

现在说下程序中用到stc12单片机两个寄存器ADC_CONTR;主要用来配置ad启动的工作模式;还有个result的寄存器程序中的注意点:配置完ADC_CONTR后要延时4个时钟周期先把程序附上#include &quot;stc12.h&quot;#include &quot;intrins.h&quot;#include &quot;ad.h&quot;uint ad;#define ADC_POWER 0X80 //ADC最高位给adc部分供电,类似于片选#define ADC_START 0X08 //模数转换启动控制位#define ADC_FLAG 0x10 //ad转换需要时间,这个是转换完成标志位#define ADC_SPEEDLL 0X00 //540 clock#define ADC_SPEEDL 0X20 //360 clock#define ADC_SPEEDH 0X40 //180 clock#define ADC_SPEEDHH 0X60 //90 clockuchar ADCresult(uchar aa) //这里的参数是哪个口来ad转换{P1ASF=0X01; //这里的选择和用哪一个P1口作为ad采样ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|aa;//ADC_CONTR=0X88|aa;_nop_();_nop_();_nop_();_nop_();//设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器while (!(ADC_CONTR & ADC_FLAG)); //等待ADC_CONTR,这里的ADC_FLAG相当于一个常数,不是寄存器里面的某个位//while(!ADC_FLAG);//ADC_FLAG=0;ADC_CONTR &= ~ADC_FLAG; //Close ADC 将标志位清零等待下次硬件置1ad=(ADC_RES<<2)+ADC_RESL; //打开10位AD采集功能如果用8位AD 屏掉这句把下一句改为Vo=(float)(ADC_RESL)*500/256; 即可//ADC_RES结果寄存器的高2位;ADC_RES结果寄存器的低8位ad=(float)(ad)*5*100/1024; //Return ADCresult(为显示整数,这里将电压值扩大了十倍)//10位AD采集即2的10次方满值为1024 这里用1024表示5伏的电压//那么用采集到的数量值除以1024 在乘以5 得到的值就是采集的电压数值//这里又*100 是为了扩大100倍显示小数位//ADC_RES*(5/256)为采集的电压值然后扩大10倍便于计算return ad;}这里只是个ad.c源文件,这里有几个问题想说一下1.怎么知道是10位还是8位的ad结果;你可以在ADCresult(uchar aa)最前面加一条AUXR1&=0x04;什么意思呢,转换结果的低2位放在ADC_RES,高8位ADC_RESL 中2为什么不用//while(!ADC_FLAG);//ADC_FLAG=0;这两条因为ADC_FLAG相当于常量前面用宏定义而头文件里只有ADC_CONTR的地址映射;但是如果在头文件中用sbit ADC_FLAG=ADC_CONTR^4会出现错误,具体原因还不清楚先说到这吧。

STC12C5A60S2的ADC PWM功能

STC12C5A60S2的ADC PWM功能

STC12C5A60S2的ADC+PWM功能STC12C5A60S2单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,速度可达到250 KHz(25万次/秒)。

脉宽调制(PWM)是一种使用程序来控制波形占空比、周期、相位波形的技术。

STC12C5A60S2单片机的PAC模块可以通过程序设定,使其工作于8位PWM模式。

下面是一段将ADC和PWM结合起来应用的程序:/************************************************ ***************时间:2012.12.1晶振:12MHz功能描述:AD采集电位器的电压信号,然后信号以PWM 信号输出控制LED的亮度(调节电位器)当电位器两端的电压大时,LED较亮,同时用1602显示采集的电压值AD采集通道:P1.0PWM输出: P1.3************************************************* **************/#include;#include;unsigned int result,ge,shifen,baifen;unsigned charseg[10]={'0','1','2','3','4','5','6','7','8','9'} ;//要显示字符sbit RS = P2^4; //命令数据sbit RW = P2^5; //写还是读sbit EN = P2^6; //使能端#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------* /void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------* /void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------* /bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------* /void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------* /void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------* /void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s){{LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------* /void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data){{LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------LCD初始化函数------------------------------------------------* /void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/ }/*------------------------------------------------ADC初始化函数------------------------------------------------* /void InitADC(){P1ASF =0x01;//使能P1口ADC功能ADC_RES = 0;ADC_CONTR = 0xc8;}/*------------------------------------------------主函数------------------------------------------------* /void main(void){LCD_Init();LCD_Clear();//清屏LCD_Write_String(5,0,&quot;526lab&quot;);//(列,行,数据)LCD_Write_String(2,1,&quot;Result:&quot;); InitADC();IE=0xa0;//开中断while (1){//PWM初始化CCON=0;CMOD=0;//1MCCAP0H=CCAP0L=ADC_RES;CCAPM0=0x42;//开启PWMCR=1;//计时开始//调用显示LCD_Write_Char(9,1,seg[ge]);LCD_Write_Char(10,1,'.');LCD_Write_Char(11,1,seg[shifen]);LCD_Write_Char(12,1,seg[baifen]);LCD_Write_Char(13,1,'V');}}/*------------------------------------------------ADC中断处理函数------------------------------------------------* /void adc_isr() interrupt 5 using 1{unsigned int temp;temp=ADC_RES;result=temp*0.01953125*1000;ge=result/1000;shifen=result%1000/100;baifen=result%100/10;ADC_CONTR = 0xc8;//开启转换}12C5A60S2.h的头文件//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机内核特殊功能寄存器 C51 Core SFRs// 7 6 5 4 3 2 1 0Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000//-----------------------------------sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//--------------------------------------------------------------------------------//新一代 1T 8051系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 2 1 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000// 7 6 5 4 3 2 1 0Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000 /*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1//-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。

STC12C5A60S2单片机的AD转换

STC12C5A60S2单片机的AD转换
AD_val/=100;
AD_val=(AD_val*5)/256; //AD的参考电压是单片机上的5v,所以乘5即为实 际电压居
return AD_val;
}_
void AD」nit(void)
{"
P1ASF = Oxff; //Pl口全部作为模拟功能A/D使用
ADC_RES = 0;〃清零转换结果寄存器高8位
0x08
//ADC启动控制位设为开
#define
ADC_SPEEDLLFra bibliotek0x00〃设为540个时钟周期ADC一次
#define
ADC_SPEEDL
0x20
〃设为360个时钟周期ADC一次
#define
ADC_SPEEDH
0x40
〃设为180个时钟周期ADC—次
#defi ne
ADC_SPEEDHH
0x60
_nop_();_nop_();_nop_();_nop_();〃要经过4个CPU时钟的延时,苴值才能够保证被 设置进ADC_CONTR?寄彩器?
while) !(ADC_CONTR&ADC_FLAG));〃等待转换完成
adc_data=ADC_RES;〃转换结果计算,取8位结果
ADC_CONTR&=~ADC_FLAG;〃关闭AD转换,ADC_FLAG位由软件淸0
AD_init();
while(l)
{ for(i=0;i<8;i++)
{
AD_work(i); delay(20);
}
) unsigned int AD_get(unsigned char n)〃笫n通道ADC采样函数
{
unsigned int adc_data;

STC12C5A系列AD转换C程序

STC12C5A系列AD转换C程序
AD_finished = 0;
while (AD_finished ==0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
_nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
while(1)
{
ADC_result = get_AD_result(1);//P1.1 为 A/D 当前通道, 测量并发送结果
Send_Byte(0xAA); //为便于观察, 发送 2 个 0xAA
Send_Byte(0xAA);
}
//---------------------------------------------------------------------
INT8U get_AD_result(INT8U channel)
{
INT8U AD_finished=0; //存储 A/D 转换标志
#define BRT_start() AUXR |= 0x10 //启动独立波特率发生器 BRT 计数。
void initiate_RS232 (void) //串口初始化
{
ES = 0; //禁止串口中断
#include "NEW_8051.H"

stc 12c5a60s的ad转换程序有详细方式

stc 12c5a60s的ad转换程序有详细方式
{
while(!TI);
TI=0;
SBUF=dat;}
void Delay(WORD n)//延时函数
{
WORD x;
while(n--)
{
x=5000;
while(x--);
}
}
BYTE ch=0; //ch主要是为了用于控制那个ad选为下一个转换口
void Delay900ms();
void main() // 主函数开始
{
InitUart(); // 设置串口函数
InitADC(); // 开始转换函数 .ad转换使用的是中断方式。所以还有一个中断处理函数
IE=0XA0;
while(1);}
void adc_isr() interrupt 5 using 1 //stc12ad转换中断例程
{
ADC_CONTR&=!ADC_FLAG;//将ad转换完成标志致0. 此位与11101111相与得到的结果会是除了第4位是0其他为让保持原来的数据
P2=~P2;
P0=~P0;
SendData(ch); //将正在转换的ad输入口的名字牌号通过串口输出
SendData(ADC_RES); // 将数据高八位输出通过串口
SendData(ADC_LOW2); //将数据的低8位通过串口输出
ch++;
if(ch>8)
#include<reg51.h>
#include<intrins.h>
#define FOSC 18432000L //
#define BAUD 9600 //

用STC12C5A60S2测试AD转换程序

用STC12C5A60S2测试AD转换程序

刚到手一块STC12C5A60S2单片机,看说明文档里有AD转换功能。

于是写了这段程序测试学习一下,程序在我的学习板上运行稳定,如里要你只要改下I/O口即可。

里面注解挺详细的,愿对看文档的人有所帮助吧。

下面是主程序部份:# include <stc12c5a60s2.h># include <intrins.h># define uchar unsigned char# define uint unsigned int/* -------------函数声明开始--------------- */void delay_ms(uchar ms);//延时函数void init_adc(void); //初始化ADuint get_adc(void); //获取AD结果,返回UINT型值。

extern write1602_3b (uchar pos, uint n);extern void init_1602 ();/* -------------函数声明结束--------------- */void init_adc(void){P1ASF = 0x01; //AD功能寄存器,设置I/O口作为AD转换实用。

使用P1.0口。

ADC_RES = 0; //清理结果寄存器的值ADC_RESL = 0; //清理结果寄存器的值ADC_CONTR = 0x80; //开启AD电源并设置转换周期为540个时钟周期转换一次。

//ADC_POWER=1;CHS2,1,0为0,用p1.0作为输入。

SPEED1,0为0,540个时钟,delay_ms(2);}void delay_ms(uchar ms){uint i = 5000;while(ms--){while(i--);}}uint get_adc(void){uint d=0;ADC_CONTR = 0X88;_nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR & 0X10));ADC_CONTR &= ~0X10;d |= ADC_RES;d <<= 2;d |= ADC_RESL;return d;}void main (void){uint v=0;uint dat = 0;// P2M0 = 0X00;// P2M1 = 0XFF;_nop_();_nop_();_nop_();_nop_();_nop_();init_1602 ();init_adc();while(1){dat=get_adc();v = (uint)((dat*5.0*100)/1024);write1602_3b (0x48,v);delay_ms(10);}}下面是1602显示部分,在编译时要把两个程序都放入KEIL工程里。

单片机实现5v电压ad数模转换

单片机实现5v电压ad数模转换

Stc12c5a60s2系列单片机的A/d数模转换模块实验摘要:与时间成连续函数的物理量,一般都称之为模拟量。

人们在工业生产及科研过程中遇到的被测量绝大部分是模拟量。

例如:电压,电流,温度,压力,位移,速度等。

计算机技术是测量与控制自动化与智能化的关键,是现代测控技术的核心技术之一。

现代计算机是数字计算机,它无法直接处理模拟信号,因此欲实现基于计算机的测量与控制,必须具备将连续变化的模拟信号转变成计算机能够识别及处理的数字信号的手段。

为此模/数转换技术应运而成,并成为现代测控技术中的重要组成部分。

将模拟量转换为一定码制的数字量称为模/数转换。

Stc12c5a60s2系列单片机作为微型控制芯片的一种,其自身自带a/d装换口:P1(p1.0-p1.7),可实现数模转换功能。

实验目的:以Stc12c5a60s2单片机以及1602液晶显示屏做一个简易的”电压测量器“,测量线性稳压电源提供的直流电压,精度0.01v,通过调节电位器,将输入的电压转换为数字量实时显示在1602lcd上。

实现过程:1.理论学习:(1)在掌握1602lcd工作原理及使用方法的基础上,查阅Stc12c5a60s2单片机数模转换模块应用介绍,弄清楚a/d转换器的结构,了解a/d转换器是如何工作的。

(2)理解与a/d转换器相关的寄存器的设置,会根据实际需要设置相关的寄存器。

(3)了解如何配置a/d转换口,如何取出转换结果。

以十位结果为例,计算公式如下:Vcc即单片机实际工作电压,我们用单片机工作电压做模拟参考电压,则输出的实际电压vin=result(结果寄存器中的值)×vcc(单片机工作电压5v)/1024。

2.需注意的问题:(1)Stc12c5a60s2单片机的参考电压源是输入的工作电压vcc,所以一般不用外接参考电压源,如果单片机是采用电池供电,电池电压会在一定范围内漂移,所以vcc就不固定,这时候就需要在8路a/d转换的一个通道外接一个稳定的参考电压源,来计算此时的工作电压vcc,再计算出其他几路a/d转换通道的电压。

STC12C5A60S2-AD电压高级采集

STC12C5A60S2-AD电压高级采集

STC12C5A60S2-AD电压高级采集/*使用STC单片机内置10AD(仅用高八位,分辨率为5mV)做的简易电压表*//*本程序AD部分使用了深圳宏晶公司官方AD转换示范程序修改, 特此鸣谢*//*使用STC12C5A60S2 1T单片机,12M外部晶振,Keil V3编译通过,AD转换脚定义为P1.1, *//*使用芯片本身5V电源为基准,在深圳精创电子的51/AVR开发板实现。

8位共阳LED字符码*//*接P0口,位线接在P2口,均为低电平显示,使用右4位。

本显示程序摘自网上,一并感谢。

*//*----2010.07.04 written by autopccopy() */#include <intrins.H>#include <stc12c5a60s2.H> //STC的新头文件0X6D,/*5*/0X7D,/*6*/0X07,/*7*/0X7F,/*8*/0X6F,/*9*/0xFF};void led(int n) //数码管显示及数据处理程序{P0 = 0xFF;P0 = DATA_LED[n % 10]; //个位P20 = 0;delay(1);P20 = 1;P0 = 0xFF;P0 = DATA_LED[n / 10 % 10]; //十位P21 = 0;delay(1);P21 = 1;P0 = 0xFF;P0 = DATA_LED[n / 100 % 10]; //百位 P22 = 0;delay(1);P22 = 1;P0 = 0xFF;P0 = DATA_LED[n / 1000 % 10]; //千位 P23 = 0;P07=0; //千位显示小数点delay(1);P23 = 1;}//---------------------------------------------------------------------INT8U get_AD_result(INT8U channel) //AD 转换部分{INT8U AD_finished=0; //存储 A/D 转换标志ADC_RES = 0; //高八ADC_RESL = 0; //低二位(本例未使用)channel &= 0x07; //0000,0111 清0高5位ADC_CONTR = AD_SPEED;_nop_();ADC_CONTR |= channel; //选择A/D 当前通道_nop_();ADC_CONTR |= 0x80; //启动A/D 电源delay(1); //使输入电压达到稳定ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,AD_finished = 0;while (AD_finished ==0 ) //等待A/D转换结束{AD_finished = (ADC_CONTR & 0x10);//0001,0000 测试A/D转换结束否ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,return (ADC_RES); //返回 A/D 高 8 位转换结果}void delay(INT8U delay_time) // 延时函数{INT16U n;while(delay_time--){n = 100;while(--n);}}//---------------------------同道选择------------------------------------------void ADzhuanhuan1(INT8U zh){INT16U ADC_result;P1ASF = 0x02; //0000,0010, 将 P1.1 置成模拟口AUXR1 &= ~0x04; //0000,0100, 令 ADRJ=0 : 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器ADC_CONTR |= 0x80; //1000,0000 打开 A/D 转换电源while(1){ADC_result =get_AD_result(zh);//P1.1 为 A/D 当前通道,测量并发送结果led(ADC_result*19.53); //显示数值。

单片机原理与应用-基于汇编、C51及混合编程第9章STC12C5A60S2单片机的片内AD转换器

单片机原理与应用-基于汇编、C51及混合编程第9章STC12C5A60S2单片机的片内AD转换器
第9章 STC12C5A60S2单片机的 片内A/D转换器
9.1 A/D转换器的内部结构 9.2 A/D转换器的相关寄存器 9.3 A/D转换器的应用
第9章 STC12C5A60S2单片机的片 内A/D转换器
• 传统的单片机只能处理数字量信息,但在应用中 经常需要处理一些连续变化的模拟量,例如温度、 流量、电压、频谱等,这就需要先经过A/D转换转 变成单片机可以处理的数字量。 • STC90C58AD、STC12C5A60S2、STC12C5410AD等单 片机内部集成了8路10位A/D转换电路,转换速度 可达到250KHz(25万次/秒),即转换周期为4μs。
9.2 A/D转换器的相关寄存器
与A/D转换器相关的寄存器有: P1口模拟功能控制寄存器P1ASF A/D转换器控制寄存器ADC_CONTR A/D转换结果寄存器ADC_RES、ADC_RESL 辅助寄存器AUXR1 与A/D中断有关的寄存器IE、IPH和IP
• • • • •
1.P1口模拟功能控制寄存器P1ASF(地址9DH)
情况如表 - 1 所示 选择9 P1 口不同的引脚作为模拟输入通道, 清 0 。 转换时,必须再次将该位置 1。 0 360个时钟周期转换一次 0 1 1 具体情况如表 1 A/D P1.3 作为 A/D 输入 9-2所示。 0 A/D转换之前一定要保证 540 个时钟周期转换一次 1 0 0 0 P1.4 作为 A/D输入 •启动 A/D 转换器的电源已打开,并且 首次开启内部 转换电源时,需要适当的延时,等内部电源 1 A/D 0 1 P1.5作为A/D输入 稳定后,再启动 A/D 转换结束后关闭 1 1 转换。 0 A/D P1.6 作为A/D输入 A/D转换器的 电源可降低功耗。 1 1 1 P1.7作为A/D输入

STC12C5A60S2单片机实现AD采样并液晶显示

STC12C5A60S2单片机实现AD采样并液晶显示

STC12C5A60S2单片机实现AD采样并液晶显示STC12C5A60S2是一款高性能、低功耗的8051内核单片机。

以下是一种基于该单片机进行AD采样并液晶显示的实现方案。

请注意,由于字数限制,以下内容是基本的框架和步骤,具体细节还需要根据具体需求进行调整。

1.准备材料和设备:-STC12C5A60S2单片机主控板-16x2液晶显示屏-AD转换器(例如MCP3008)-电压传感器模块-连接线、电阻、电容等2.连接硬件:-将液晶显示屏的VCC、GND和信号线(如RS、R/W、EN、D0-D7等)连接到STC12C5A60S2单片机对应的引脚。

-将AD转换器的VCC、GND和信号线(如CLK、DOUT、DIN、CS等)连接到STC12C5A60S2单片机对应的引脚。

-将电压传感器模块的输出引脚连接到AD转换器的输入引脚。

3.编写代码:-使用C语言编写STC12C5A60S2单片机的代码,包括初始化设置、AD 采样、数据处理和液晶显示等部分。

-在初始化设置中,设置AD转换器的引脚和时钟,配置液晶显示屏的引脚和参数。

-在AD采样部分,通过SPI通信协议与AD转换器进行通信,获取电压传感器模块的输出电压值。

-在数据处理部分,将采样到的原始数据经过相应的处理,如校正、换算等。

-在液晶显示部分,将处理后的数据显示到液晶屏上,并通过适当的界面设计和显示格式展示结果。

4.烧录程序:-使用相应的编程工具将编写好的代码烧录到STC12C5A60S2单片机。

-确保烧录成功,并断开编程工具的连接。

5.调试测试:-连接好硬件后,给电压传感器模块供电,确保电压输入正常。

-上电运行STC12C5A60S2单片机,液晶显示屏应显示出AD采样后的结果。

-对不同的输入电压进行测试,观察液晶屏上的显示结果是否与实际输入电压相符。

请注意,以上仅是基本的框架和步骤,实际应用中还需要根据具体需求和应用场景进行相应的优化和调整。

最新STC12C5A60S2单片机的10位AD转换程序

最新STC12C5A60S2单片机的10位AD转换程序

STC12C5A60S2单片机的10位AD转换程序#include"stc12c5a.h" //头文件在STC公司主页上下载#include"stdio.h" //输入输出函数#include"intrins.h"//------------------------------------------------------------------------------void AD_init(); //初始化ADvoid serial_init();void delay(unsigned int a);float AD_work(unsigned char channel);unsigned int AD_get(unsigned char channel);//------------------------------------------------------------------------------void main() //主程序{AD_init(); //A/D转换初始化serial_init(); //串口初始化while(1){unsigned char i;for(i=0;i<8;i++) //循环发送P1.0-P1.7的转换数值{TI=1; //使用printf函数前须先将发送标志位TI置1printf("The P1.%bd voltage is %f\n",i,AD_work(i));TI=0;delay(1000); //延时约1s}}}//------------------------------------------------------------------------------unsigned int AD_get(unsigned char channel){ADC_CONTR=0x88|channel; //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0_nop_(); _nop_(); _nop_(); _nop_(); //要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器while(!(ADC_CONTR&0x10)); //等待转换完成ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0return(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)}//------------------------------------------------------------------------------float AD_work(unsigned char channel){float AD_val; //定义处理后的数值AD_val为浮点数unsigned char i;for(i=0;i<100;i++)AD_val+=AD_get(channel); //转换100次求平均值(提高精度)AD_val/=100;AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值return AD_val;}//------------------------------------------------------------------------------void delay(unsigned int a) //延时约1ms{unsigned int i;while (--a!=0)for(i=600;i>0;i--); //1T单片机i=600,若是12T单片机i=125}//------------------------------------------------------------------------------void serial_init(){TMOD=0x20;TH1=0xfd;TL1=0xfd; //设置9600波特率SCON=0x50; //串口方式1,允许接收TR1=1;}//------------------------------------------------------------------------------void AD_init(){P1ASF=0xff; //P1口全部作为模拟功能AD使用ADC_RES=0; //清零转换结果寄存器高8位ADC_RESL=0; //清零转换结果寄存器低2位ADC_CONTR=0x80;//开启AD电源delay(2); //等待1ms,让AD电源稳定}/* 酱炒牛柳条:Sautéed Beef Filet in XO Sauce阿香婆石头烤肉:Beef BBQ with Spicy Sauce八宝菠菜:Spinach with Eight Delicacies白菜豆腐焖酥肉:Braised Pork Cubes with Tofu and Chinese Cabbage白菜心拌蜇头:Marinated Jellyfish and Chinese Cabbage in Vinaigrette白灵菇扣鸭掌:Mushrooms with Duck Feet白灵菇牛柳:Stir-Fried Beef Filet with Mushrooms白切鸡:Boiled Chicken with Sauce白灼肥牛:Scalded Beef百叶结烧肉:Stewed Pork Cubes and Tofu Skin in Brown Sauce 板栗红烧肉:Braised Pork with Chestnuts拌八爪鱼:Spicy Cuttlefish拌豆腐丝:Shredded Tofu with Sauce拌海螺:Whelks and Cucumber拌苦菜:Mixed Bitter Vegetables拌茄泥:Mashed Eggplant with Garlic拌双耳:Tossed Black and White Fungus拌爽口海苔:Sea Moss with Sauce拌香椿苗:Chinese Toon with Sauce包子:Baozi鲍鱼红烧肉:Braised Pork with Abalone鲍汁扣东坡肉:Braised Dongpo Pork with Abalone Sauce。

STC12C5A60S2单片机简介

STC12C5A60S2单片机简介

STC12C5A60S2单片机简介:STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍.内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

工作电压:STC12C5A60S2系列工作电压:5。

5V—3.3V(5V单片机)STC12C5A60S2是哪一类单片机?是8051系列单片机,与普通51单片机相比有以下特点:1、同样晶振的情况下,速度是普通51的8~12倍2、有8路10位AD3、多了两个定时器,带PWM功能4、有SPI(串行外设接口)接口5、有EEPROM6、有1K内部扩展RAM7、有WATCH_DOG8、多一个串口9、IO口可以定义,有四种状态10、中断优先级有四种状态可定义单片2.4G无线射频收发芯片nRF24L01:可接受5V电平的输入,工作电压1。

9~3.6V,单片无线收发器芯片,数字调制方法,如:ASK-—幅移键控调制,把二进制符号0和1分别用不同的幅度来表示.FSK——频移键控调制,即用不同的频率来表示不同的符号。

如2KHz表示0,3KHz表示1. GFSK--高斯频移键控,在调制之前通过一个高斯低通滤波器来限制信号的频谱宽度。

单片机的PCA模块:PCA(可编程计数器阵列Programmable Counter Array)可编程计数器阵列(PCA)提供增强的定时器功能,与标准8051计数器/定时器相比,它需要较少的CPU干预.由高字节(PCAH)和低字节(PCAL)组成。

25页报告出现的传感器:RPR220:反射型光电探测器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A/D转换测试程序(ADC查询方式)
#include “stc12c5a.h”//头文件在STC公司主页上下载
#include ”intrins.h”
//与STC12C5A60S2单片机ADC相关的寄存器说明//
Sfr ADC_CONTR = 0xBC;//AD转换控制寄存器
Sfr ADC_RES = 0xBD;//AD转换结果寄存器高
Sfr ADC_RESL = 0xBE;//AD转换结果寄存器低
Sfr P1ASF = 0x9D;//P1口模拟转换功能控制寄存器
Sfr AURX1 = 0xA2;//AD转换结果存储方式控制位
#define ADC_POWER 0x80 //ADC电源开
#define ADC_FLAG 0x10 //ADC结束标志位
#define ADC_START 0x08 //ADC启动控制位设为开
#define ADC_SPEEDLL 0x00 //设为540个时钟周期ADC一次
#define ADC_SPEEDL 0x20 //设为360个时钟周期ADC一次
#define ADC_SPEEDH 0x40 //设为180个时钟周期ADC一次
#define ADC_SPEEDHH 0x60 //设为90个时钟周期ADC一次
void AD_init(void);
void delay(unsigned int a);
unsigned int AD_get(unsigned char n);
float AD_work(unsigned char n);
void main()
{
unsigned char i;
AD_init();
while(1)
{
for(i=0;i<8;i++)
{
AD_work(i);
delay(20);
}
}
}
unsigned int AD_get(unsigned char n) //第n通道ADC采样函数
{
unsigned int adc_data;
ADC_RES = 0; //清零
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|n|ADC_START;//打开AD转换电源、
设定转换速度、设定通道号、AD转换开始
_nop_();_nop_();_nop_();_nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR?寄存器?
while(!(ADC_CONTR&ADC_FLAG)); //等待转换完成
adc_data=ADC_RES; //转换结果计算,取8位结果
ADC_CONTR&=~ADC_FLAG;//关闭AD转换,ADC_FLAG位由软件清0
return adc_data;???//返回ADC的值
}
float AD_work(unsigned char n)
{
float AD_val; //定义处理后的数值AD_val为浮点数
unsigned char i;
for(i=0;i<100;i++)
AD_val+=AD_get(n); //转换100次求平均值(提高精度)
AD_val/=100;
AD_val=(AD_val*5)/256; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
return AD_val;
}
void AD_init(void)
{
P1ASF = 0xff; //P1口全部作为模拟功能A/D使用
ADC_RES = 0; //清零转换结果寄存器高8位
ADC_CONTR = ADC_POWER|ADC_SPEEDLL;
delay(2); //等待1ms,让AD电源稳定
}
void delay(unsigned int a)
{
unsigned int i;
while (a--)
{
i=5000;
while(i--);
}
}。

相关文档
最新文档