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;
发布评论