📄 serial port.c
字号:
/**********************
编写时间:2008年8月10日
编辑:小鱼儿
功能:开机检验数码管好坏,用串口通讯发送一个十六进制数,两位数码管显示,并有八个发光二极管
以二进制的形式点亮,其十六进值与数码管显示一致。
***********************/
#include "reg52.h" //头文件
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar a,b,flag;
sbit dula=P2^6;//数码管段选
sbit wela=P2^7;//数码管位选
sbit beep=P2^3;//蜂鸣器引脚定义
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint z)//延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
/***********************
函数名:beep200ms
功能:数码管全亮,闪烁三次后,前两个数码管显示0.
************************/
void beep200ms()//开机指示灯和数码管全闪
{
for(b=0;b<3;b++)//重复三次
{
P1=0x00;
dula=0;
P0=0xff;
dula=1;
dula=0;
wela=0;
P0=0xc0;
wela=1;
wela=0;
delay(500);
P1=0xff;
dula=0;
P0=0x00;
dula=1;
dula=0;
wela=0;
P0=0xc0;
wela=1;
wela=0;
delay(500);
}
dula=0;
P0=0x3f;//十位显示0
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(10);
dula=0;
P0=0x3f;//个位显示0
dula=1;
dula=0;
wela=0;
P0=0xfd;
wela=1;
wela=0;
delay(10);
}
void display1(uint temp)//发送0x01,显示1
{
uint aa,bb;
aa=temp/16;
bb=temp%16;
dula=0;
P0=table[aa];//显示十位
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(10);
dula=0;
P0=table[bb];//显示个位
dula=1;
dula=0;
wela=0;
P0=0xfd;
wela=1;
wela=0;
delay(10);
}
void move()//流水灯
{
uchar x,temp;
x=0;
P1=0xfe;
for(x=0;x<8;x++)
{
temp=P1;
P1=_crol_(temp,1);
delay(50);
}
for(x=0;x<8;x++)
{
temp=P1;
P1=_cror_(temp,1);
delay(50);
}
}
void main()
{
beep200ms();
TMOD=0x20;//设置定时/计数器T1的工作方式为方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;//运行控制位
SM0=0;
SM1=1;//SCON 串行口的工作方式为方式1
REN=1;//允许串行接受
EA=1; //开总中断
ES=1;//开串行口中断允许位
PCON=0x00;
beep=1;//关蜂鸣器
while(1)
{
display1(SBUF);
if(flag==1)
{
ES=0;//
flag=0;
SBUF=a;
while(!TI);
TI=0;//TI为发送中断标志位,硬件置1,软件置0
ES=1;
}
switch(SBUF)
{
case 01:move();
break;
case 02:beep200ms();
break;
}
}
}
void serial() interrupt 4
{
P1=SBUF;
a=SBUF;
flag=1;
RI=0;//接受中断标志位,硬件置1,软件置0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -