51单片机生成C语言矩形波,基于51单片机产生占空比和频率可调的方波信号发生器(附全部代码)...
时间: 2024-02-25 07:57:50 浏览: 69
基于C51单片机的方波产生
5星 · 资源好评率100%
好的,以下是基于51单片机的矩形波产生器代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 表示 0~7 的数码管码表
void delay(uint xms); // 延时函数
void display(uint num); // 数码管显示函数
void main()
{
uchar i;
uint freq, duty; // 频率和占空比
TMOD=0x10; // 定时器1工作在方式1
TH1=0xf8; // 定时器1的初值设为f8(定时1ms)
TL1=0x30;
TR1=1; // 启动定时器1
while(1)
{
for(freq=50; freq<=1000; freq+=50) // 频率从 50~1000 Hz
{
for(duty=10; duty<=90; duty+=10) // 占空比从 10%~90%
{
while(1)
{
if(TF1==1) // 定时器1中断时间到达
{
TF1=0;
TH1=0xf8;
TL1=0x30; // 定时器1重置
i++;
if(i>=100) // 1s
{
i=0;
break;
}
}
if(i<(duty/10)) // 高电平时间
{
P1=0xff;
}
else // 低电平时间
{
P1=0x00;
}
}
display(freq); // 显示频率
delay(1000); // 延时 1s
}
}
}
}
void delay(uint xms) // 延时函数
{
uint i, j;
for(i=xms; i>0; i--)
{
for(j=110; j>0; j--); // 经过测试,110 个空循环大约需要 1ms
}
}
void display(uint num) // 数码管显示函数
{
uchar thousand, hundred, decade, unit, i;
thousand=num/1000; // 千位
hundred=(num%1000)/100; // 百位
decade=(num%100)/10; // 十位
unit=num%10; // 个位
for(i=0; i<8; i++) // 逐个显示
{
switch(i)
{
case(0):P0=table[thousand];break; // 第一位显示千位
case(1):P0=table[hundred];break; // 第二位显示百位
case(2):P0=table[decade]|0x80;break; // 第三位显示十位,并且点亮小数点
case(3):P0=table[unit];break; // 第四位显示个位
case(4):P0=0x00;break; // 第五位不显示
case(5):P0=0x00;break; // 第六位不显示
case(6):P0=0x00;break; // 第七位不显示
case(7):P0=0x00;break; // 第八位不显示
}
delay(1); // 延时 1ms
P0=0x00; // 消隐
}
}
```
需要注意的是,这个代码中使用了定时器1和数码管显示,因此需要对应的硬件支持。如果没有数码管,可以注释掉`display()`函数的调用。如果没有定时器1,可以使用软件延时代替,但需要对代码进行修改。
阅读全文