标题: 51单片机定时器误差极大,为什么,是我编的有问题? [打印本页]

作者: dzl111    时间: 2021-3-28 19:35
标题: 51单片机定时器误差极大,为什么,是我编的有问题?
请问为什么这个计时器为30s改变一次电位,仿真出来永远差10s左右,为什么会差太多
程序在3楼

作者: 51hei团团    时间: 2021-3-28 21:12
程序不全,无法分析啊
作者: dzl111    时间: 2021-3-28 22:33
51hei团团 发表于 2021-3-28 21:12
程序不全,无法分析啊

不好意思,麻烦您一下
#include <reg51.h>

typedef unsigned int u16;

sbit B_RED = P0^0;
sbit B_GRN = P0^1;
sbit B_YLW = P0^2;
sbit N_RED = P3^3;
sbit N_GRN = P3^4;
sbit N_YLW = P3^5;

sbit D_RED = P0^3;
sbit D_GRN = P0^4;
sbit D_YLW = P0^5;
sbit X_RED = P3^0;
sbit X_GRN = P3^1;
sbit X_YLW = P3^2;

u16 RED,YLW,GRN;

void main(void)
{
   // Write your code here
       
        /*初始状态*/
        B_RED = 0;
    B_GRN = 1;
        B_YLW = 1;
    N_RED = 0;
    N_GRN = 1;
    N_YLW = 1;

    D_RED = 1;
    D_GRN = 0;
    D_YLW = 1;
    X_RED = 1;  
        X_GRN = 0;
    X_YLW = 1;
       
        /*定时器*/
        TMOD = 0x01;    //设置定时器0为工作方式1
        TH0 = (65536-50000)/256;  //单片机晶振为12MHz,产生50ms的中断
        TL0 = (65536-50000)%256;
        EA = 1;  //开总中断
        ET0 = 1;  //开定时器0中断
        TR0 = 1;  //启动定时器0
       
        while(1)  //等待中断
        {
                /*南北红灯和东西红灯的运作方式*/
                if(RED==600)
                {
                        RED = 0;
                        B_RED = ~B_RED;
                        N_RED = ~N_RED;
                        D_RED = ~D_RED;
                        X_RED = ~X_RED;
                }
                /*南北绿灯和东西绿灯的运作方式*/
               
        }
}

void T0_time() interrupt 1
{
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
        RED++;YLW++;GRN++;
}
作者: man1234567    时间: 2021-4-1 00:05
永远稳定差10秒只能是你的技术问题没可能是单片机的问题
作者: ZXWPL    时间: 2021-4-1 14:17
稍微改动一下      
while(1)  //等待中断
        {
                /*南北红灯和东西红灯的运作方式*/
                if(RED>=600)
                {
                        RED =RED-600;
                        B_RED = ~B_RED;
                        N_RED = ~N_RED;
                        D_RED = ~D_RED;
                        X_RED = ~X_RED;
                }
                /*南北绿灯和东西绿灯的运作方式*/
               
        }

或者直接把这段程序贴在中断试试
void T0_time() interrupt 1
{
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
        RED++;YLW++;GRN++;

                /*南北红灯和东西红灯的运作方式*/
                if(RED==600)
                {
                        RED = 0;
                        B_RED = ~B_RED;
                        N_RED = ~N_RED;
                        D_RED = ~D_RED;
                        X_RED = ~X_RED;
                }
                /*南北绿灯和东西绿灯的运作方式*/
}

作者: cn_zhx    时间: 2021-4-1 15:10
进出中断需要时间,中断处理函数执行也需要时间,尤其是用C语言编写的程序,效率就比汇编低。
作者: cn_zhx    时间: 2021-4-1 15:12
在中断里进行初值赋值时,不要用        
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
这样的运算,直接赋立即数,你试试看,可能时间精度会好很多。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1