#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 6000000L //System frequency
#define BAUD 9600 //UART baudrate
BYTE RXDATA;
BYTE COUNT=0;
BYTE OC[8]={128,128,128,128,128,128,128,128};
sbit PWM1 = P3^7;
sbit PWM2 = P1^0;
sbit PWM3 = P1^1;
sbit PWM4 = P1^2;
sbit PWM5 = P1^5;
sbit PWM6 = P1^6;
sbit PWM7 = P1^7;
BYTE RX_BUFFER[8]={0};
void SendData(BYTE dat);
void SendString(char *s);
bit busy;
void delay()
{
unsigned int i=0;
for(i=0;i<65535;i++)
i=i;
}
void main()
{
/* SCON = 0x50; //8-bit variable UART
TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
TR1 = 1; //Timer1 start run
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
*/
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
//TH1=(unsigned char)(256 - (FOSC / (32L * 12L * BAUD)));
//TL1=(unsigned char)(256 - (FOSC / (32L * 12L * BAUD))); // 定时器0赋初值
//TH1=253;
// TL1=253;
TH1=0XE6;
TL1=0XE6;
SCON = 0x50;
PCON = 0x80;
TR1 = 1;
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
delay();
SendString("ARE YOU OK?");
//SendData('A') ;
while(1)
{
COUNT++;
if(COUNT==255) COUNT=0;
if(OC[0]>COUNT) PWM1=1;else PWM1=0;
if(OC[1]>COUNT) PWM2=1;else PWM2=0;
if(OC[2]>COUNT) PWM3=1;else PWM3=0;
if(OC[3]>COUNT) PWM4=1;else PWM4=0;
if(OC[4]>COUNT) PWM5=1;else PWM5=0;
if(OC[5]>COUNT) PWM6=1;else PWM6=0;
if(OC[6]>COUNT) PWM7=1;else PWM7=0;
if(busy==0)
{
busy=1;
SendData(OC[RX_BUFFER[4]-'0']/100+'0');
SendData(OC[RX_BUFFER[4]-'0']%100/10+'0');
SendData(OC[RX_BUFFER[4]-'0']%10+'0');
}
}
}
/*----------------------------
UART interrupt service routine
----------------------------*/
BYTE TMP1=0;
bit txbusy=0;
void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI = 0; //Clear receive interrupt flag
RXDATA = SBUF; //P0 show UART data
for(TMP1=7;TMP1>0;TMP1--)
RX_BUFFER[TMP1]=RX_BUFFER[TMP1-1];
RX_BUFFER[TMP1]=RXDATA;
if(RX_BUFFER[7]=='P'&&RX_BUFFER[6]=='W'&&RX_BUFFER[5]=='M'&&RX_BUFFER[3]=='=')
{ OC[RX_BUFFER[4]-'0']=(RX_BUFFER[2]-'0')*100+(RX_BUFFER[1]-'0')*10+(RX_BUFFER[0]-'0'); busy=0;}
else
busy=1;
// SendData(RXDATA);
// bit9 = RB8; //P2.2 show parity bit
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
txbusy=0;
}
}
/*----------------------------
Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(BYTE dat)
{
txbusy=1;
SBUF=dat;
while(txbusy);
}
/*----------------------------
Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s)
{
while (*s) //Check the end of the string
{
SendData(*s++); //Send current char and increment string ptr
}
}