MCS-51单片机 晶振频率12MHz,求在P1.0上输出周期为200ms、占空比为1:1的方波,输出500个方波后停止输出

请大神务必写全代码,原题如下:
已知MCS-51单片机应用系统的晶振频率为12MHz,现要求在P1.0上输出周期为200ms、占空比为1:1的方波,输出500个方波后停止输出,请编程实现。
要求:使用T0,并工作在方式1、中断方式下,在中断服务程序中实现对P1.0输出方波进行控制。
【提示:方波周期200ms,只需要每隔半周期100ms将P1.0取反即可。12MHz晶振下T0定时时间最大只有65.536ms,因此将T0的定时时间设为50ms,中断2次即为100ms。】
上方为题目自带的提示

第1个回答  2018-05-31
私信
交流
第2个回答  2018-06-01
超简单:
#include<REG51.H>
#define uint unsigned int
uint a=2000;
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
while(a>0);//等待500个脉冲结束
TR0=0;
while(1);//停止
}
//中断程序:
void timer0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a--;
if(a%2==0) P10=!P10;
}追问

有几个地方还是不太清楚:
uint a=2000; 这里为啥是两千?跟题目里的哪个参数有关系
timer0()interrupt 1 没看到在main函数里调用啊
拜托大神能给点注释啥的,以供我研究研究 感谢!

追答

中断一次50ms,中断两次是100ms,100ms取反一次,周期就是200ms,一个周期共中断4 次
那么500个方波中断次数便是2000
ET0=1;//开定时器中断
EA=1;//开总中断
中断程序不被主程序调 用,中断条件具备时,自动跳转到它的入口地址去执行
执行完返回主程序(用汇编语言编程时有一条中断返回指令RETI)
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
以上两句是装定时器的初值,51单片机是16位加法计数,到65536溢出产生中断
因此定时器初值是 65536-计时脉冲个数 晶振12M时,一个脉冲1US
50ms便是50000个脉冲
因此初值是 (65536-50000)
该16位定时器又分高8 位和低8 位
其中高8位的1代表256,因此高8 位里装的都是256的倍数
低8 位不足256,因此是256的余数

本回答被提问者采纳