MCU与FPGA串口通信

FPGA以9600的波特率向单片机发送32位数据,然后单片机对数据进行解析,显示在显示屏上面

波特率的产生 : 9600bps是指每秒钟发送9600个bit,即1bit的时间为1/9600,fpga板子自带50M晶振,那么一bit的时间时1/9600/1/50M

51单片机串口2应用

 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
#include<reg51.h>
 
/* 串口2只能选定时器2作为波特率发生器 */
 
//注意串口2:RXD2~P1^0,TXD2~P1^1
 
//根据芯片手册说明,在单片机1T模式下(不12分频)串口在模式0(8位USART)波特率 = Sysclk/(65536-[T2H,T2L])/4
//这个宏定义就是根据波特率来就算定时器应该设定的初值
#define Baud_Rate(baud) (65536 - 11059200/4/baud) 
 
//定义寄存器
sfr AUXR = 0x8e; //辅助寄存器
sfr T2H = 0xD6;	 //定时器2的高八位寄存器
sfr T2L = 0xD7;	 //定时器2的低八位寄存器
sfr S2CON = 0x9a; //USART2控制寄存器
sfr S2BUF = 0x9b; //USART2数据寄存器
 
void usart2_Init(unsigned int baud){
	/*
	S2CON:(只介绍和这里相关的)
		最高位:模式选择位,0为模式0(默认),1为模式1
		第五位:允许串行口接受位
		最低位(S2RI):接收中断请求标志位
		第二位(S2TI):发送中断请求标志位
	*/
	S2CON=0x10;
	T2L = (unsigned char)(Baud_Rate(baud));
	T2H = (unsigned char)(Baud_Rate(baud)>>8);
	//开启定时器2 AUXR第五位是定时器2的开启位,第三位就是选择(当为1时)1T模式/12T模式
	//这里选择的是1T模式(不12分频),如果要用12T模式,模特率就要在后面的式子再除以12
	AUXR |= 0x14; 
}
 
 
void main(){
	//定义变量
	unsigned char dat;
	//初始化
	usart2_Init(9600);
	while(1){

			//S2CON最低位是接收标志位
			if(S2CON&0x01){
			S2CON&=0xfe; //清除接收标志位
			dat = S2BUF;
			S2BUF = dat;
			while((S2CON&0x02)==0); //等待发送完毕
			S2CON&=0xfd; //清除发送标志位
		}

	}
 
}

51单片机串口通信的发送与接收

51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。 无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。 在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。 接收数据时,基本上都是使用“中断方式”,这是正确合理的。 即:每当收到一个新数据,就在中断函数中,把 RI 清零,并用一个变量,通知主函数,收到了新数据。 发送数据时,很多的程序都是使用的“查询方式”,就是执行 while(TI ==0); 这样的语句来等待发送完毕。 这时,处理不好的话,就可能带来问题。 看了一些网友编写的程序,发现有如下几条容易出错:

PHP中比较两个数组返回交集函数array_intersect_key

PHP array_intersect_key() 函数

定义和用法

array_intersect_key() 函数用于比较两个(或更多个)数组的键名 ,并返回交集。

该函数比较两个(或更多个)数组的键名,并返回一个交集数组,该数组包括了所有在被比较的数组(array1)中,同时也在任何其他参数数组(array2 或 array3 等等)中的键名。

PHP中foreach遍历数组之如何判断当前值已经是数组的最后一个

先给出foreach的两种语法格式

1,foreach (array_expression as $value) statement 2,foreach (array_expression as $key => $value) statement 第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

PDO多种方式取得查询结果

PDO多种方式取得查询结果

PDO最大的特点之一是它的灵活性,本节将介绍如何取得查询结果,包括:

数组(数值或关联数组);

字符串(单列的结果集);

对象;

回调函数。

Sublime安装phpfmt插件格式化PHP代码

Sublime Text 3的phpfmt插件安装及格式化参数使用说明

一、首先安装phpfmt插件

在 Sublime Text 中 ctrl+shift+P

选择 Package Control: Install Package

搜索 phpfmt

二、配置phpfmt

打开 Preferences–>Package Settings–>phpfmt->Settings User ,以下是我的phpfmt的配置,将下面的代码粘贴上去修改一下php_bin的路径即可。

Win32滚动条控件

1.创建控件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
HWND hScrollBar = ::CreateWindow(

        WC_SCROLLBAR,                           //控件类名

        NULL,                                   //窗口标题文本

        WS_VISIBLE | WS_CHILD | SBS_TOPALIGN,   //控件风格样式

        10, 100, 200, 40,                       //控件显示位置坐标

        m_hWnd,                                 //父窗口句柄

        (HMENU)IDC_SCROLLBAR1,                  //控件ID号

        m_hInstance,                            //程序实例句柄

        0);                                     //附加数据

2.设置最小值和最大值(SBM_SETRANGE)

1
SendMessage(hScrollBar, SBM_SETRANGE, 0, 100);
  • wParam: 为最小值
  • lParam: 为最大值

3.设置滑块的位置(SBM_SETPOS)

1
SendMessage(hScrollBar, SBM_SETPOS, 1, TRUE);
  • wParam: 为要设定的位置
  • lParam: TRUE为是否刷新窗口,FALSE为不刷新

4.获得滑块当前位置(SBM_GETPOS)

1
int pos = SendMessage(hCtrl, SBM_GETPOS, 0, 0);

5.通知消息

水平通知消息(WM_HSCROLL)

常见芯片和运放电路介绍

一、PCF8591锁存器:

