决定计数,还是定时,由寄存器TMOD决定
如果要定时那么C/T=0,为定时器模式。
1.TMOD决定计数还是定时以及 M1,M0工作方式的选择;
2.根据设定时间计算出高八位TH1/0,低八位TL1/0;
3.开启总控 EA=1;
4.开启定时器中断
5.启动定时器
定时器控制I/O口输出一个方波1.假设系统的时钟是12mhz,设计从P1.0引脚实现输出一个周期为2毫秒的方波,即占空比2:1
f6eccc4c4e43439cb89d786bb5f872a2?from=pc.jpg
基本思路是:要在P1.0上产生周期为2MS的方波,定时器颖产生1ms的定时中断,定时时间到则中断服务程序中对P1.0去反。使用定时器T0方式1定时中断。因为 1ms=1000us 在P1.0引脚接示波器。通过Proteus软件中的虚拟数字示波器查看输出波形,判断输出是否正确。如下图
cca923169d30431a8d2084685755c019?from=pc.jpg
计算T0的初值,有65536-1000=X
X=64536 化为16进制数为0xfc18,那么高八位是 0xfc,低八位是0x18。
参考程序如下
注意P一定要大写 ,否则编译出错
  1. #include<reg51.h>// 头文件
  2. #include<intrins.h> //没有用到
  3. #define uchar unsigned char
  4. #define        achar signed char
  5. sbit P1_0=P1^0;//定义P1
  6. void main() //主程序
  7. {
  8. TMOD=0x01;
  9. EA=1;//开启总控
  10. ET0=1;//定时中断允许
  11. TR0=1; //启动定时器
  12. while(1);
  13. {
  14. TH0=0xfc; //装入高八位
  15. TL0=0x18; //装入低八位
  16. do{}while(!TF0);
  17. P1_0=!P1_0;//去反
  18. TF0=0;
  19. }
  20. }
7c3d27d3a7da4f348a75af5a96a40ce1?from=pc.jpg
仿真结果

注意:在仿真时,如果发现没有波形,马上右键单击示波器。点击“Digital oscilloscope”就可以了!!!并且调节周期时间旋钮 3a7d774578fb4a41ab52422d6a33740b?from=pc.jpg
2.做如下设计①要求
已知单片机系统时钟频率为12MHz,请利用T0和P1.0在Proteus中输出矩形脉冲,波形如下:
c1d046abbefd4f45bf4882ae92a107e4?from=pc.jpg
②仿真图
ed2c094e1e5d407e9b03d86d265f3375?from=pc.jpg
③参考源代码
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define        achar signed char
  5. sbit P1_0=P1^0;
  6. uchar i=0,j=3;
  7. void main()
  8. {
  9. TMOD=0x02;
  10. P1_0=0;
  11. TH0=0xce;
  12. TL0=0x206;
  13. ET0=1;
  14. EA=1;
  15. TR0=1;
  16. while(1);
  17. }
  18. void T0_int() interrupt 1
  19. {
  20. if(i==0)
  21. {
  22. j--;
  23. if(j==0)
  24. {
  25. P1_0=!P1_0;
  26. i=!i;
  27. j=3;
  28. }
  29. }
  30. else
  31. {
  32. P1_0=!P1_0;
  33. i=!i;
  34. }
  35. }
④仿真结果
0725d788a7364172a22453dd43071d93?from=pc.jpg
用一个if else 简单解决问题 大家注意练习哦!

来源:ying悦1SD