新人报道 发个PWM风扇程序 OLED显示占空比 高手勿喷
单片机源程序如下:
- #include<reg51.h>
- #include "oled.h"
- #include "bmp.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit MOTOR_A_1=P2^2;
- sbit MOTOR_A_2=P2^3;
- sbit k1=P1^0; //速度+
- sbit k2=P1^1; //速度-
- sbit k3=P1^2; //停止
- uchar T=0; //定时标记
- uchar W=0; //脉宽值0~32
- uchar k=0; //按键标记
- uchar i=0; //计数变量
- uchar a,b;
- /*******************延时***************************/
- void delayMs(uint a)
- {
- uint i, j;
- for(i = a; i > 0; i--)
- for(j = 100; j > 0; j--);
- }
- /**********************************************************************
- 定时器变量定义
- **********************************************************************/
- void init(void)
- {
- //启动中断
- TMOD=0x01;
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256; //0.5ms中断一次
-
- EA=1;
- ET0=1;
- TR0=1;
- }
- void timer0() interrupt 1
- {
- //重置定时器时间
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- T++; //定时标记加1
- if(T==16)
- {
- T=0;
- }
-
- if(T>=W)
- MOTOR_A_1 =0;
- else
- MOTOR_A_1 =1;
- }
- /**********************************************************************
- 独立按键检测
- **********************************************************************/
- void key(void) //按键判断程序
- {
- if(k1==0) //按键1按下
- {
- while(k1==0); //按键1抬起
- if(W==16) //如果脉宽为100
- W=0; //脉宽置0
- else
- W+=1; //否则加1
- }
- else if(k2==0) //按键2按下
- {
- while(k2==0); //按键2抬起
- if(W==0) //如果脉宽为0
- W=16; //脉宽设置成100
- else
- W-=1; //否则减1
- }
- else if(k3==0) //按键3按下
- {
- while(k3==0); //按键3抬起
- W=0; //脉宽清0
- }
- }
- void display1()
- {
- if(a == 0 && b == 0)
- {
- OLED_ShowString(0,2," ",16);
- OLED_ShowString(96,2," ",16);
- OLED_ShowString(0,4," ",16);
- OLED_ShowString(96,4," ",16);
- }
- else
- {
- OLED_ShowChar(0,2,' '+95,16); //指针旋转
- OLED_ShowChar(8,2,' '+0,16);
- OLED_ShowChar(8,4,' '+0,16);
- OLED_ShowChar(0,4,' '+0,16);
- OLED_ShowChar(96,2,' '+95,16);
- OLED_ShowChar(104,2,' '+0,16);
- OLED_ShowChar(104,4,' '+0,16);
- OLED_ShowChar(96,4,' '+0,16);
- delayMs(100);
- OLED_ShowChar(0,2,' '+0,16);
- OLED_ShowChar(8,2,' '+15,16);
- OLED_ShowChar(8,4,' '+0,16);
- OLED_ShowChar(0,4,' '+0,16);
- OLED_ShowChar(96,2,' '+0,16);
- OLED_ShowChar(104,2,' '+15,16);
- OLED_ShowChar(104,4,' '+0,16);
- OLED_ShowChar(96,4,' '+0,16);
- delayMs(100);
- OLED_ShowChar(0,2,' '+0,16);
- OLED_ShowChar(8,2,' '+0,16);
- OLED_ShowChar(8,4,' '+95,16);
- OLED_ShowChar(0,4,' '+0,16);
- OLED_ShowChar(96,2,' '+0,16);
- OLED_ShowChar(104,2,' '+0,16);
- OLED_ShowChar(104,4,' '+95,16);
- OLED_ShowChar(96,4,' '+0,16);
- delayMs(100);
- OLED_ShowChar(0,2,' '+0,16);
- OLED_ShowChar(8,2,' '+0,16);
- OLED_ShowChar(8,4,' '+0,16);
- OLED_ShowChar(0,4,' '+15,16);
- OLED_ShowChar(96,2,' '+0,16);
- OLED_ShowChar(104,2,' '+0,16);
- OLED_ShowChar(104,4,' '+0,16);
- OLED_ShowChar(96,4,' '+15,16);
-
- // OLED_ShowString(0,2,"> ",16); //>符号跳动
- // OLED_ShowString(0,4,"> ",16);
- // OLED_ShowString(96,2," <",16);
- // OLED_ShowString(96,4," <",16);
- // delayMs(100);
- // OLED_ShowString(0,2," >",16);
- // OLED_ShowString(0,4," >",16);
- // OLED_ShowString(96,2,"< ",16);
- // OLED_ShowString(96,4,"< ",16);
- // delayMs(100);
- }
- }
- void display2()
- {
- if(W == 0)
- {
- OLED_ShowString(0,6," ",16);
- }
- else if(W == 1)
- {
- OLED_ShowString(0,6,"> ",16);
- }
- else if(W == 2)
- {
- OLED_ShowString(0,6,">> ",16);
- }
- else if(W == 3)
- {
- OLED_ShowString(0,6,">>> ",16);
- }
- else if(W == 4)
- {
- OLED_ShowString(0,6,">>>> ",16);
- }
- else if(W == 5)
- {
- OLED_ShowString(0,6,">>>>> ",16);
- }
- else if(W == 6)
- {
- OLED_ShowString(0,6,">>>>>> ",16);
- }
- else if(W == 7)
- {
- OLED_ShowString(0,6,">>>>>>> ",16);
- }
- else if(W == 8)
- {
- OLED_ShowString(0,6,">>>>>>>> ",16);
- }
- else if(W == 9)
- {
- OLED_ShowString(0,6,">>>>>>>>> ",16);
- }
- else if(W == 10)
- {
- OLED_ShowString(0,6,">>>>>>>>>> ",16);
- }
- else if(W == 11)
- {
- OLED_ShowString(0,6,">>>>>>>>>>> ",16);
- }
- else if(W == 12)
- {
- OLED_ShowString(0,6,">>>>>>>>>>>> ",16);
- }
- else if(W == 13)
- {
- OLED_ShowString(0,6,">>>>>>>>>>>>> ",16);
- }
- else if(W == 14)
- {
- OLED_ShowString(0,6,">>>>>>>>>>>>>> ",16);
- }
- else if(W == 15)
- {
- OLED_ShowString(0,6,">>>>>>>>>>>>>>> ",16);
- }
- else if(W == 16)
- {
- OLED_ShowString(0,6,">>>>>>>>>>>>>>>>",16);
- }
- }
- void main()
- {
-
- OLED_Init();
- OLED_Display_Off();
- OLED_Clear();
- OLED_Display_On();
- OLED_ShowCHinese(0,0,12);
- OLED_ShowCHinese(16,0,5);
- OLED_ShowCHinese(32,0,6);
- OLED_ShowCHinese(48,0,7);
- OLED_ShowCHinese(64,0,8);
- OLED_ShowCHinese(80,0,9);
- OLED_ShowCHinese(96,0,10);
- OLED_ShowCHinese(112,0,11);
- OLED_DrawBMP(4,2,124,8,BMP1);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
L298N调速OLED显示占空比.zip
(61.84 KB, 下载次数: 31)
|