|
在昨天的基础上增加了数码管显示占空比,
代码如下:
- //程序功能:P1.0口输出PWM信号
- //增加按键加减占空比,key3增加key4减少
- //当增加到95时声音报警,当减少到5时报警,
- #include <reg52.h> //头文件
- typedef unsigned char u8; //类型定义,相当于缩写的意思吧
- typedef unsigned int u16; //类型定义
- u8 time; //定义周期时间
- u8 duty=50; //定义占空比,并给初值
- u16 xms; //延时时间
- sbit PWM=P1^4; //P1.40口输出PWM信号
- sbit key3=P3^6; //定义一个按键加
- sbit key4=P3^7; //定义一个按键减
- sbit beep=P0^7; //定义报警位
- sbit led_a=P1^0;
- sbit led_b=P1^1;
- u8 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- void time0init(); //声明子函数定时器初始化
- void delay(xms); //声明子函数延时
- void key_scan(); //声明子函数按键
- void display(duty); //声明子函数显示
- void main () //主函数
- {
- time0init(); //调用初始化子函数
- while(1)
- {
- key_scan(); //调用按键子函数
- display(duty); //调用子函数
- }
- }
- void display(duty)
- {
- P0=table[duty%10]; //
- led_a=0; //
- delay(5); //
- led_a=1;
- P0=table[duty/10%10]; //
- led_b=0; //
- delay(5); //
- led_b=1;
- }
- void delay (xms) //延时子函数
- {
- u8 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() //定时器初始化函数
- {
- TMOD=0x01; // 定时器模式1
- TH0=(65536-100)/256; //
- TL0=(65536-100)%256; //
- EA=1; //开总中断
- ET0=1; //开定时器0
- TR0=1; //定时器0开始
- }
- void time0 ()interrupt 1 //定时器中断函数
- {
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- time++; //
- if(time>=100) //如果定时满了100次
- time=0; //定时清零
- if(time<=duty) //如果小于10,相当于只有10%时间是高电平,
- PWM=1; //输出高电平
- else
- PWM=0; //其它时间输出低电平
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|