写一个用stc8f2k08s2资料的比较器当做ADC监测电压的小程序

今日: 5&|主题: 2316|排名: 36&
版主: , , ,
昨天&23:10
前天&18:44
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.comSTC8f2k08s2 的sysclk系统时钟与STC-ISP烧录器中(输入用户运行程序是IRC频率)有什么关系?_百度知道
STC8f2k08s2 的sysclk系统时钟与STC-ISP烧录器中(输入用户运行程序是IRC频率)有什么关系?
STC8f2k08s2的系统时钟是内部IRC(默认24Mhz)经过CLKDIV寄存器(复位值 )得到的4分频(6Mhz),这是提供给单片机CPU的系统频率嘛,计算波特率的时候应该用那个频率呢?(经过我实验验证任何一个频率只有和“输入用户运行程序是IRC频率”一致都是可...
我有更好的答案
有很多误差,那么你的串口就没法通讯了,4经验告诉我们,烧写时尽量用24M,或22.1184 才是正确主频,然后再硬分频1 尽量选择24Mhz烧写,CLKDIV=0x04,就是6M2 尽量选择24Mhz烧写 默认不操作CLKDIV,或者CLKDIV|=0x04,就是6M3如果你选择 6Mhz烧写,可能是5M,即CLKDIV=0x04,才是6M,那么烧写出主频不是6M
采纳率:46%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。STC15F2K60S2 定时器2测试。C_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STC15F2K60S2 定时器2测试。C
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢STC12C2052AD单片机AD转换C语言程序
> STC12C2052AD单片机AD转换C语言程序
STC12C2052AD单片机AD转换C语言程序
首先:这个小程序搞了我两天,加上焊板子共三天,当然是业余时间。也有24个小时了。本文引用地址:我瞪着电脑两个晚上,我拆了装,装了拆(下载程序不在本板子上)。最后,就在今天!(&今&读四声)18点。可让我找到问题所在了!搞了两个晚上,控制流程,根本没错!!!!啊!! 错就错在一个小地方,打死都想不到的地方。具体错在哪,请在下文中找!!!!功能:STC12C2052 C程序 +PWM输出功能 成功使用。应用:AD检测电压进行过欠压保护(继电器控制)+PWM把直流电压斩波成脉动直流。板子功能:给手机电池充电。降压用的LM317,小电流应用应该够了。没时间去买开关管,就用的9013开关。图纸://以下是成功了的程序。如果你需要应用在你自己的项目中,您只需要更改io就能直接应用了//程序的完整版本下载地址:http://www.51hei.com/ziliao/file/stc12c2052adde.rar#include stc12c2052ad.h& //stc专用的头文件#include intrins.h&#define uchar unsigned char#define uint unsigned int#define AD_SPEED 0x60 // 1 270个时钟周期一次, /************河北正定欢迎您!少占鱼欢迎您!******************************///sbit M=P1^5; //过压指示灯 sbit N=P1^3; //欠压指示灯 sbit LED=P1^7; //工作正常灯 sbit CONTRL=P3^4; //输出控制端 sbit PWM=P3^7;/****************************************************************/void pwm();void delayms(uint);uint ADC();void InitADC();void baohu();float voltage=0.0; uint V;float VCC=5.05;uchar mtab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};/***8**************************************************************/void main(){
CONTRL=0;//先关闭输出
delayms(700);V=40; //这些是我差错的时候添上去的。目的在于弄明白到底AD转换了没有。voltage=4.0;//实践证明,更换数值没用,说明没ADLED=0;CONTRL=1; voltage=V*VCC/256.00*5.00; delayms(1000);PWM=1; CONTRL=1;//继电器工作,是保护状态 delayms(1000);M=0;N=0;LED=0; delayms(2000);M=1;N=1; LED=1; pwm();//产生PWM波形
delayms(7000); delayms(100);//延时
InitADC(); delayms(20); V= ADC();baohu(); while(1) { V= ADC(); baohu();delayms(300); } }////void pwm(){
//PCA模块工作于PWM模式 C程序 CMOD = 0x04; //用定时器0溢出做PCA脉冲CL = 0x00; //PCA定时器低8位 地址:E9HCH = 0x00; //PCA高8位 地址 F9HCCON=0x00;CCAP0L = 0x60; //PWM模式时他俩用来控制占空比CCAP0H = 0x60; //0xff-0xc0=0x3f 64/256=25% 占空比(溢出)CCAPM0 = 0x42; // Setup PCA module 0 in PWM mode // ECOM0=1使能比较 PWM0=1 使能CEX0脚用作脉宽调节输出/*********************PCA 模块工作模式设置 (CCAPMn 寄存器 n= 0-3四种)7 6 5 4 3 2 1 0- ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn选项: 0x00 无此操作 0x20 16位捕捉模式,由 CEXn上升沿触发 0x10 16位捕捉模式,由CEXn下降沿触发 0x30 16位捕捉模式,由CEXn的跳变触发 0x48 16位软件定时器 0x4c 16位高速输出 0x42 8位PWM输出每个PCA模块另外还对应两个寄存器:CCAPnH和CCAPnL 。 捕获或者比较时,它们用来保存16位计数值,当工作于PWM模式时,用来控制占空比*******************************/ TMOD=0x02;TH0=0x06;TL0=0x06; CR=1; //Start PCA Timer.TR0=1;}//AD转换初始化 ----打开ADC电源 void InitADC(){P1=0ADC_CONTR|=0x80;delayms(80);//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作 /*****************P1M0 和P1M1 寄存器位 7 6 5 4 3 2 1 0
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 同理P3M0 P3M0 也是。因为只有两个P口,所以只有这俩组 STC12C5410AD还多P2M0 P1M0 有三组
P1M0 P1M1 高
0 0 普通I0口 (准双向) P1寄存器位 7 6 5 4 3 2 1 0 0 1 强推挽输出 (20MA电流 )尽量少用 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1 0 仅做输入 A/D转换时可用此模式 1 1 开漏 ,A/D转换时可用此模式
要设置P1.2为 AD 输入口
则 P1M0=0X02 ; P1M1=0X02; 开漏即可
当不用AD时,最好 关闭ADC电源 ,恢复为IO口状态 ********************************/P1M0=0x02;//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作 P1M1=0x02;//设置P1.1为开漏状态 }// AD转换程序 /******************************************************注意:这个函数里注释的命令是通用命令,可以针对所有AD通道使用,我这就认准了P1.1一个通道,所以直接//赋值,省点流量!折磨我的问题就出在这个函数里的while等待语句while (1) //等待A/D转换结束
if (ADC_CONTR
0x10) // 测试A/D转换结束否
} 这是能用的,我原来写的是:while (ADC_CONTR
0x10==0);这样写不能用,再说一遍:这样就不能用了!! 至于为嘛,因为 优先级,&==&比优先级高,所以加个括号就可以了while ( (ADC_CONTR
0x10) == 0 );不经常用C语言,就会记不住啦!!!由此得到一个教训;小问题影响效率经验:经常加一加括号会死啊,似乎也不耗&流量&吧!!*********************************************/uint ADC() {
ADC_DATA = 0; //清除结果
ADC_CONTR = 0x60; //转换速度设置 0x60 最快速度
ADC_CONTR = 0xE0; // 清 ADC_FLAG, ADC_START 位和低 3 位
ADC_CONTR =0xe1; // ADC_CONTR |= 0x01; //选择 A/D 当前通道 P1.1
delayms(1); //使输入电压达到稳定
ADC_CONTR = 0xe9; // ADC_CONTR |= 0x08; // 令 ADCS = 1, 启动A/D转换,
while (1) //等待A/D转换结束
if (ADC_CONTR
0x10) // 测试A/D转换结束否
ADC_CONTR =0xe1; //ADC_CONTR = 0xE7; // 清 ADC_FLAG 位, 关闭A/D转换,
return ADC_DATA; //返回 A/D 10 位转换结果 } //void baohu(){voltage=V*VCC/256.00*5.00;if( voltage&5.25) { CONTRL=1;//过压保护 ,关断开关管控制端
M=0;N=1; LED=1; }if(voltage4.60) {
CONTRL=1;//保护继电器打开,常闭触点断开保护
N=0;M=1;LED=1; }if(voltage&4.62voltage5.24) { LED=0; M=1; N=1; CONTRL=0;//继电器断开,正常状态
}}void delayms(uint k){uint data i,j;for(i=0;i
三极管相关文章:
pwm相关文章:
c语言相关文章:
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一STC15F2K61S2单片机用PCA模块输出PWM波,可是用示波器看波形,波形显示的和程序是反的!!!
[问题点数:40分,结帖人u]
STC15F2K61S2单片机用PCA模块输出PWM波,可是用示波器看波形,波形显示的和程序是反的!!!
[问题点数:40分,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|

我要回帖

更多关于 stc8f2k08s2 的文章

 

随机推荐