[解决办法]单片机输出PWM波,ds18b20采集温度因PWM的中断导致温度读取有错误的解决办法。

jackxiang 2012-8-25 23:44 | |
严泽远  10:08:42
我用的是STC12C5628AD

回忆未来-向东-Jàck  13:08:22
AT89S52有软件喂狗,但是STC12C5A60S2 单片机有硬件看门狗,用哪个好呢?
张彦欣单片机  13:59:27
AT89S52有看门狗?
回忆未来-向东-Jàck  14:11:23
STC12C5A60S2  这个也需要写代码喂狗?
回忆未来-向东-Jàck  14:13:50
STC12C5A60S2  这个自己带PWM,我用AT89S52的定时器产生也成,但是好像时序有点问题,如果不关中断的话。所以,STC12C5A60S2  感觉要稳定点儿,兄弟怎么看?
张彦欣单片机  14:15:19
是的。


用单片机做的温度监控系统,ds18b20采集温度,现在还要输出PWM波频率为100HZ,应该如何实现?求大神指点
用低定时器中断时不行的,会使ds18b20输出错误,若在ds18b20程序中关中断,pwm波会有断续。
我告诉你为什么:
因为定时器中断是强制性的,一旦计时溢出,无论程序执行到何处都会被暂停,优先去执行中断服务程序。 DS18B20这种对时序有严格要求的单总线通讯,在发送和接收数据时被定时器中断扰乱了时序,所以无法通讯。要解决此问题建议你采用带硬件PWM的MCU,或者将18B20通讯代码放在中断服务程序内部,如果采用后一种方式,PWM计时时间请算上18B20通讯的时间。

这是一定不行的,定时器写的pwm是会破坏18b20的时序的;
如果时间允许序的话,即pwm高(低)电平时间大于读写18b20的时间;我建议你在每个pwm的高(低)电平的时候进行18b20的操作;
若时间不允许的话,那么只能在定时器中加上18b20的读取时间了,这样将会很麻烦;
以上仅供参考。

稍微高级一点的MCU应该带有PWM寄存器吧,STC也有类似40个引脚的增强型的单片机,如:stc12c5a60s2
http://item.taobao.com/item.htm?spm=a230r.1.10.210&id=9929702075
书:“十五”高等院校规划教材:《增强型8051单片机实用开发技术》
好多地都没有货了,直接购买PDF版本:http://item.taobao.com/item.htm?spm=a230r.1.10.86.WziaXb&id=16258074740
百度文库PWM简单代码:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
淘宝上有卖开发板的,找到两家便宜的店:
http://item.taobao.com/item.htm?spm=a230r.1.10.208.JW2dkE&id=14811238438&_u=u19u1s735c
对于PWM输出的硬件设计PPT:http://wenku.baidu.com/view/75758588cc22bcd126ff0ca3.html
这样的设计势必要对应程序:http://wenku.baidu.com/view/f02443bd960590c69ec3760f.html
更简单的PWM设置链接:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
,比如有独立的PWM模块,AT24C04等,和AT系列的单片机不同点在于没有仿真罢了。我遇到这种问题是直接在读取温度时就把中断关闭,不让PWM的中断打扰,读取温度的时间应该很短,影响不大,By:jack
STC12C5A60S2能直接替换STC89C52开发板的上的STC89C52单片机吗?
是40引脚的吧 是的话 应该可以
单片机其他外延模块 LED LCD 蜂鸣器 彩灯之类的 需要单片机来的信号都是TTL信号 单片机的电压变化都是一致的 可以进行替换 芯片只要能实现引脚高低信号电压的一致就没问题
您好:
    可以的。STC12C5A60S2和STC89C52引脚兼容,前者只是P0口复用了AD,内部资料多了点。
http://zhidao.baidu.com/question/206521917.html?fr=qrl&cid=93&index=1

STC12C5A60S2开了两路PWM,还能不能开定时器0中断啊
可以的,STC12C5A60S2的PWM是独立的硬件模块,不耗STC12C5A60S2的指令执行,所以可以开定时器0中断以及处理其它任务
    STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2只能使用独立波特率发生器作为波特率发生器。

一个基础板兼容多种STC和ATMel的单片机板:
http://item.taobao.com/item.htm?spm=a230r.1.10.56.zM593N&id=18138913000
答:支持STC89C52、STC12C5A60S2、AT89C51、AT89C52、AT89S51、AT89S52等最常用的51系列单片机。除此之外,还支持其它40脚的51系列单片机以及ATmega16!STC89C52、STC12C5A60S2可以用串口直接下载程序

