请高手具体解释一下以下51单片机C语言程序:

/*定时器0中断服务子程序,用于实现5ms的延时*/
void timer() interrupt 1 using 2
{
Flag_Delay5ms=0;
TH0=-5000/256;
TL0=-5000%256;
}
/*延时5ms函数,主要利用定时器0实现*/
void Delay5ms(void)
{
TR0=1;
ET0=1;
while(Flag_Delay5ms);
ET0=0;
TR0=0;
Flag_Delay5ms=1;
}

void timer() interrupt 1 using 2//定时器0中断函数,interrupt 1是T0的中断入口
{
Flag_Delay5ms=0;//将 延时5ms 标志位 置为 0,表示5ms结束
TH0=-5000/256;//为T0高8位赋初值,相当于TH0=(65536-5000)/256;可以推出晶振为12MHz
TL0=-5000%256;//为T0低8位赋初值,同上
}
/*延时5ms函数,主要利用定时器0实现*/
void Delay5ms(void)
{
TR0=1;//T0计时开始
ET0=1;//允许T0中断
while(Flag_Delay5ms);//若 延时5ms 标志位 为1,即5ms未结束,则继续等待
ET0=0;//5ms结束,禁止T0中断
TR0=0;//停止T0计时
Flag_Delay5ms=1;//重新将 延时5ms 标志位 置为 1,为下次延时做准备
}
该程序不合理的地方,在等待、及 禁止 T0中断时,停止T0计时前,T0依然在计时,换句话说,下次再启动的初值,已经不是原来设置好的初值了。所以延时误差依然存在。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-19
这个 延时 占用 一个 定时器, 还 不准确
还不如 以下程序:
void Delay5ms(void)
{
unsigned char i,j;
for(i=10;i>0;i--)
{
for(j=250;j>0;j--)
}
}
根据 不同型号的 单片机 调整下 i 、j 的 初始值,如果 是 AT89C51,12M晶振, 这个 值就是对的
i、j 的 值取决于 djnz 这个 指令 的 执行时间, 具体 看 相应 单片机 资料(指令集)里 会有

请高手具体解释一下以下51单片机C语言程序:
void timer() interrupt 1 using 2\/\/定时器0中断函数,interrupt 1是T0的中断入口 { Flag_Delay5ms=0;\/\/将 延时5ms 标志位 置为 0,表示5ms结束 TH0=-5000\/256;\/\/为T0高8位赋初值,相当于TH0=(65536-5000)\/256;可以推出晶振为12MHz TL0=-5000%256;\/\/为T0低8位赋初值,同上 } \/*延时...

谁能帮我解释以着这个51单片机的c语言程序,说的详细些,谢谢!
估摸着是点亮流水灯的代码吧,首先delay();是延时这能明白吧!while(1){ temp=0xfe;P1=temp; \/\/先让P1口值为0xfe,估计是先点亮一个LED灯 delay();for(i=1;i<8;i++){ a=temp<>(8-i); \/\/temp右移8-i位 P1=a|b; \/\/P1赋值,实际上就是让P1=(temp循环左移i位),...

51单片机C语言程序
\/\/下列程序通过了实验测试。\/\/b1输出的周期大约0.9s。\/\/b2输出的周期大约0.6s。\/\/K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,\/\/按第一次触动开关时红灯亮、b1输出,\/\/按第二次绿灯亮、为b2输出,\/\/按第三次都关闭.include <reg51.h> define uint unsigned int define ucha...

求一个51单片机C语言程序编程
要求利用芯片MAX232),双方的晶振频率均为11.0592MHz(波特率为9600kb\/s)要求:甲机按开关K1一次,发送字符“A”给乙机,点亮灯D1与D2;按开关K1两次,发送字符“B”给乙机,点亮灯D3与D4;按开关K1三次,发送字符“C”给乙机,

用五一单片机c语言编程,p1口控制八个发光二极管,实现每隔一秒,两两点亮...
for(j=110;j>0;j--);} void main(){ P0 = 0x00; \/\/P0.0~P0.7分别接八个发光二极管,刚开始全灭 while(1){ delay(1000);P0 = 0xc0;\/\/点亮前两个发光二极管P0.0和P0.1;delay(1000);\/\/延时1秒 P0 = 0x30;\/\/点亮第三个和第四个LED delay(1000);P0 = 0x0c;delay(1000)...

51单片机c语言程序
unsigned char是8位但从0到255,unsignde int 16位从0到65535;楼主程序中的TH0\/TL0是8位uchar型;tmp是16位uint型。tmp=TL0|(TH0<<8);这句在执行时先进行类型转换,把TL0\/TH0暂时转换成16位uint型数据,(高位补0),再给TH0左移8位,和TL0相“或”,得到的是16位uint数据,赋给tmp....

大家帮忙找一些51单片机的基本C语言程序例子,最好带说明,谢啦_百度知 ...
串口通信程序:主机程序:include <AT89X52.H> define NODE_ADDR 3 \/\/目的节点地址 define COUNT 10 \/\/发送缓冲区buffer大小 typedef unsigned char uchar;uchar buffer[COUNT]; \/\/定义buffer int pt; \/\/设置指针 main()\/\/\/发送程序 { \/\/buffer初始化 pt=0;while(pt<COUNT){ buffe...

51单片机C语言程序注释标注(写全)
include <reg51.h> \/\/调用头文件reg51.hvoid main() \/\/主函数{unsigned char \/\/ 无符号字符型tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};\/\/定义一个数组 LED数码管译码用的码表while(1) \/\/主循环{P2=P2|0x07; \/\/ P2口...

求一个51单片机的C语言程序,8个LED4种亮法,自上而下,自下而上,高低4位...
下面的你自己应该可以写了,锻炼下手。void delay(void){ int i=10000; \/\/这个值调整亮灯灭等快慢,越小越快越大越慢 while(i--)return;} \/\/从上到下亮灯 void LED_a(void){ LED_IO1 = 0;delay();LED_IO2 = 0;delay();LED_IO3 = 0;delay();LED_IO4 = 0;delay();LED_IO5 ...

一道51单片机的C语言程序,关于串口通讯的,很简单...
void serial() interrupt 4 \/\/串口中断服务程序,优先级为4 { RI=0; \/\/当接收完成之后RI被置一,发生串口中断,清标志位 a=SBUF; \/\/读取收到的字符,并赋给变量a flag=1; \/\/置接收完成标志flag为一,便于主程序中发送响应 } ...

相似回答