本帖最后由 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单片机产生占空比和频率可调的方波信号发生器(附全部代码)...