stc12c5a60s2 pwm有多大eproom

Altium_Designer区域_ROOM_规则使用方法
Altium_Designer区域_ROOM_规则使用方法
Altium_Designer区域_ROOM_规则使用方法下载
下载资料需要,并消耗一定积分。
下载此资料的人还喜欢:
技术交流、我要发言! 发表评论可获取积分! 请遵守相关规定。
本周热点资料
电子资料热门词
上传者其它资料
PCB设计规则下载排行STC12C5A60S2系列单片机10位ADC(模数转换)官方测试结果(4096个测试点,非常线性)(转自STC官网:)
STC12C5A60S2系列单片机10位ADC官方测试结果(4096个测试点,非常线性)
附:STC的STC12C5A60S2模数转换ADC官方C例程:
(转换结果高8位在:ADC_RES,低2位在:ADC_LOW2)
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 (STC12C5A60S2)系列 AD转换查询方式举例--------------*/
/* --- Mobile: (86) ----------------------------------------*/
/* --- Fax: 86-755- -------------------------------------------*/
/* --- Tel: 86-755- -------------------------------------------*/
/* --- Web:
-----------------------------*/
/* 如果要在程序中使用此代码, 请在程序中注明使用了宏晶科技的资料及程序
/* 如果要在文章中应用此代码, 请在文章中注明使用了宏晶科技的资料及程序
/*---------------------------------------------------------------------*/
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18.432MHz
#include "reg51.h"
#include "intrins.h"
#define FOSC&&&&L
#define BAUD&&&&9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define&&&& URMD&&&&0&&&&&&&&&& //0:使用定时器2作为波特率发生器
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
sfr T2H&& = 0xd6;&&&&&&&&&&&&&& //定时器2高8位
sfr T2L&& = 0xd7;&&&&&&&&&&&&&& //定时器2低8位
sfr&&AUXR&&&&&& =&& 0x8e;&&&&&& //辅助寄存器&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
sfr ADC_CONTR&& =&& 0xBC;&&&&&&&&&& //ADC控制寄存器
sfr ADC_RES&&&& =&& 0xBD;&&&&&&&&&& //ADC高8位结果
sfr ADC_LOW2&&&&=&& 0xBE;&&&&&&&&&& //ADC低2位结果
sfr P1ASF&&&&&& =&& 0x9D;&&&&&&&&&& //P1口第2功能控制寄存器
#define ADC_POWER&& 0x80&&&&&&&&&&&&//ADC电源控制位
#define ADC_FLAG&&&&0x10&&&&&&&&&&&&//ADC完成标志
#define ADC_START&& 0x08&&&&&&&&&&&&//ADC起始控制位
#define ADC_SPEEDLL 0x00&&&&&&&&&&&&//540个时钟
#define ADC_SPEEDL&&0x20&&&&&&&&&&&&//360个时钟
#define ADC_SPEEDH&&0x40&&&&&&&&&&&&//180个时钟
#define ADC_SPEEDHH 0x60&&&&&&&&&&&&//90个时钟
void InitUart();
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
void main()
&&&&InitUart();&&&&&&&&&&&&&&&&&&&& //初始化串口
&&&&InitADC();&&&&&&&&&&&&&&&&&&&&&&//初始化ADC
&&&&while (1)
&&&&&&&&ShowResult(0);&&&&&&&&&&&&&&//显示通道0
&&&&&&&&ShowResult(1);&&&&&&&&&&&&&&//显示通道1
&&&&&&&&ShowResult(2);&&&&&&&&&&&&&&//显示通道2
&&&&&&&&ShowResult(3);&&&&&&&&&&&&&&//显示通道3
&&&&&&&&ShowResult(4);&&&&&&&&&&&&&&//显示通道4
&&&&&&&&ShowResult(5);&&&&&&&&&&&&&&//显示通道5
&&&&&&&&ShowResult(6);&&&&&&&&&&&&&&//显示通道6
&&&&&&&&ShowResult(7);&&&&&&&&&&&&&&//显示通道7
/*----------------------------
发送ADC结果到PC
----------------------------*/
void ShowResult(BYTE ch)
&&&&SendData(ch);&&&&&&&&&&&&&&&&&& //显示通道号
&&&&SendData(GetADCResult(ch));&&&& //显示ADC高8位结果
//&&&&SendData(ADC_LOW2);&&&&&&&&&& //显示低2位结果
/*----------------------------
读取ADC结果
----------------------------*/
BYTE GetADCResult(BYTE ch)
&&&&ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
&&&&_nop_();&&&&&&&&&&&&&&&&&&&&&&&&//等待4个NOP
&&&&_nop_();
&&&&_nop_();
&&&&_nop_();
&&&&while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
&&&&ADC_CONTR &= ~ADC_FLAG;&&&&&&&& //Close ADC
&&&&return ADC_RES;&&&&&&&&&&&&&&&& //返回ADC结果
/*----------------------------
初始化串口
----------------------------*/
void InitUart()
&&&&SCON = 0x5a;&&&&&&&&&&&&&&&&//设置串口为8位可变波特率
#if URMD == 0
&&&&T2L = 0xd8;&&&&&&&&&&&&&&&& //设置波特率重装值
&&&&T2H = 0&&&&&&&&&&&&&&&& //115200 bps(00/4/115200)
&&&&AUXR = 0x14;&&&&&&&&&&&&&&&&//T2为1T模式, 并启动定时器2
&&&&AUXR |= 0x01;&&&&&&&&&&&&&& //选择定时器2为串口1的波特率发生器
#elif URMD == 1
&&&&AUXR = 0x40;&&&&&&&&&&&&&&&&//定时器1为1T模式
&&&&TMOD = 0x00;&&&&&&&&&&&&&&&&//定时器1为模式0(16位自动重载)
&&&&TL1 = 0xd8;&&&&&&&&&&&&&&&& //设置波特率重装值
&&&&TH1 = 0&&&&&&&&&&&&&&&& //115200 bps(00/4/115200)
&&&&TR1 = 1;&&&&&&&&&&&&&&&&&&&&//定时器1开始启动
&&&&TMOD = 0x20;&&&&&&&&&&&&&&&&//设置定时器1为8位自动重装载模式
&&&&AUXR = 0x40;&&&&&&&&&&&&&&&&//定时器1为1T模式
&&&&TH1 = TL1 = 0&&&&&&&&&& //115200 bps(256 - /115200)
&&&&TR1 = 1;
/*----------------------------
----------------------------*/
void InitADC()
&&&&P1ASF = 0&&&&&&&&&&&&&&&&&& //设置P1口为AD口
&&&&ADC_RES = 0;&&&&&&&&&&&&&&&&&&&&//清除结果寄存器
&&&&ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
&&&&Delay(2);&&&&&&&&&&&&&&&&&&&&&& //ADC上电并延时
/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
&&&&while (!TI);&&&&&&&&&&&&&&&&&&&&//等待前一个数据发送完成
&&&&TI = 0;&&&&&&&&&&&&&&&&&&&&&&&& //清除发送标志
&&&&SBUF =&&&&&&&&&&&&&&&&&&&& //发送当前数据
/*----------------------------
----------------------------*/
void Delay(WORD n)
&&&&while (n--)
&&&&&&&&x = 5000;
&&&&&&&&while (x--);
STC系列单片机的参考电压源就是输入工作电压Vcc,所以一般不用外接参考电压源,如7805三端稳压块的输出电压是5V,但实际电压可能是4.88V到4.96V,用户需要精度比较高的话,可在出厂时将实际测出的工作电压值记录在单片机内部的EEPROM(FLASH)里面,以供计算。
如果有些用户的Vcc不固定,如电池供电,电池电压在5.3V-4.2V之间飘逸,则Vcc不固定,就需要在8路A/D转换的一个通道外接一个稳定的参考电压源(例如TL431),来计算出此时的工作电压Vcc,再计算出其他几路A/D转换通道的电压。如可在ADC转换通道的第七通道外接一个1.25V(或1V等)的基准参考电压源,由此求出此时的工作电压Vcc,再计算出其他几路A/D转换通道的电压(理论依据是短时间之内Vcc不变)。
相关链接:
( -整理,请以最新资料为准!)你好,我看了你的关于STC12C5A60S2 的EEPROM的程序,我还是找不到问题在哪,请指教,谢谢!!!分全给你_百度知道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 &stc12.h&
#include &intrins.h&
#include &ad.h&
#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 &clock
uchar ADCresult(uchar aa) //这里的参数是哪个口来ad转换
P1ASF=0X01; //这里的选择和用哪一个P1口作为ad采样
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|
//ADC_CONTR=0X88|
_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 将标志位清零等待下次硬件置1
ad=(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 ADC result(为显示整数,这里将电压值扩大了十倍)&
& & & & & & & & & & & & & & & & & & & & &//10位AD采集 即2的10次方 满值为1024 这里用1024表示5伏的电压&
//那么用采集到的数量值 除以1024 在乘以5 得到的值就是采集的电压数值
//这里 又*100 是为了扩大100倍 显示小数位
& & & & & & & & & & & & & & & & & & & & &//ADC_RES*(5/256) 为采集的电压值 &然后扩大10倍便于计算
这里只是个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会出现错误,具体原因还不清楚
先说到这吧
【】【】【】【】
上一篇:下一篇:“always @(*)”中‘*’所代表的意思
CopyRight @
单片机教程网
, All Rights ReservedSTC12C5A60S2&EEPROM应用程序
#include "stc12c5a60s2.h"
#include "intrins.h"
#define nop() _nop_()
#define uchar unsigned char
#define uint unsigned int
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83
sbit s=P1^1;
sbit h=P1^0;
void delay(uchar i)
&while(i--)
& for(j=0;j&125;j++);
void IapIdle()
&IAP_CONTR=0;
&IAP_CMD=0;
&IAP_TRIG=0;
&IAP_ADDRH=0X80;
&IAP_ADDRL=0;
uchar IapReadByte(uint addr)
&IAP_CONTR=ENABLE_IAP;
&IAP_CMD=CMD_READ;
&IAP_ADDRL=
&IAP_ADDRH=addr&&8;
&IAP_TRIG=0x5a;
&IAP_TRIG=0xa5;
&dat=IAP_DATA;
&IapIdle();
void IapProgramByte(uint addr,uchar dat)
&IAP_CONTR=ENABLE_IAP;
&IAP_CMD=CMD_PROGRAM;
&IAP_ADDRL=
&IAP_ADDRH=addr&&8;
&IAP_DATA=
&IAP_TRIG=0x5a;
&IAP_TRIG=0xa5;
&IapIdle();
void IapEraseSector(uint addr)
&IAP_CONTR=ENABLE_IAP;
&IAP_CMD=CMD_ERASE;
&IAP_ADDRL=
&IAP_ADDRH=addr&&8;
&IAP_TRIG=0x5a;
&IAP_TRIG=0xa5;
&IapIdle();
void main()
&uchar temp=0;
&if(IapReadByte(0x0000)==0xff||h==0)
& IapEraseSector(0x0000);
& IapProgramByte(0x);
& P0=IapReadByte(0x0000);
& while(s==0)
&& delay(50);
&& if(s==1)
IapEraseSector(0x0000);
IapProgramByte(0x);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 stc12c5a60s2串口程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信