1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 51单片机生成C语言矩形波 基于51单片机产生占空比和频率可调的方波信号发生器(附全

51单片机生成C语言矩形波 基于51单片机产生占空比和频率可调的方波信号发生器(附全

时间:2024-01-01 19:11:57

相关推荐

51单片机生成C语言矩形波 基于51单片机产生占空比和频率可调的方波信号发生器(附全

本帖最后由 suqianfu 于 -4-11 22:29 编辑

大佬,我添加了一点注释,不知道理解得对不对

#include //调用头文件

#define uchar unsigned char//

#define uint unsigned int

float fosc=12000000;//声明单片机运行频率表12Mhz

sbit KEY1=P1^0; //声明按键1占用脚

sbit KEY2=P1^1; //声明按键2占用脚

sbit KEY3=P1^2; //声明按键3占用脚

sbit KEY4=P1^3; //声明按键4占用脚

sbit OUTPUT=P2^0; //声明输出占用脚

uchar zkb; //声明占空比变量

uint freq; //声明频率变量

uchar TIMER0_L,TIMER0_H,TIMER1_L,TIMER1_H;//声明时间变量

void delay(uchar n) //延时函数

{

uchar i; //局部整型变量

while(n--) //循环(执行次数)

{for(i=255;i>0;i--) //赋值I为255,I大于0,I--自减1.直至循环执行次数清零(无中生友系列)

{}

}}

void chushihua(void) //名为(初始化)之子函数

{

P1=0x0f;//赋值P1口数据

freq=500;//赋值频率=500

zkb=50; //赋值占空比为50%

TIMER0_L=0xe0; //定时变量,定时器0初始时间高8位赋值,具体定时时间自己查资料

TIMER0_H=0xb1; //定时变量,定时器0初始时间低8位赋值,具体定时时间自己查资料

TIMER1_L=0xf0; //定时变量,定时器1初始时间高8位赋值,具体定时时间自己查资料

TIMER1_H=0xd8; //定时变量,定时器1初始时间低8位赋值,具体定时时间自己查资料

TL0=0xe0;//定时器0初始时间高8位赋值,具体定时时间自己查资料

TH0=0xb1;//定时器0初始时间低8位赋值,具体定时时间自己查资料

TL1=0xf0;//定时器0初始时间高8位赋值,具体定时时间自己查资料

TH1=0xd8;//定时器0初始时间高8位赋值,具体定时时间自己查资料

TMOD=0x11;//设定定时器工作模式

IT0=1;//设定外部中断模式

EX0=1;//启动外部中断

ET0=1;//启动定时器0中断

ET1=1;//启动定时器1中断

EA=1;//启动全局中断使能

TR0=1;//启动定时器0

TR1=1;//启动定时器1

}

void main(void) //主程序

{

chushihua(); //调用初始化子程序

while(1)//循环

{ }

}

void Timer0_freq() interrupt 1 //中断子程序--频率

{

TR1=1; //启动定时器1

TL0=TIMER0_L;//定时器0高8位重新赋值定时函数,具体定时时间自己查资料

TH0=TIMER0_H;//定时器0低8位重新赋值定时函数,具体定时时间自己查资料

OUTPUT=1; //输出高电平

}

void Timer1_zkb() interrupt 3 //中断子程序--占空比

{

TR1=0; //关闭定时器1

TL1=TIMER1_L;//定时器1高8位重新赋值定时函数,具体定时时间自己查资料

TH1=TIMER1_H;//定时器1低8位重新赋值定时函数,具体定时时间自己查资料

OUTPUT=0; //输出低电平

}

void keyscan() interrupt 0 using 1 //中断子程序--按键检测

{

float TF0,TZ1;//声明浮点变量....这句话不是看得太懂...理解错了勿怪

EX0=0; //关闭外部中断

delay(10); //延时10

if(P1!=0x0f)//演示后如果检测到P1口不等于0X0F这个值,判断按键按下

{

if(KEY1==0) freq+=500; //如果是按键1按下,则频率变量增加500

if(KEY2==0) freq+=50; //如果是按键2按下,则频率变量增加50

if(freq>10000) freq=500; //如果频率变量超过10000,则频率变量重新置为500

if(KEY3==0) zkb+=10; //如果是按键3按下,则占空比变量增加10

if(KEY4==0) zkb++;//如果是按键4按下,则占空比变量增加1

if(zkb>100) zkb=1;//如果占空比超过100,则占空比变量重新置为1

TF0=(65536-fosc/(12.0*freq)); //定时器溢出标记TF0赋值为65536减去时钟频率12分频 ??不是太理解

TZ1=(65536-(fosc*zkb)/(12.0*100*freq)); //TZ1这个啥玩意?跟上一行大概意思吧

TIMER0_H=(uint)TF0/256;

TIMER0_L=(uint)TF0%256;

TIMER1_H=(uint)TZ1/256;

TIMER1_L=(uint)TZ1%256;

}

P1=0x0f; //重新赋值P1口初始化

EX0=1; //启动外部中断

TR0=1; //重新启动定时器0TR0

TR1=1; //重新启动定时器1TR1

}

51单片机生成C语言矩形波 基于51单片机产生占空比和频率可调的方波信号发生器(附全部代码)...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。