此程序用串口控制单片机进行流水灯,蜂鸣器,数码管计时。输入1,进行流水灯,输入2,流水灯停止在流水的最后一位,输入3,打开蜂鸣器,输入4,关闭蜂鸣器,输入5,打开数码管计时,输入6,计时停止,输入7,计时归零。
程序如下
#include<reg52.h>
sbit ENLED = P1^1;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit BUZZ = P1^3;
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[7] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char R = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned char a = 0;
unsigned long n = 0;
unsigned long sec = 0;
unsigned char o;
void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
void main()
{
EA = 1;
ENLED = 0;
ConfigTimer0(1);
ConfigUART(9600);
BUZZ = 1;
while(1)
{
n = sec;
for(a = 0;a<=5;a++)
{
LedBuff[a] = LedChar[n%10];
n = n/10;
}
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 32768000/12;
tmp = (tmp*ms)/1000;
tmp = 65536 - tmp;
tmp = tmp + 13;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
void ConfigUART(unsigned int baud)
{
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 255-(32768000/12/32)/baud;
TL1 = TH1;
ET1 = 0;
ES = 1;
TR1 = 1;
}
void LSD()
{
static unsigned char cnt = 0;
static unsigned int i = 0;
if(R == 1)
{
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
i++;
if(i>=500)
{
i = 0;
if(cnt<=7)
{
P0 = ~(0x01<<cnt);
cnt++;
o = P0;
}
if(cnt == 8)
{
cnt = 0;
}
}
}
if(R == 2)
{
P0 = o;
}
}
void FMQ()
{
ADDR0 = 1;
ADDR1 = 1;
ADDR2 = 1;
if(R == 3)
{
BUZZ = ~BUZZ;
}
if(R == 4)
{
BUZZ = 1;
}
}
void LedScan()
{
static unsigned char i = 0;
P0 = 0xFF;
switch(i)
{
case 0:ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++0 = LedBuff[5];break;
case 1:ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++0 = LedBuff[4];break;
case 2:ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++0 = LedBuff[3];break;
case 3:ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++0 = LedBuff[2];break;
case 4:ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++0 = LedBuff[1];break;
case 5:ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i++0 = LedBuff[0];break;
case 6:ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;i = 00 = LedBuff[6];break;
default: break;
}
}
void SMG()
{ static unsigned int d = 0;
if(R == 5)
{
d++;
if(d>=1000)
{
d = 0;
sec++;
}
LedScan();
}
if(R == 6)
{
d = 0;
LedScan();
}
if(R == 7)
{
d = 0;
sec = 0;
LedScan();
}
}
void InterruptTimer0() interrupt 1
{
TH0 = T0RH;
TR0 = T0RL;
LSD();
FMQ();
SMG();
}
void InterruptUART() interrupt 4
{
if(RI)
{
RI = 0;
R = SBUF;
SBUF = R;
}
if(TI)
{
TI = 0;
}
}
|