• 基于51单片机的双机串口通信proteus仿真原理图PCB


    功能介绍:
    0.本系统采用STC89C52作为单片机
    1.LCD1602实时显示当前串口发送的数据和接收的数据
    2.按键更新当前发送的数据
    3.采用矩阵键盘作为数据输入键盘
    4.采用DC002作为电源接口可直接输入5V给整个系统供电
    5.EEPROM作为存储器可以存储收发数据,掉电后仍然不丢失

    原理图:
    在这里插入图片描述

    PCB:
    在这里插入图片描述

    主程序:

    #include "main.h"
    
    /*******************变量定义*********************/
    bit dispFlag = 0;
    bit sendFlag = 0;
    unsigned char R_buf[3];
    unsigned char keyBuf = '0';
    unsigned char receiveData = '0'; //接收数据
    
    /********************************************************
    函数名称:void mian()
    函数作用:主函数
    参数说明:
    ********************************************************/
    void main()
    {
        Timer0_Init(); //初始化定时器0
        UART_Init(); //初始化串口
    
        LCD_Init();   //初始化液晶
        DelayMs(200); //延时有助于稳定
        LCD_DispStr(4, 0, "Welcome!");
    
    	DelayS(1);
        LCD_Clear();  //清屏
        LCD_DispStr(0, 0, "Send Data:");
        LCD_DispStr(0, 1, "Received Data:");
    
        while (1) //死循环
        {
            if (dispFlag == 1)
            {
                dispFlag = 0;
                LCD_DispOneChar(10, 0, keyBuf); //显示发送数据
                LCD_DispOneChar(14, 1, receiveData); //显示接收数据
                ES = 0; //关闭串口中断
                UART_SendByte(keyBuf); //发送数据
                DelayMs(2);
                ES = 1; //打开串口中断
                LED_RED = ~LED_RED;
            }
            Key_Process(Calkey_scan());
        }   
    }
    
    
    /************************* 定时器0初始化 *************************/
    void Timer0_Init(void)
    {
        TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
        TH0 = (65536 - 9216) / 256; //重新赋值 10ms
        TL0 = (65536 - 9216) % 256;
        EA = 1;  //总中断打开
        ET0 = 1; //定时器中断打开
        TR0 = 1; //定时器开关打开
    }
    
    /************************* 定时器0中断 *************************/
    void Timer0_Interrupt(void) interrupt 1
    {
        static unsigned int time10ms  = 0;
        TH0 = (65536 - 9216) / 256; //重新赋值 10ms
        TL0 = (65536 - 9216) % 256;
        time10ms++;
    
        if (time10ms > 50)
        {
            dispFlag = 1; //显示标志
            time10ms = 0;
        }
    }
    
    
    /************************* 串口配置 *************************/
    void UART_Init(void)
    {
    	SCON = 0x50;
    	TH2 = 0xFF;
    	TL2 = 0xFD;
    	RCAP2H = 0xFF;  //(65536-(FOSC/32/BAUD))   BAUD = 115200 FOSC = 11059200
    	RCAP2L = 0xFD;
    
    	/*****************/
    	TCLK = 1;
    	RCLK = 1;
    	C_T2 = 0;
    	EXEN2 = 0;
    
    	/*****************/
    	TR2 = 1;
    	ES   = 0; //关闭串口中断
    	EA   = 1; //打开总中断
    
    }
    
    /************************* 串口发送字节 *************************/
    void UART_SendByte(unsigned char dat) //串口发送单字节数据
    {
    	unsigned char time_out;
        
    	time_out = 0;
    	SBUF = dat;						  //将数据放入SBUF中
    	while ((!TI) && (time_out < 100)) //检测是否发送出去
    	{
    		time_out++;
    		DelayUs10x(2);
    	}		//未发送出去 进行短暂延时
    	TI = 0; //清除ti标志
    }
    
    /************************* 串口发送字符串 *************************/
    void UART_SendStr(unsigned char *s, unsigned char length)
    {
    	unsigned char num;
    	num = 0x00;
    	while (num < length) //发送长度对比
    	{
    		UART_SendByte(*s); //放松单字节数据
    		s++;			  //指针++
    		num++;			  //下一个++
    	}
    }
    
    /************************* 串口中断 *************************/
    void UART_Interrupt(void) interrupt 4 //串行中断服务程序
    {
       
        if (RI)//判断是接收中断产生
        {
            RI = 0; //标志位清零
            receiveData = SBUF; //提取数据
            LED_GREEN = ~LED_GREEN;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135

    仿真演示视频:
    https://www.bilibili.com/video/BV1MT4y1q7my/

    实物演示视频:
    https://www.bilibili.com/video/BV1pP4y1F7K7/

  • 相关阅读:
    ssm项目搭建
    云贝教育 |【PostgreSQL PGCA题目解析2】在PostgreSQL中,参数默认的情况下,普通用户最多可建立多少个连接?
    Java基于SpringBoot的在线考试系统的研究与实现(附源码,教程)
    python常用数据结构-元组
    碳量子点CQDs,溶于DMSO(二甲基亚砜) ,发射波长440nm,630nm
    Apache反向代理的功能和設置
    【云原生】容器服务(K8s版)使用 Kubectl 部署 web 服务到 K8s 集群
    SpringMvc(二、请求传参
    ads131a04 ADC verilog实现及仿真
    【web-攻击用户】(9.5)同源策略:与浏览器扩展、HTML5、通过代理服务应用程序跨域
  • 原文地址:https://blog.csdn.net/jimo167913/article/details/127729822