找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10619|回复: 3
收起左侧

频率可调的方波发生器(protues仿真+单片机源码)

[复制链接]
ID:362757 发表于 2018-7-1 22:54 | 显示全部楼层 |阅读模式
方波发生器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:


  1. #include<reg51.h>

  2. #define uchar unsigned char

  3. #define uint unsigned int

  4. float fosc=12000000; //系统时钟频率

  5. sbit KEY1=P1^0; //控制频率百位;

  6. sbit KEY2=P1^1; //控制频率十位;

  7. sbit KEY3=P1^2; //控制占空比十位;

  8. sbit KEY4=P1^3; //控制占空比个位;

  9. sbit OUTPUT=P2^0; //方波输出端口;

  10. uchar zkb;

  11. uint freq;

  12. uchar TIMER0_L,TIMER0_H,TIMER1_L,TIMER1_H; //定

  13. /****************************

  14. 延时子程序

  15. ****************************/

  16. void delay(uchar n) //延时

  17. {

  18. uchar i;

  19. while(n--)

  20. {for(i=255;i>0;i--)

  21. {}

  22. }}

  23. /*******************

  24. 系统初始化

  25. *******************/

  26. void chushihua(void)

  27. {

  28. P1=0x0f;

  29. freq=50;

  30. zkb=50;

  31. TIMER0_L=0xe0;

  32. TIMER0_H=0xb1;

  33. TIMER1_L=0xf0;

  34. TIMER1_H=0xd8;

  35. TL0=0xe0; //初始频率 50Hz 定时 20ms

  36. TH0=0xb1;

  37. TL1=0xf0; //初始占空比 50%定时 10ms

  38. TH1=0xd8;

  39. TMOD=0x11; //定时器 1 和定时器 0 工作在方式 1

  40. IT0=1; //选择 INT0 为下降沿触发方式

  41. EX0=1; //外部中断 0 允许

  42. ET0=1; //定时器 1 和定时器 0 中断允许

  43. ET1=1;

  44. EA=1; //系统中断允许

  45. TR0=1; //定时器 1 和定时器 0 开始定时

  46. TR1=1;

  47. }

  48. /*********************

  49. 主函数
  50. *********************/

  51. void main(void)

  52. {

  53. chushihua(); //系统初始化

  54. while(1)

  55. { }

  56. }

  57. /************************

  58. 定时器中断子程序

  59. ************************/

  60. void Timer0_freq() interrupt 1 //频率定时器 0 中断

  61. {

  62. TR1=1; //启动定时器 1,占空比定时

  63. TL0=TIMER0_L;

  64. TH0=TIMER0_H;

  65. OUTPUT=1; //输出高电平

  66. }

  67. void Timer1_zkb() interrupt 3 //占空比定时器 1 中断

  68. {

  69. TR1=0; //定时器 1 停止

  70. TL1=TIMER1_L;

  71. TH1=TIMER1_H;

  72. OUTPUT=0; //输出低电平

  73. }

  74. /***********************

  75. 键盘扫描子程序
  76. ***********************/

  77. void keyscan() interrupt 0 using 1 //外部中断 0

  78. {float TF0,TZ1;

  79. EX0=0; //关中断

  80. delay(10); //延时消抖

  81. if(P1!=0x0f) //判断是否有键按下

  82. {

  83. if(KEY1==0) freq+=100; //按键为 1 号,频率加 100

  84. if(KEY2==0) freq-=100; //按键为 2 号,频率减 100

  85. if(freq>5000) freq=50; //频率大于 5000Hz,重新赋值为 5



  86. if(KEY3==0) zkb+=10; //按键为 3 号,占空比加 10

  87. if(KEY4==0) zkb-=10; //按键为 4 号,占空比减 10

  88. if(zkb>100) zkb=1; //占空比大于 100,重新赋值为

  89. TF0=(65536-fosc/(12.0*freq));//频率定时初值

  90. TZ1=(65536-(fosc*zkb)/(12.0*100*freq)); //占空比定时

  91. TIMER0_H=(uint)TF0/256;

  92. TIMER0_L=(uint)TF0%256;

  93. TIMER1_H=(uint)TZ1/256;

  94. TIMER1_L=(uint)TZ1%256;

  95. }

  96. P1=0x0f; //给键盘扫描口赋初值

  97. EX0=1; //开中断

  98. TR0=1; //定时器 1 和定时器 0 开始定时

  99. TR1=1;}
复制代码

所有资料51hei提供下载:
频率可调方波发生器(protues仿真).zip (52.7 KB, 下载次数: 130)
回复

使用道具 举报

ID:1023527 发表于 2022-5-18 15:54 | 显示全部楼层
我这有三个问题能佛麻否烦你回答一下1.怎么样转化为ADPWM波?
回复

使用道具 举报

ID:1023527 发表于 2022-5-18 15:56 | 显示全部楼层
2.4个按键如何共用一个中断。3.请用程序解释一下用的是延时还是定时。
回复

使用道具 举报

ID:540173 发表于 2022-5-20 17:34 | 显示全部楼层
能否实现编码控制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表