#include "c8051f340.h"
#define SYSCLK 48000000 // 系统工作频率
#define BAUDRATE 9600 // baud rate
sbit L1=P0^0;
sbit S1=P3^5;
sbit S2=P3^4;
void delay( unsigned n);
void PORT_Init (void);
void Sysclk_Init(void);
void UART0_Init(void);
void sendchar(unsigned char x);
void GetADvalue(void);
void ADC0_Init (void);
unsigned char code ascii[]={"0123456789ABCDEF"};
void T2_Init(void);
void T2_Interrupt(void);
void PCA_Init(void);
int i = 200;
char j = 50;
unsigned int duty_cycle;
void main()
{
PCA0MD =0x00; //看门狗 bf
Sysclk_Init();
PORT_Init();
UART0_Init();
ADC0_Init();
T2_Init();
PCA_Init();
while(1)
{
if(S1==0)
{
delay(50);
if(S1==0)
{
while(S1==0);
j=j+5;
if (j>100)
{
j=100;
}
duty_cycle=655.36*(100-j);
PCA0CPL0 = (duty_cycle & 0x00FF);
PCA0CPH0 = (duty_cycle & 0xFF00)>>8;
}
}
if(S2==0)
{
delay(50);
if(S2==0)
{
while(S2==0);
j=j-5;
if (j<=0)
{
j=0;
PCA0CPM0 &=0xbf;
}
else
{
PCA0CPM0 |=0x40;
duty_cycle=655.36*(100-j);
PCA0CPL0 = (duty_cycle & 0x00FF);
PCA0CPH0 = (duty_cycle & 0xFF00)>>8;
}
}
}
sendchar(ascii[(j)/100]);
sendchar(ascii[(j%100)/10]);
sendchar(ascii[(j%100)%10]);
sendchar(0X0A);
if (i==0)
{
GetADvalue();
i=200;
}
}
}
void PCA_Init(void)
{
PCA0CN = 0x40;
PCA0CPM0 = 0xCB;
duty_cycle=655.36*(100-j);
PCA0CPL0 = (duty_cycle & 0x00FF);
PCA0CPH0 = (duty_cycle & 0xFF00)>>8;
}
void T2_Init(void)
{
IE = 0x00;
TR2 = 0;
PT2 = 1;
PS0=0;
CKCON = 0x00;
TMR2RLH = 0xB1;
TMR2RLL = 0XE0;
TMR2CN = 0x84;
TR2 = 1;
IE = 0xff;
}
void T2_Interrupt(void) interrupt 5
{
--i;
TF2H=0;
}
void UART0_Init(void)
{
EA=0;
RI0 = 0;
TI0 = 0;
TR1=0;
SCON0 |= 0x10;
CKCON = 0x00;
TH1 = 0x30;
TL1 = 0X30;
TMOD = 0x20; //21.1.4
TR1=1;
EA=1;
}
void ADC0_Init (void)
{
ADC0CF = 0x78;
ADC0CN = 0x80;
REF0CN = 0x03;
AMX0P = 0x00;
AMX0N = 0xff; //GND 单端方式
}
void GetADvalue()
{
int ad_value,d_value;
AD0INT=0;
AD0BUSY=1;//启动AD转换
while(!AD0INT);
{
ad_value=ADC0H;
ad_value<<=8;
ad_value+=ADC0L;//AD转换结果
d_value=2.44*ad_value/1024*1000;
sendchar(ascii[(d_value)/1000]);
sendchar(0X2E);
sendchar(ascii[(d_value%1000)/100]);
sendchar(ascii[(d_value%1000)%100/10]);
sendchar(ascii[(d_value%1000)%100%10]);
sendchar(0X0A);
}
}
void PORT_Init(void)
{
P0MDIN |= 0xff;
P0MDOUT |= 0xff;
P0SKIP |= 0xce;
P2MDIN = 0xfe;
P2SKIP = 0xff;
P3MDIN |= 0xff;
P3 |= 0xff;
P3SKIP |= 0xff;
XBR0 = 0x01;
XBR1 = 0x41;
XBR2 = 0x00;
}
void sendchar(unsigned char x)
{
SBUF0 = x;
while(!TI0);
TI0 = 0;
}
void Sysclk_Init(void)
{
OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency and enable
// missing clock detector
CLKMUL = 0x00; // Select internal oscillator as
// input to clock multiplier
CLKMUL |= 0x80; // Enable clock multiplier
delay(50); // Delay for clock multiplier to begin
CLKMUL |= 0xC0; // Initialize the clock multiplier
delay(50); // Delay for clock multiplier to begin
while(!(CLKMUL & 0x20)); // Wait for multiplier to lock
CLKSEL = 0x03; // Set sys clock to clkmul
}
void delay(unsigned n)
{
unsigned i,j;
for(i=0;i<n;i++)
{
for(j=0;j<100;j++);
}
}