1484|0

6593

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

单片机通信Proteus仿真实验 [复制链接]

本实验是设置八个按键在上位机按下,下位机接收到数据后执行。分别控制八个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;  //清正在发送标志
}
}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表