2024年4月27日发(作者:)

针对STC89C52RC单片机的一些程序

基本串口通信程序:

#include

#define uint unsigned int

#define uchar unsigned char

#define SEND 0

#define RECEIVE 1

uchar flag_Serial = SEND;

uchar Rx_Buf;

sbit SMG = P1^7;

//0 1 2 3 4 5 6 7 8 9 a b c d e f

uchar code Show[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,

0x41,0x1f,0x01,0x19,0x11,

0xc1,0x63,0x85,0x61,0x71};

void Serial_Init();

void Serial_send();

void Display();

void Delay_1ms(uchar z);

/****************************************************/

//main function

//

/****************************************************/

void main()

{

Serial_Init();

while(1)

{

switch(flag_Serial)

{

case SEND:

flag_Serial = RECEIVE;

Serial_send();

break;

case RECEIVE:

Display();

break;

}

}

}

/****************************************************/

//serial initial

//

/****************************************************/

void Serial_Init()

{

TMOD = 0X20; //work in mode 2

PCON = 0X00;

SCON = 0X50;

TH1 = 0XFD; //BRUD 9600

TL1 = 0XFD;

TR1 = 1; //open interrupt 1

ES = 1; //open the serial

EA = 1; //open the key interrupt

flag_Serial = SEND;

SMG = 0;

}

/****************************************************/

//serial interrupt function

//

/****************************************************/

void Serial() interrupt 4 using 2

{

EA = 0;

if(RI!=0&&flag_Serial==RECEIVE)

{

RI = 0;

Rx_Buf = SBUF;

flag_Serial = SEND;

}

EA = 1;

}

/****************************************************/

//mcu send data to serial

//

/****************************************************/

void Serial_send()

{

SBUF = Rx_Buf;

while(TI==0);

TI=0;

}

/****************************************************/

//display the data by SMG

//

/****************************************************/

void Display()

{

P2 = Show[Rx_Buf];

Delay_1ms(3);

}

/****************************************************/

//delay for z*1ms

//

/****************************************************/

void Delay_1ms(uchar z)

