标题:
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