1、74HC573锁存器介绍:

 74HC573是拥有八路输出的透明锁存器,输出为三态门,是一种高性能硅栅​​C​​MOS器件。器件的输入是和标准CMOS输出兼容的,加上拉电阻他们能和LS/ALSTTL输出兼容。

2、74HC573锁存器工作原理:

 如果单片机的总线接口只作一种用途,不需要接锁存器;如果单片机的总线接口要作两种用途,就要用两个锁存器。例如:一个口要控制两个 LED,对第一个 LED 送数据时,“打开”第一个锁存器而“锁住”第二个锁存器,使第二个 LED 上的数据不变。对第二个 LED 送数据时,“打开”第二个锁存器而“锁住”第一个锁存器,使第一个 LED 上的数据不变。如果单片机的一个口要做三种用途,则可用三个锁存器,操作过程相似。然而在实际应用中,我们并不这样做,只用一个锁存器就可以了,并用一根 I/O 口线作为对锁存器的控制之用(接 74HC573 的L,而E可恒接地)。所以,就这一种用法而言,可以把锁存器视为单片机的 I/O 口的扩展器。

1脚是输出使能 11脚是锁存使能 D是输入 Q是输出 H是高电平,L是低

Python实现内容替换的脚本

核心功能

Python实现内容替换的脚本

实现代码

  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
import os
import re

'''
1、编写复制函数,实现复制文件夹
|--思路:获取目录下文件和目录信息,遍历并做复制操作
2、定义源目录路径(源文件夹包含文件和子目录)
3、定义目标路径
4、调用函数,传参源和目标目录
'''


def dir_full_copy(source, target):
    source = source
    target = target
    # 创建目标文件夹
    if not os.path.isdir(target):
        os.makedirs(target)
    # 获取目录信息,得到目录下的子目录名和文件名+后缀名
    dir_list = os.listdir(source)
    #print(dir_list)
    # 遍历目录下文件或文件夹
    for i in dir_list:
        # 拼接当前文件或子目录的完整路径
        i_path = os.path.join(source, i)
        print('i_path', i_path)
        # 判断是否目录
        # 如果是目录,则在目标目录新建目录, 并调用dir_full_copy进入源子目录复制里面的文件
        if os.path.isdir(i_path):
            # 拼接目标子目录完整路径
            target_child_dir = os.path.join(target_dir, i)
            print('target child dir', target_child_dir)
            # 在目标目录下新建相同的子目录
            #os.mkdir(target_child_dir)
            if not os.path.isdir(target_child_dir):
                os.makedirs(target_child_dir)            
            # 递归调用,子目录为传参
            dir_full_copy(i_path, target_child_dir)
        # 如果不是目录,则复制到目标文件夹下
        else:
            #print('else is file', i)
            # 目标文件
            target_file = os.path.join(target, i)
            print('target file', target_file)
            # 二进制&读模式打开源文件
            # 因为源目录下不一定只有txt文本,如果是图片之类的,只能通过二进制来读取
            with open(i_path, 'rb') as str:
                source_data = str.read()
                # 二进制&写模式打开目标文件,并写入数据
                with open(target_file, 'wb') as str2:
                    str2.write(source_data)


'''
1、编写复制函数,实现复制文件夹
|--思路:获取目录下文件和目录信息,遍历并做复制操作
2、定义源目录路径(源文件夹包含文件和子目录)
3、定义目标路径
4、调用函数,传参源和目标目录
'''


def java_convert_golang(source, target):
    source = source
    target = target
    # 创建目标文件夹
    if not os.path.isdir(target):
        os.makedirs(target)
    # 获取目录信息,得到目录下的子目录名和文件名+后缀名
    dir_list = os.listdir(source)
    #print(dir_list)
    # 遍历目录下文件或文件夹
    for i in dir_list:
        # 拼接当前文件或子目录的完整路径
        i_path = os.path.join(source, i)
        print('i_path', i_path)
        # 判断是否目录
        # 如果是目录,则在目标目录新建目录, 并调用dir_full_copy进入源子目录复制里面的文件
        if os.path.isdir(i_path):
            # 拼接目标子目录完整路径
            target_child_dir = os.path.join(target_dir, i)
            print('target child dir', target_child_dir)
            # 在目标目录下新建相同的子目录
            #os.mkdir(target_child_dir)
            if not os.path.isdir(target_child_dir):
                os.makedirs(target_child_dir)            
            # 递归调用,子目录为传参
            java_convert_golang(i_path, target_child_dir)
        # 如果不是目录,则复制到目标文件夹下
        else:
            #print('else is file', i)
            # 目标文件
            target_file = os.path.join(target, i)
            print('target file', target_file)
            # 二进制&读模式打开源文件
            # 因为源目录下不一定只有txt文本,如果是图片之类的,只能通过二进制来读取
            with open(i_path, 'rb') as str:
                source_data = str.read()
                # 二进制&写模式打开目标文件,并写入数据
                with open(target_file, 'wb') as str2:
                    str2.write(source_data)

def java_token_replace(source,target):
    
    
    s = "正则表达式"
    p = re.compile(s)
    
    # 查找
    mf1 = p.search(source)
    mf2 = p.findall(source)
    mf3 = p.finditer(source)
    
    # 替换
    ms = p.sub(source)
    ms2 = p.subn(source)
    
    # 分割
    mp = p.split("检测内容")
    

# 定义源目录和目标
# (注意,如果是Windows目录,需要加在路径分隔符\前加转义字符或者在最前面引号前加r)
source_dir = 'D:/source/shop-saas3/back-end-code/fz-platform'
target_dir = 'D:/codebase/python/target'
# 调用复制函数,传参源目录及目标目录
java_convert_golang(source_dir, target_dir)