{

uchar i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

串口通信,按键加减

#include

#define uint unsigned int

#define uchar unsigned char

#define SEND 0

#define RECEIVE 1

sbit KEY1 = P1^4;

sbit KEY2 = P1^5;

sbit LED1 = P1^0;

sbit LED2 = P1^1;

sbit SMG = P1^7;

uchar flag_Serial = SEND;

uchar Rx_Buf;

uchar Smg_Buf;

//0 1 2 3 4 5 6 7 8 9 a b c d e f

uchar code Show[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,

0x41,0x1f,0x01,0x19,0x11,

0xc1,0x63,0x85,0x61,0x71};

void Serial_Init();

void Serial_send();

void Display();

void Delay_1ms(uchar z);

void Scan();

/****************************************************/

//main function

//

/****************************************************/

void main()

{

Serial_Init();

while(1)

{

switch(flag_Serial)

{

case SEND:

flag_Serial = RECEIVE;

Serial_send();

break;

case RECEIVE:

Display();

break;

}

Scan();

}

}

/****************************************************/

//serial initial

//

/****************************************************/

void Serial_Init()

{

TMOD = 0X20; //work in mode 2

PCON = 0X00;

SCON = 0X50;

TH1 = 0XFD; //BRUD 9600

TL1 = 0XFD;

TR1 = 1; //open interrupt 1

ES = 1; //open the serial

EA = 1; //open the key interrupt

flag_Serial = SEND;

SMG = 0;

}

/****************************************************/

//serial interrupt function

//

/****************************************************/

void Serial() interrupt 4 using 2

{

EA = 0;

if(RI!=0&&flag_Serial==RECEIVE)

{

RI = 0;

Rx_Buf = SBUF;

flag_Serial = SEND;

}

EA = 1;

}

/****************************************************/

//mcu send data to serial

//

/****************************************************/

void Serial_send()

{

SBUF = Rx_Buf;

while(TI==0);

TI=0;

}

/****************************************************/

//display the data by SMG

//

/****************************************************/

void Display()

{

P2 = Show[Rx_Buf];

Delay_1ms(3);

}

/****************************************************/

//delay for z*1ms

//

/****************************************************/

void Delay_1ms(uchar z)

{

uchar i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

/****************************************************/

//scan the keys

//

/****************************************************/

void Scan()

{

if(KEY1==0)

{

Delay_1ms(10);

if(KEY1==0)

{

LED1 = ~LED1;

Rx_Buf++;

if(Rx_Buf==16)Rx_Buf = 0;

Display();

while(KEY1==0);

}

}

if(KEY2==0)

{

Delay_1ms(10);

if(KEY2==0)

{

LED2 = ~LED2;

if(Rx_Buf==0)

Rx_Buf = 15;

else

Rx_Buf--;

Display();

while(KEY2==0);

}

}

}

串口通信,按键加减提示音,(利用定时中断)快速加减提示音

#include

#define uint unsigned int

#define uchar unsigned char

#define SEND 0

#define RECEIVE 1

#define NORMAL 0

#define INCREASE 1

#define DECREASE 2

sbit KEY1 = P1^4;

sbit KEY2 = P1^5;

sbit LED1 = P1^0;

sbit LED2 = P1^1;

sbit SMG = P1^7;

sbit SPEAKER = P1^6;

uchar flag_Serial = SEND;

uchar Rx_Buf;

uchar count_2s;

uchar flag_KS;

//0 1 2 3 4 5 6 7 8 9 a b c d e f

uchar code Show[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,

0x41,0x1f,0x01,0x19,0x11,

0xc1,0x63,0x85,0x61,0x71};

void Serial_Init();

void Serial_send();

void Display();

void Delay_1ms(uchar z);

void Scan();

/****************************************************/

//main function

//

/****************************************************/

void main()

{

Serial_Init();

while(1)

{

switch(flag_Serial)

{

case SEND:

flag_Serial = RECEIVE;

Serial_send();

break;

case RECEIVE:

Display();

break;

}

Scan();

}

}

/****************************************************/

//serial initial

//

/****************************************************/

void Serial_Init()

{

TMOD = 0X21; //work in mode 2

PCON = 0X00;

SCON = 0X50;

TH1 = 0XFD; //BRUD 9600

TL1 = 0XFD;

TR1 = 1; //open interrupt 1

ES = 1; //open the serial

TH0 = (65536-50000)/256;

TL0 = (65536-50000)%256;

ET0 = 1;

TR0 = 0;

EA = 1; //open the key interrupt

flag_Serial = SEND;

SMG = 0;

}

/****************************************************/

//serial interrupt function

//

/****************************************************/

void Serial() interrupt 4

{

EA = 0;

if(RI!=0&&flag_Serial==RECEIVE)

{

RI = 0;

Rx_Buf = SBUF;

flag_Serial = SEND;

}

EA = 1;

}

/****************************************************/

//interrupt zero function

//

/****************************************************/

void Timer0() interrupt 1

{

TH0 = (65536-50000)/256;

TL0 = (65536-50000)%256;

count_2s++;

if(count_2s==40) //50ms*40=2s

{

count_2s=0;

if(KEY1==0)

flag_KS = INCREASE;

else

flag_KS = DECREASE;

}

}

/****************************************************/

//mcu send data to serial

//

/****************************************************/

void Serial_send()

{

SBUF = Rx_Buf;

while(TI==0);

TI=0;

}

/****************************************************/

//display the data by SMG

//

/****************************************************/

void Display()

{

P2 = Show[Rx_Buf];

}

/****************************************************/

//delay for z*1ms

//

/****************************************************/

void Delay_1ms(uchar z)

{

uchar i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

/****************************************************/

//scan the keys

//

/****************************************************/

void Scan()

{

if(KEY1==0)

{

Delay_1ms(10);

if(KEY1==0)

{

LED1 = 0;

SPEAKER = 0;

Delay_1ms(250);

SPEAKER = 1;

Delay_1ms(250);

LED1 = 1;

flag_Serial = SEND;

Rx_Buf++;

if(Rx_Buf==16)Rx_Buf = 0;

Display();

while(KEY1==0)

{

TR0 = 1;

ES = 0;

if(flag_KS==INCREASE && count_2s==4)

{

count_2s=0;

Rx_Buf++;

if(Rx_Buf==16)Rx_Buf = 0;

SPEAKER = 0 ;

LED1 = 0 ;

Delay_1ms(200);

SPEAKER = 1 ;

LED1 = 1 ;

Delay_1ms(200);

Display();

}

}

flag_KS = NORMAL;

ES = 1;

TR0 = 0;

}

}

if(KEY2==0)

{

Delay_1ms(10);

if(KEY2==0)

{

LED2 = 0;

SPEAKER = 0;

Delay_1ms(125);

SPEAKER = 1;

Delay_1ms(250);

LED2 = 1;

flag_Serial = SEND;

if(Rx_Buf==0)

Rx_Buf = 15;

else

Rx_Buf--;

Display();

while(KEY2==0)

{

TR0 = 1;

ES = 0;

if(flag_KS==DECREASE && count_2s==4)

{

count_2s=0;

if(Rx_Buf==0)

Rx_Buf = 15;

}

}

}

else

Rx_Buf--;

SPEAKER = 0 ;

LED2 = 0 ;

Delay_1ms(200);

SPEAKER = 1 ;

LED2 = 1 ;

Delay_1ms(200);

Display();

}

}

flag_KS = NORMAL;

ES = 1;

TR0 = 0;