#include <reg51.h>
//#include<LCD.h>
sbit PWMOUT = P1^0;
//sbit LED1 = P2^3;
//sbit LED2 = P2^2;
//sbit LED3 = P2^1;
//sbit LED4 = P2^0;
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
#define Duan P2
#define Wei P1
unsigned char HighRH = 0; //高電平多載值的高位元組
unsigned char HighRL = 0; //高電平多載值的低位元組
unsigned char LowRH = 0; //低電平多載值的高位元組
unsigned char LowRL = 0; //低電平多載值的低位元組
sbit mr = P3^0;
unsigned char code smg_duan[] ={"0123456789"};
unsigned char code smg_wei[] ={"0123456789"};
unsigned char code time[]={"00:00:00"};
unsigned char code title[]={"20165443"};
unsigned int Num;
long int pin;
long int count;
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void delay();
void display();
extern void WriteInstruction (unsigned char dictate);
extern void LcdInitiate();
extern void DisplayWord();
extern void DisplayChar(char x,y, dat);
extern void WriteAddress2(unsigned char x,y);
void main()
{
unsigned int i;
bit backup1 = 1;
bit backup2 = 1;
bit keybuf1 = 1; //按鍵值暫存,臨時保存按鍵的掃描值
bit keybuf2 = 1; //按鍵值暫存,臨時保存按鍵的掃描值
unsigned int a=100;
EA=1;
LcdInitiate();
while (1)
{
keybuf1 = KEY1; //把當前掃描值暫存
if (keybuf1 != backup1) //當前值與前次值不相等說明此時按鍵有動作
{
delay(); //延時大約10ms
if (keybuf1 == KEY1) //判斷掃描值有沒有發生改變,即按鍵抖動
{
if (backup1 == 0) //如果前次值為0,則說明當前是彈起動作
{
a = a-10;
}
backup1 = keybuf1; //更新備份為當前值,以備進行下次比較
}
}
keybuf2 = KEY2; //把當前掃描值暫存
if (keybuf2 != backup2) //當前值與前次值不相等說明此時按鍵有動作
{
delay(); //延時大約10ms
if (keybuf2 == KEY2) //判斷掃描值有沒有發生改變,即按鍵抖動
{
if (backup2 == 0) //如果前次值為0,則說明當前是彈起動作
{
a = a+10;
}
backup2 = keybuf2; //更新備份為當前值,以備進行下次比較
}
}
ConfigPWM(a, 50);
for (i=0; i<40000; i++);
ClosePWM();
if ((a <= 50)||(a >= 150))
{
//LED1 = 0;
//LED2 = 0;
//LED3 = 0;
//LED4 = 0;
}
else
{
//LED1 = 1;
//LED2 = 1;
//LED3 = 1;
//LED4 = 1;
}
}
}
/* 配置并啟動PWM,fr-頻率,dc-占空比 */
void ConfigPWM(unsigned int fr, unsigned char dc)
{
unsigned int high, low;
unsigned long tmp;
tmp = ((11059200/12) / fr) ; //計算一個周期所需的計數值
high = (tmp*dc) / 100; //計算高電平所需的計數值
low = tmp - high; //計算低電平所需的計數值
high = 65536 - high + 12; //計算高電平的多載值并補償中斷延時
low = 65536 - low + 12; //計算低電平的多載值并補償中斷延時
HighRH = (unsigned char)(high>>8); //高電平多載值拆分為高低位元組
HighRL = (unsigned char)high;
LowRH = (unsigned char)(low>>8); //低電平多載值拆分為高低位元組
LowRL = (unsigned char)low;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0為模式1
TH0 = HighRH; //加載T0多載值
TL0 = HighRL;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
PWMOUT = 1; //輸出高電平}
/* 關閉PWM */
}
void ClosePWM()
{ TR0 = 0; //停止定時器
ET0 = 0; //禁止中斷
PWMOUT = 1; //輸出高電平}
}
/* T0中斷服務函式,產生PWM輸出 */
void InterruptTimer0() interrupt 1
{
if (PWMOUT == 1) //當前輸出為高電平時,裝載低電平值并輸出低電平
{
TH0 = LowRH;
TL0 = LowRL;
PWMOUT = 0;
}
else //當前輸出為低電平時,裝載高電平值并輸出高電平
{
TH0 = HighRH;
TL0 = HighRL;
PWMOUT = 1;
}
}
/* 軟體延時函式,延時約10ms */
void delay()
{
unsigned int j = 1000;
while (j--);
}
void display(long int num)
{
long num1[8],i;
num1[7] = num/10000000;
num1[6] = (num/1000000)%10;
num1[5] = (num/100000)%10;
num1[4] = (num/10000)%10;
num1[3] = (num/1000)%10;
num1[2] = (num/100)%10;
num1[1] = (num/10)%10;
num1[0] = num%10;
for(i=0;i<8;i++){
Wei = smg_wei[i];
Duan = smg_duan[num1[i]];
delay();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/156647.html
標籤:單片機/工控
