找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1955|回复: 6
打印 上一主题 下一主题
收起左侧

51单片机定时器误差极大,为什么,是我编的有问题?

[复制链接]
跳转到指定楼层
楼主
ID:839571 发表于 2021-3-28 19:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问为什么这个计时器为30s改变一次电位,仿真出来永远差10s左右,为什么会差太多
程序在3楼
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2021-3-28 21:12 | 只看该作者
程序不全,无法分析啊
回复

使用道具 举报

板凳
ID:839571 发表于 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++;
}
回复

使用道具 举报

地板
ID:584814 发表于 2021-4-1 00:05 | 只看该作者
永远稳定差10秒只能是你的技术问题没可能是单片机的问题
回复

使用道具 举报

5#
ID:487569 发表于 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;
                }
                /*南北绿灯和东西绿灯的运作方式*/
}
回复

使用道具 举报

6#
ID:883031 发表于 2021-4-1 15:10 | 只看该作者
进出中断需要时间,中断处理函数执行也需要时间,尤其是用C语言编写的程序,效率就比汇编低。
回复

使用道具 举报

7#
ID:883031 发表于 2021-4-1 15:12 | 只看该作者
在中断里进行初值赋值时,不要用        
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
这样的运算,直接赋立即数,你试试看,可能时间精度会好很多。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表