|
谢谢大家支持,因为是小白自学,只能从最简单的慢慢学,让大家见笑了,
今天在昨天基础上增加了按键,用于改变占空比,到达上限时报一下警,
以下是硬件部分,电路和脚位
以下是实测波形,
以下是代码,和我的一些理解,有不对的地方请指教,谢谢
//程序功能:P1.0口输出PWM信号
//增加按键加减占空比,key3增加key4减少
//当增加到95时声音报警,当减少到5时报警,
#include <reg52.h> //头文件
typedef unsigned char uchar; //类型定义,相当于缩写的意思吧
typedef unsigned int uint; //类型定义
sbit PWM=P1^0; //P1.0口输出PWM信号
uchar time; //定义周期时间
uchar duty=50; //定义占空比,并给初值
sbit key3=P3^6; //定义一个按键加
sbit key4=P3^7; //定义一个按键减
sbit beep=P0^7; //定义报警位
uint xms; //延时时间
void time0init(); //声明子函数定时器初始化
void delay(xms); //声明子函数延时
void key_scan(); //声明子函数按键
void main () //主函数
{
time0init(); //调用初始化子函数
while(1)
{
key_scan(); //调用按键子函数
}
}
void delay (xms) //延时子函数
{
uchar i; //定义一个变量,函数内的变量只对当前函数有效
while(xms--) //给定值自减,
{
for(i=0;i<113;i++); //每一个算是单位是不是113个机器周期?
}
}
void key_scan() //检测按键子函数
{
if(key3==0) //如果key3被按下,
{
delay(5); //抖消
if(key3==0) //再次确认
{
duty+=5; //占空比加5
if(duty>=95) //最大到95
{
duty=95;
beep=!beep; //报警响
}
while(key3==0); //按键释放
}
}
if(key4==0) // key4原理一样
{
delay(5); //
if(key4==0)
{
duty-=5; //
if(duty<=5) //
{
duty=5;
beep=!beep; //
}
while(key4==0);
}
}
}
void time0init() //定时器初始化函数
{
EA=1; //开总中断
ET0=1; //开定时器0
TR0=1; //定时器0开始
TMOD=0X01; // 定时器模式1
TH0=(65536-10)/256; //10ms初值高8位
TL0=(65536-10)%256; //10ms初值低8位
}
void time0 ()interrupt 1 //定时器中断函数
{
TR0=0; //
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1; //
time++; //
if(time>=100) //如果定时满了100次
time=0; //定时清零
if(time<=duty) //如果小于10,相当于只有10%时间是高电平,
PWM=1; //输出高电平
else
PWM=0; //其它时间输出低电平
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|