一个很短的PIC16F877A单片机程序

#include<pic.h>__CONFIG(0x3B31);voidinitial();voidmain(){unsignedcharcount;initial();... #include<pic.h>__CONFIG(0x3B31);
void initial();
void main()
{
unsigned char count;
initial();
while(1)
{
if(T0IF==1) //T0IF为TMR0的溢出中断申请标志位,T0IF=1时申请中断
{
T0IF=0; //T0IF必须软件清零
TMR0=61;
count++;
if(count==20) //count=20时,一共计数时钟脉冲=256*195*20=998400,4分频后的时钟频率为1MHz,即耗时0.9984s≈1s
{
RD0=!RD0; //控制LED灯亮暗变化
count=0;
}
}
}
}

void initial()
{
TRISD=0;
PORTD=0; //设置RD口为输出,且一开始输出低电平
OPTION=0x07; //设置定时器0定时方式,TMR0分频比为1:256
TMR0=61; //设置TMR0初始值为61,即每次计数195次便发出中断信号
}

上面已经对程序注释了,计算过程也注明了,用proteus仿真时结果并不是1秒亮,1秒灭,大概是1.5秒亮,1.5秒灭,望proteus高手指导!
展开
 我来答
尚云社
推荐于2016-10-21 · TA获得超过392个赞
知道小有建树答主
回答量:229
采纳率:0%
帮助的人:282万
展开全部
在使用PIC16F877A单片机时,如果使用定时器0,那么最好不要写TMR0,因为每次的写操作都会导致定时器0的预分频器清零。一般都是定义一个变量,来做定时器0计时值的累计,这样才会将误差降到最小。另外就是仿真的时间不一定准确
更多追问追答
追问
那应该怎么写?我上面的程序其实是从郭天祥的视频里学的,我记得他的单片机的定时是比较正常,就是不知道为什么一到proteus就出问题了。
追答
如果要用定时器0实现比较精确的定时,如你这个程序
#include__CONFIG(0x3B31);
unsigned long Timer0Count;
void initial();
void main()
{
initial();
while(1)
{
if(T0IF==1) //T0IF为TMR0的溢出中断申请标志位,T0IF=1时申请中断
{
T0IF=0; //T0IF必须软件清零
Timer0Count += 65536;
if(Timer0Count > 1000000)
{
Timer0Count -= 1000000; //每次到达1s后,累积的误差均在该变量中
RD0=!RD0; //控制LED灯亮暗变化
}
}
}
}

void initial()
{
TRISD=0;
PORTD=0; //设置RD口为输出,且一开始输出低电平
OPTION=0x07; //设置定时器0定时方式,TMR0分频比为1:256
TMR0=0; //因为TMR0没有禁止/使能位,所以这里要赋初值,每65536us溢出一次(FOSC = 4MHz)
Timer0Count = 0;
}
qky510221
2012-09-12 · TA获得超过341个赞
知道小有建树答主
回答量:484
采纳率:100%
帮助的人:247万
展开全部
这个跟单片机是晶振频率有关,还有就是C语言的目标程序可能会多一些指令所以一般都比汇编要长一些时间!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式