单片机脉冲输出C程序疑问

来源:百度知道 编辑:UC知道 时间:2024/05/14 01:10:27
有这么一段程序,单片机C方面的,帮忙给解释一下。题目:晶振为10M,P1.0脚上输出周期为2.5s且占空比为百分之20的脉冲。取10ms为标准定时时长,显然一个周期要中断250次,高电平要50次。显然10ms技术次数为10*103*10/12=8333程序如下:
#include <reg51.h>
#define uchar unsigned char
uchar period 250;uchar high 50;
void timer0( ) interupt1 using1
{th0=-8333/256;
tl0=-8333%256;
if(++time==high)P1.0=0;
else if(time==period)
{time=0; P1.0=1
}
}
main( ){tmod=0x01;
th0=-8333/256;
tl0=-8333%256;
ea=1;
et=1;
tr0=1;
do{}while(1);
}
问题1:赋初值语句怎么用除法和求余来表达?(主要是理论上想不通,而对应的汇编赋初值的方法能理解)
问题2:中断程序中第一个条件表达式的条件我理解是time自增到50后P输出低电平,但是在写法上似乎不是很理解,麻烦给解释一下。
问题3:单单从完成这个题目而言,单片机只做了个脉冲输出,现在问题是单片机一开始工作时P口先输高电平还是低电平呢?看过程好像是想先输出500ms搞电平,但我觉得应该在主程序中最后应该有P1.0=1(可能是受汇编编程的影响吧)
问题4、上面的time好像也没有定义怎么就用了呢?! 最好能够结合C的语法特点来解释一下。

1、2的8次方就是256,也就是1个字节进位值。因此求余相当于求出低字节值
(未进位),商当然就放在高字节里了。
另外,处理器中乘2相当于左移一位,除以2相当于右移一位,自己体会~
2、if(++time==high)P1.0=0;
else if(time==period)
{time=0; P1.0=1}
这里表达的意思是,TIME计数从0到了定义的HIGH值后,将P1.0附0,当计数周期到,将P1.0附1,且计数值清零。这里需要注意,程序用到了编译器的两个默认状态,即初始IO是高电平,申请的变量未附值,初值是0,但这样做说实话不规范也不可靠,最好附上初始值。而且语句写的也不好,我认为应该改成
if(++time==high)P1.0=!P1.0;
else if(time==period)
{time=0; P1.0=!P1.0},直接取反操作,更容易理解
3、主程序里就是循环等待中断~你说的置高电平操作,中断最后周期最后时刻已经进行了。
4、未声明的变量直接使用,恐怕标准C是不可以的.但是如果是在KEIL C51里编译能通过的话,应该是编译器的高级优化功能在作怪.