历史上的今天
返回首页

历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2019年10月29日 | PC机通过RS232控制单片机

2019-10-29 来源:51hei

单片机与PC机通过RS232相连,编写一个异步串行口通信程序,实现单片机与PC机上的串口助手之间的通信。


功能实现:

1、当PC机向单片机发送字符‘1’~‘8’,打开对应的8个灯;

2、当PC机再次向单片机发送字符‘1’~‘8’时,关闭对应的灯;

3、当PC机向单片机发送字符‘d’时,会在液晶屏上删除一个字符;

4、当PC机向单片机发送字符‘n’时,会在液晶屏上换行显示;

5、当PC机向单片机发送字符‘c’时,会清屏显示;

6、当PC机向单片机发送字符‘m’时,会打开音乐播放,结束后可继续操作;

7、当PC机向单片机发送其它字符时,会显示在1602液晶屏上;

8、当矩阵按键有按键按下时,单片机会把键值发送到PC机上。

仿真原理图如下

 

单片机源程序如下:

#include

#include

#include

#define uchar unsigned char

#define        uint unsigned int

uchar str[17];

uchar ch;

uchar m,n; 

sbit K1=P3^7;

bit play=0;

sbit LEN=P3^4;

sbit LCDEN=P3^6;

sbit RS=P3^3;

sbit RW=P3^5;

sbit BF=P2^7;

sbit LED=P0;

sbit BEEP=P3^2;

uint I=0,J,K;

uchar code keyval[]="123456789*0#"; //按键对应的符号 

char s[ ]="MCS-51 Microcomputer";

uchar OpenLight[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar CloseLight[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar code T[49][2]={{0,0},

{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},

{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},

{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},

{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}

};

uchar code music[][2]={

{0,4},{20,8},{25,4},{22,4},{20,8},

{20,8},{17,4},{20,4},{22,4},{25,4},

{20,8},{20,8},{22,8},{20,4},{17,4},

{15,8},{15,8},{17,8},{20,4},{17,4},

{15,4},{17,4},{13,8},{22,8},{20,8},

{22,8},{20,8},{17,8},{22,8},{20,16},

{20,4},{20,4},{17,4},{15,4},{13,16},

{13,4},{13,4},{15,4},{17,4},{13,16},

{0xFF,0xFF}};

//生日快乐歌的音符频率表,不同频率由不同的延时来决定

uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,

                                                212,212,106,126,159,169,190,119,119,126,159,142,159,0};

//生日快乐歌节拍表,节拍决定每个音符的演奏长短

uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,

9,3,12,12,12,12,12,9,3,12,12,12,24,0};

void delay(uchar p)

{

    uchar i,j; 

    for(;p>0;p--)

    for(i=181;i>0;i--)

    for(j=181;j>0;j--);

}

void DelayMS(uint x)

{

        uchar t;

        while(x--) for(t=0;t<120;t++);

}

//2¥·?oˉêy

void PlayMusic2()

