本实验是设置八个按键在上位机按下,下位机接收到数据后执行。分别控制八个LED灯,内部有介绍一些关于ASCII可显示字符的使用。在低一个显示字符我改动原来是1=31的一个值。改成/=2F...很好理解的,自己多试试改别的也可以。
仿真原理图如下.
单片机源程序如下:
/********************************************************************
函数功能:往串口发送一字节数据(可通过超级终端显示出来,超级终端波特率选为9600)。
超级终端设置好后,每按下一次S2/S3/S4/S5键显示abcd,松开后均会在超级终端上显示一个字母"a"。
入口参数:d: 要发送的字节数据。
********************************************************************/
#include <reg52.h>
#define jingzhen 11059200UL /*使用22.1184M晶体*/
#define botelv 9600UL /*波特率定义为9600*/
//定义待显示字符abcd
unsigned char zifua='/'; //待显示字符a。
unsigned char zifub='2'; //待显示字符。
unsigned char zifuc='3'; //待显示字符。
unsigned char zifud='4'; //待显示字符。
unsigned char zifue='5'; //待显示字符。
unsigned char zifuf='6'; //待显示字符。
unsigned char zifug='7'; //待显示字符。
unsigned char zifuh='8'; //待显示字符。
volatile unsigned char sending;
//设置八个独立按键
sbit s1=P2^0; //按键
sbit s2=P2^1; //按键
sbit s3=P2^2; //按键
sbit s4=P2^3; //按键
sbit s5=P2^4; //按键
sbit s6=P2^5; //按键
sbit s7=P2^6; //按键
sbit s8=P2^7; //按键
//设置for延时函数
void delay(unsigned char i)
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=90;k>0;k--);
}
void init(void) //串口初始化
{
EA=0; //暂时关闭中断
TMOD&=0x0F; //定时器1模式控制在高4位
TMOD|=0x20; //定时器1工作在模式2,自动重装模式
SCON=0x50; //串口工作在模式1
TH1=256-jingzhen/(botelv*12*16); //计算定时器重装值
TL1=256-jingzhen/(botelv*12*16);
PCON|=0x80; //串口波特率加倍
ES=1; //串行中断允许
TR1=1; //启动定时器1
REN=1; //允许接收
EA=1; //允许中断
}
//发送一个字节的数据,形参d即为待发送数据。
void send(unsigned char d)
{
SBUF=d; //将数据写入到串口缓冲
sending=1; //设置发送标志
while(sending); //等待发送完毕
}
void main()
{
init();
while(1)
{
if(s1==0) //如果按下S2
{
delay(20); //延时
if(!s1) //判断是否按下
{
while(!s1); //循环检测S2是否按下并执行下一条
send(zifua); //发送a
}
// else(s1==1);
}
if(s2==0)
{
delay(20);
if(!s2)
{
while(!s2);
send(zifub);
}
}
if(s3==0)
{
delay(20);
if(!s3)
{
while(!s3);
send(zifuc);
}
}
if(s4==0)
{
delay(20);
if(!s4)
{
while(!s4);
send(zifud);
}
}
if(s5==0)
{
delay(20);
if(!s5)
{
while(!s5);
send(zifue);
}
}
if(s6==0)
{
delay(20);
if(!s6)
{
while(!s6);
send(zifuf);
}
}
if(s7==0)
{
delay(20);
if(!s7)
{
while(!s7);
send(zifug);
}
}
if(s8==0)
{
delay(20);
if(!s8)
{
while(!s8);
send(zifuh);
}
}
}
}
void uart(void) interrupt 4 //串口发送中断
{
if(RI) //收到数据
{
RI=0; //清中断请求
}
else //发送完一字节数据
{
TI=0;
sending=0; //清正在发送标志
}
}
|