延时1秒钟左右某个IO口输出取反程序

[复制链接]
12653|22
手机看帖
扫描二维码
随时随地手机跟帖
hanwe|  楼主 | 2021-6-15 23:08 | 显示全部楼层 |阅读模式
我用pic12F1822的单片机 ,烧录了一段程序,功能是延时1秒钟左右某个IO口输出取反,也就是想输出占空比为50%的方波,结果上电以后用示波器观察,发现占空比为60%以上,且在60%到67%之间有浮动。我把该io口悬空,再用示波器看,还是一样的结果。还有我用2块这种单片机烧录同样的程序,同时上电,发现输出的方波频率有几个mhz的差异,到底我错在哪里啊?

使用特权

评论回复
huwr| | 2021-6-15 23:11 | 显示全部楼层
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
hanwe|  楼主 | 2021-6-15 23:13 | 显示全部楼层
我是想用几个单片机输出一模一样的占空比都为50%的方波,但是发现不同个体输出的方波频率有比较小的差异,且占空比为60%多,我没有用片外晶振。请指教

使用特权

评论回复
xxrs| | 2021-6-15 23:16 | 显示全部楼层
假设延时是用定时器做的,且定时正确。
那么,
IO没有接负载吗?
IO先改用上拉输出再试一下!

使用特权

评论回复
hanwe|  楼主 | 2021-6-15 23:18 | 显示全部楼层
这个io口是输出经三极管放大后控制mos管开关灯板的,程序就是延时后取反,反复循环,没用定时器,照理来说占空比应该是50%啊

使用特权

评论回复
hanwe|  楼主 | 2021-6-15 23:20 | 显示全部楼层
我在使用这款单片机的时候发现相同的程序烧录在2个片子里面,出来的波形周期时间并不完全相同,

使用特权

评论回复
jiaxw| | 2021-6-15 23:23 | 显示全部楼层
难道是因为晶振在2个片子内部频率并不完全相同吗

使用特权

评论回复
jiajs| | 2021-6-15 23:32 | 显示全部楼层
程序贴出来看看吧

使用特权

评论回复
hanwe|  楼主 | 2021-6-15 23:36 | 显示全部楼层

unsigned char int_flag;

void interrupt int_9v()
{
    INTF=0;
    INTE=0;
    int_flag=1;
}
void main(void)
{
    int a,b;   
    WPUA=0;   
    SWDTEN=0;
    ANSELA =0x00;
    TRISA=0X0C;
    LATA=0;
    RA0=0;
    INTEDG=1;
    GIE=1;
    INTE=1;
    while(int_flag==0);
    int_flag=0;
    while(1)
    {

        RA0=!LATA0;
        for(a=100;a>1;a--)
        {
            for(b=100;b>1;b--);
        }
        
     }   

使用特权

评论回复
hanwe|  楼主 | 2021-6-15 23:38 | 显示全部楼层
我第一次用这个单片机,程序凑合着看,主要是我把这程序烧录到2个片子里面,用示波器看RA2端引起中断的信号波形一直都是重合的,即基本一致,没什么纹波,但是输出io的波形一开始同步,但是慢慢的就错开了

使用特权

评论回复
hanwe|  楼主 | 2021-6-15 23:41 | 显示全部楼层
一看一个频率是480mhz,另一个是476mhz,且有几mhz的波动,慢慢就错开了,然后我就想别的法子,上面的程序是后来想验证想法改过了的,想试试就开头中断依次,然后定时,看波形能一直同步不,结果发现占空比都不是50%,而且也是慢慢错开,我就懵了,想是否是片内晶振有差异的缘故,请指点

使用特权

评论回复
dingy| | 2021-6-15 23:43 | 显示全部楼层
时钟问题吧

使用特权

评论回复
huangchui| | 2021-6-15 23:46 | 显示全部楼层
内部晶振有误差!

使用特权

评论回复
jlyuan| | 2021-6-15 23:47 | 显示全部楼层
精确定时,推荐外接振荡器

使用特权

评论回复
hanwe|  楼主 | 2021-6-15 23:49 | 显示全部楼层
123540c7l9zvl7evfbvruu.png.thumb.jpg

使用特权

评论回复
pengf| | 2021-6-15 23:51 | 显示全部楼层
用这个编译器的延迟试试“__delay_ms();”

使用特权

评论回复
dengdc| | 2021-6-15 23:54 | 显示全部楼层
这类需要精确计时的,觉得还是要用片外晶振好。

使用特权

评论回复
yszong| | 2021-6-15 23:56 | 显示全部楼层
__delay_ms() 用这个试试

使用特权

评论回复
CoolSilicon| | 2021-6-16 10:40 | 显示全部楼层
hanwe 发表于 2021-6-15 23:36
unsigned char int_flag;

void interrupt int_9v()

1. 中断干嘛的?把中断关掉试试.
2.  RA0=!LATA0;改成LATA0 ^= 1;

使用特权

评论回复
sparrow054| | 2021-6-16 10:59 | 显示全部楼层
我感觉,MHZ的频率有点高

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

979

主题

8749

帖子

4

粉丝