{

//        uint i=0,j,k;

        if(SONG_LONG[I]!=0||SONG_TONE[I]!=0)

        {        

                for(J=0;J                {

                        BEEP=~BEEP;

                        

                        for(K=0;K                }

                DelayMS(10);

                I++;                

        }

        else

                I=0;

}

void delay_us(uchar t) //微秒延时

{uchar i;

for(i=0;i<=t;i++);

}

void Alarm(uchar t) //报警

{

uchar i,j,k;         

for(j=0;j{ for(i=0;i<200;i++)

      {BEEP=0;delay_us(50);BEEP=1;delay_us(50);}

   for(k=0;k<100;k++)

      {BEEP=0;delay_us(110);BEEP=1;delay_us(110);}

}

}

void pause()

{

    uchar i,j;

    for(i=150;i>0;i--)

    for(j=150;j>0;j--);

}

void delay_ms(unsigned int xms)

{

        int i,j;

        for(i=xms;i>0;i--)

                for(j=110;j>0;j--);

}

void PlayMusic()

{

        uchar i=0;

        

        while(1)

        {         if(i==40){ ET0=0;

                        break;         }

                m=music[i][0];

                n=music[i][1]; 

                   if(m==0x00)

            {

                        TR0=0;

                        delay(n);

                        i++;

                } 

            else if(m==0xFF)

           {

                   TR0=0;

                   delay(30);

                   i=0;

           } 

           else if(m==music[i+1][0]) 

           {

                   TR0=1;

                   delay(n);

                   TR0=0;

                   pause();

                   i++;

           }

           else

           {

                   TR0=1;

                   delay(n);

                   i++;

           }

        }

}

uchar keypad4_3()//按键扫描函数:要去抖,若有按键按下,返回对应的按键值(0-11),没有按键按下返回12

{

        uchar i,row,temp;

        uchar key=12;//按键号,初值设置为12,目的是:没有按键按下时返回12;

                  //若不设初值(默认值为0),没有按键按下时,将返回0,会误认为0被按下  

        row=0xef; //从第一行开始      

        for(i=0;i<4;i++)

        {

                P1=0xff;  

                P1=row;        //第i行信号,对应行为低,其他全为高

                row=_crol_(row,1);           //生成下一行信号

                temp=P1; //读入扫描信号

                temp=temp&0x07; //屏蔽高5位信号,只保留低3位列信号 

                if(temp!=0x07)//有按键被按下,因为第i行某列有按键按下,则低3位中有一位为低  

                 {  

                        delay_ms(20);  //延时去抖

                        temp=P1;  

                        temp=temp&0x07;  

                        if(temp!=0x07)   //再次确认有按键被按下

                          {  

                        switch(temp)  //根据低3位列信号,判断哪个按键被按下

                    {  

                            case 0x06:key=0+3*i;break; //第i行第1列按键被按下 

                        case 0x05:key=1+3*i;break; //第i行第2列按键被按下  

                        case 0x03:key=2+3*i;break; //第i行第3列按键被按下                                    

                    }

                                

                                do

                                {

                                        temp=P1;              //再次扫描按键

                                          temp=temp&0x07;  

                                  }while(temp!=0x07); //等待按键释放   

                          }  

             }

        }  

        return(key);//扫面结束,返回按键值

}        

推荐阅读

史海拾趣

兆易创新(GigaDevice)公司的发展小趣事

对于热电偶隔离缓冲放大电路,网友可能会有多种问题,以下是一些常见问题及其回答:

一、技术问题

  1. 什么是热电偶隔离缓冲放大电路?
    • 回答:热电偶隔离缓冲放大电路是一种专门用于热电偶信号处理的电路,它能够将热电偶产生的微弱电压信号进行放大,并通过隔离技术消除干扰信号,确保信号的准确性和稳定性。这种电路通常包括放大器和隔离器两部分,放大器用于增强信号,而隔离器则用于隔离输入和输出之间的电气连接,防止噪声和干扰的传递。
  2. 为什么需要热电偶信号的隔离和缓冲?
    • 回答:热电偶信号通常非常微弱,且易受到环境噪声和电磁干扰的影响。隔离可以切断输入和输出之间的直接电气连接,防止噪声和干扰信号进入测量系统,提高测量的准确性和可靠性。缓冲则可以减小负载对热电偶信号的影响,保护热电偶免受损坏,并稳定信号输出。
  3. 如何选择适合的热电偶隔离缓冲放大电路?
    • 回答:选择适合的热电偶隔离缓冲放大电路时,需要考虑多个因素,包括热电偶的类型、测量范围、精度要求、工作环境等。此外,还需要关注电路的输入阻抗、输出阻抗、增益稳定性、噪声水平等性能指标,以确保电路能够满足实际应用的需求。

二、实际应用问题

  1. 热电偶隔离缓冲放大电路在工业现场的应用有哪些?
    • 回答:热电偶隔离缓冲放大电路在工业现场有广泛的应用,如温度测量、温度控制、热处理过程监控等。它们可以用于测量各种高温、低温环境下的温度,并通过与控制器、记录仪等设备配合使用,实现对温度的精确控制和记录。
  2. 如何安装和调试热电偶隔离缓冲放大电路?
    • 回答:安装和调试热电偶隔离缓冲放大电路时,需要按照产品说明书的要求进行操作。一般来说,需要先将热电偶与电路的输入端正确连接,然后调整电路的增益、零点等参数,使输出信号符合实际应用的需求。在调试过程中,需要注意观察电路的输出信号是否稳定、准确,并检查是否有噪声和干扰信号的存在。
  3. 热电偶隔离缓冲放大电路的维护和保养有哪些注意事项?
    • 回答:热电偶隔离缓冲放大电路的维护和保养非常重要,可以延长电路的使用寿命并保证其性能稳定。在使用过程中,需要定期检查电路的接线是否牢固、元器件是否损坏、输出信号是否准确等。如果发现异常情况,应及时处理并更换损坏的元器件。此外,还需要注意保持电路的清洁和干燥,避免灰尘和水分进入电路内部导致故障。

三、其他问题

  1. 热电偶隔离缓冲放大电路的成本如何?
    • 回答:热电偶隔离缓冲放大电路的成本因产品型号、性能指标和生产厂家等因素而异。一般来说,高精度、高稳定性的电路成本会相对较高。在选择电路时,需要根据实际需求和预算进行综合考虑。
  2. 热电偶隔离缓冲放大电路的发展趋势是什么?
    • 回答:随着工业自动化和智能化的发展,热电偶隔离缓冲放大电路也在不断向高精度、高稳定性、高集成度方向发展。未来,这种电路可能会采用更先进的集成电路技术和信号处理技术,提高测量精度和抗干扰能力,并降低成本和功耗。同时,随着物联网技术的发展,热电偶隔离缓冲放大电路也可能会与无线通信技术相结合,实现远程监控和智能控制等功能。
全智景(Allvision)公司的发展小趣事

随着技术的不断进步,全智景公司开始寻求跨界合作的机会,以拓展其技术的应用领域。公司与多家汽车制造商达成了合作协议,将其电子视觉技术应用于汽车自动驾驶系统。通过精准的图像识别和处理,全智景的技术帮助汽车实现了更高级别的自动驾驶功能,提升了行车安全性和驾驶体验。这一跨界合作不仅拓宽了全智景公司的业务范围,也为其带来了更多的商业机会。

DUCATI公司的发展小趣事

随着技术的不断进步,全智景公司开始寻求跨界合作的机会,以拓展其技术的应用领域。公司与多家汽车制造商达成了合作协议,将其电子视觉技术应用于汽车自动驾驶系统。通过精准的图像识别和处理,全智景的技术帮助汽车实现了更高级别的自动驾驶功能,提升了行车安全性和驾驶体验。这一跨界合作不仅拓宽了全智景公司的业务范围,也为其带来了更多的商业机会。

微芯(CMOSIC)公司的发展小趣事

为了进一步提升研发实力和市场竞争力,微芯生物开始了并购之路。他们先后收购了多家在生物医药领域具有优势的企业,包括专注于生物制品生产和销售的企业、创新药物研发企业以及提供全方位生物医药研发生产外包服务的企业等。通过并购整合,微芯生物不仅增强了自身的研发实力和市场占有率,还进一步完善了公司的产业链和战略布局。

Anachip公司的发展小趣事

Anachip公司自成立以来,一直致力于半导体技术的研发。在某个关键时期,公司研发团队成功开发出一种新型的芯片技术,这项技术在性能上远超当时的行业标准。凭借这一技术突破,Anachip迅速在市场上推出了一系列高性能的芯片产品,赢得了客户的广泛认可。随着产品销量的增长,公司的知名度和市场份额也逐步提升。

艾迈斯(AMASS)公司的发展小趣事

艾迈斯(AMASS)公司创立之初,便专注于智能设备动力连接器领域。面对市场的激烈竞争和技术的不断更新,公司创始人凭借深厚的行业经验和前瞻性的眼光,带领团队攻克了一个又一个技术难关。他们深入市场调研,精准把握消费者需求,成功推出了一系列具有竞争力的连接器产品。这些产品不仅性能稳定、质量可靠,而且具有极高的性价比,迅速在市场上赢得了良好的口碑。

问答坊 | AI 解惑

确保汽车无线模块品质的新型RF测试方案

在各种车辆中,配备多种多样射频接口的模块和设备的应用日益增长。因为这些模块必须满足严格的可靠性要求,所以在调节和最终测试中必须能够获得可再现的测量结果。经过高度有效的屏蔽和严格的设计,罗德与施瓦茨公司的新型RF测试舱设备能够确保对配 ...…

查看全部问答>

Die Dresdner MessstraßenbahnThe Dresden Measurement Tram

Die Dresdner MessstraßenbahnThe Dresden Measurement Tram…

查看全部问答>

招聘赴日工程师

1,语言要求:口语可以交流(有没有考级没关系),因为对方是日本人直接面试,工作环境也是日语的,故要求口语可以一般交流。 2.学历要求:本科(理工科),有对日开发经验2年左右,有去日本出差经验,大专(计算机学科),有2年经验左右,有程序员 ...…

查看全部问答>

soso:你们怎么不做点LM3S8962开发板卖呢?

你们总是经常以发放开发板来吊大家的胃口,如果真正为了让坛子里面朋友都能够有机会学习,你们就应该多生产点LM3S8962开发板,定个合理的价格卖给大家:Q…

查看全部问答>

着急啊,用multisim做MAX264滤波器怎么样也不能输出信号

本帖最后由 paulhyde 于 2014-9-15 09:30 编辑 请问有没有大牛能给提供一个设计文件里面的MAX264是能够输出的 输出什么高通低通都行。 啊 小弟也不知道自己电路对不对,因为昨天第一次用。。哎  …

查看全部问答>

谁不是摸爬滚打地开始的?—— 辛昕的2011

2011年度热词:Linux   过去在学校,我打算绕过它,上班后,我第一个活就把我往上面撞。 于是开始了Linux 这番折腾比较悲催——但现在想想跟难度没关,跟做事的手法有关......   到近期由于要去做另一个东西,基本它和我暂时没关系 ...…

查看全部问答>

求FPGA工程师--北京云加速信息技术有限公司

工作内容:1、从事视频相关算法的FPGA开发工作;2、完成算法定点,RTL编写,板级调试工作;3、编写设计文档并提供相应的技术支持;4、参与系统方案设计与技术规范制定。 任职要求:1、电子、通信、自动化等相关专业毕业,本科及以上学历,3 ...…

查看全部问答>

AD测电压的问题

选择的参考电压为Vcc,然后把Vcc用3.3v带入测得的值比实际的值小0.15mv左右,后来我测Vcc的电压发现为3.5710V,我又将程序里面的Vcc用3.6v代替,测得的值稍稍偏大,请问我测电压的时候应该把Vcc取多少的值呢 大家懂的看到了给我说下吧,…

查看全部问答>

系统启动一半就不动了,求解。内核文件系统都是用评估板自带的,AM/DM37X—EVM

终端打印信息如下: Starting kernel ... Uncompressing Linux........................................................................................................................................................ done, booting the ...…

查看全部问答>

Show我的GPRS+GPS开发板

本人最喜欢做的事情就是DIY开发板,在论坛已经Show不是开发板了,下面来Show一下本人最近做的GPRS+GPS开发板。本开发板的特殊是GPRS+GPS,而已带触摸3.2寸TFT彩屏,完全可以自己DIY一个智能手机哦。。。      请大家到《Show ...…

查看全部问答>