DS18B20用N次定时中断读取,比如4MS中断一次,第1次复位18B20,
第2次18B20引脚置高,第3次发出转换命令 搜索器件,并启动,到第40次时再复位18B20,41次引脚置高,42次读取命令,43次读取数据。也就是说读取一次温度,需要中断43次,整个过程都在中断中执行。pwm就可以用中断了,18B20也不会读取错误了。希望对你有帮助。
实时是不行了,这儿可以参考一下时间错位的办法:http://bbs.icbuy.com/thread-57813-1-1.html

STC12C5A60S2单片机双串口,为什么串口1用独立波特率发生器时还要使能定时器(0/1)并允许定时器中断?

串口1波特率可使用定时器1或者独立波特率发生器,使用定时器1时做波特率发生时,你就不能用定时器1了,使用独立波特率发生器时,定时器1得到释放,你可以随时使用;此时你使能定时器(0/1)并允许定时器中断只是为了释放定时器,当然你用不到定时器中断,也可以关掉,对波特率无影响的

STC单片机11.0592晶振实现115200波特率串口通信
在8051系列单片机如:89S51、89C51 这些单片机上,用11.0592M晶振实现115200波特率通信,几乎是不可能的。
 
如果换了STC单片机,例如在STC12C5A60S2实现115200的高速通信就相当简单了。
因为,STC12单片机有独立的波特率发生器。
 
#include "STC12C5A60S2.H"
#include "stdio.h" 
void init_uart()

    PCON &= 0x7f;  //波特率不倍速
   SCON = 0x50;  //8位数据,可变波特率
   BRT = 0xFD;      //设定独立波特率发生器重装值
   AUXR |= 0x04;  //独立波特率发生器时钟为Fosc,即1T
   AUXR |= 0x01;  //串口1选择独立波特率发生器为波特率发生器
   AUXR |= 0x10;  //启动独立波特率发生器
}
 
char putchar (unsigned char i)
{
    ES     =   0;  //关串口中断
    TI     =   0;  //清零串口发送完成中断请求标志
    SBUF   =   i;
    while(TI ==0); //等待发送完成
    TI     =   0;  //清零串口发送完成中断请求标志
    ES     =   1;  //允许串口中断
    return SBUF;
}
 
记得头文件加上  stdio.h,然后在代码里实现 putchar 函数,这样你就可以很方便的用 printf函数进行串口输出了。
例如
    int hh=0,mm=0,ss=0;
    printf("现在的时间:%d:%d:%d\r\n", hh,mm,ss);
 
是不是串口输出变简单多了。


附录:
下面这个Url的问题应该也是一样的问题,Url:http://bbs.zyxmcu.com/forum.php?mod=viewthread&tid=437&page=1

张大侠,小弟最近遇到一个问题,我做了一个简单的温度控制功能:1602液晶显示温度相关信息,串口向上发送和接受PID,PWM控制,可我用的是T0做的PWM,用T1做的串口波特发生,出现一个问题:我的PWM中断老是进不去,还请张大侠帮忙瞧瞧是肿么了,代码如下:
代码:



这位王建军兄弟的代码采用了在读取温度时是ADC0809采集数据,IN4148为温度传感器,值得学习参考:




STC单片机最新型号——STC12C5A60S2


STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。
1.增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;
2.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机);
3.工作频率范围:0 - 35MHz,相当于普通8051的 0~420MHz;
4.用户应用程序空间8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K字节;
5.片上集成1280字节RAM;
6.通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55Ma;
7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器  可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;
8.有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM);
9. 看门狗;
10.内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);
11.外部掉电检测电路:在P4.6口有一个低压门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%;
12.时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 1用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟,常温下内部R/C振荡器频率为:5.0V单片机为:11MHz~15.5MHz,3.3V单片机为:8MHz~12MHz,精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准;
13.共4个16位定时器   两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器   做串行通讯的波特率发生器   再加上2路PCA模块可再实现2个16位定时器;
14. 2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟;
15.外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块, Power Down模式可由外部中断唤醒,INT0/P3.2,INT1/P3.3,T0/P3.4, T1/P3.5, RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3);
16. PWM(2路)/PCA(可编程计数器阵列,2路):
——也可用来当2路D/A使用
——也可用来再实现2个定时器
——也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持);
17.A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次)18.通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口;
19. STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3);
20.工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48  I/O口不够时,可用2到3根普通I/O口线外接  74HC164/165/595(均可级联)来扩展I/O口,  还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。
 
数据手册下载:STC12C5A60S2  http://course.zjnu.cn/dpjyl/upload/2010_04/10041015327108.pdf

资料整理:余水宝、陈希

 


STC12C5A60S2可调节PWM输出 (按键或串口调节):http://www.ndiy.cn/thread-6455-1-1.html






Stc PWM  设置方法:

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/5533/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2013-1-7 14:19
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]