![](https://img-blog.csdnimg.cn/e86a2a81b8e0444fb192b132ccac2c8f.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
基于STC89C52清翔51开发板
文章平均质量分 50
基于STC89C52的开发代码
金丝草
维修工程师、硬件EVT工程师、单片机工程师、BSP驱动开发工程师
展开
-
清翔51单片机开发板及原理图-去年购买的
2019年购买了清翔的51单片机开发板,然后开始学习单片机编程及开发,学习到2020年7月份,基本上学习的差不多了,现在开始我要开始写博客了。之前的维修博客暂停。原创 2020-07-18 13:28:43 · 10131 阅读 · 20 评论 -
51单片机——USART全双工模式通讯-波特率可选1.3版本
1、优化《51单片机——USART半双工模式通讯-波特率可选1.2版本》里的代码。2、主要修改了串口中断里的代码和主函数里的发送代码,接收缓存50字节(这个可自行调整串口缓存大小)。3、此代码工作在半双工模式。4、使用系统输出函数之后要使用自定义函数发送则需要延迟2毫秒,要不然会出错。切记。测试结果:定时器1、定时器2波特率均已验证OK。4800bps~115200bps均OK。main.c#include "uart.h"#include <stdio.h>#原创 2021-03-29 10:45:11 · 1085 阅读 · 1 评论 -
51单片机——USART半双工模式通讯-波特率可选1.2版本
1、优化《51单片机——UART串口通讯-波特率可选,增添定时器2产生波特率1.1版本》里的代码。2、主要修改了串口发送和串口中断里的代码,且增加了串口发送标识位。原创 2021-03-27 13:19:20 · 1312 阅读 · 2 评论 -
51单片机——AT24C02_EEPROM驱动-模拟IIC通讯32页8字节缓存1.2版本
1、优化上节《51单片机——AT24C02_EEPROM驱动-模拟IIC通讯32页8字节缓存1.1版本》里的代码。2、加入算法,这个很重要,可以指定位置开始写入数据,指定写入多少个数据(注意写入的位置+写入的数据个数别大于255了),而不用担心。3、我已调试OK,在我的51单片机上。希望大家可以点赞,收藏,谢谢!4、用到的代码有delay.c / usart.c / iic.c / at24c02.c / main.ciic.c iic.h 请拷贝《51单片机——STC89C52_模拟...原创 2021-03-24 18:14:05 · 258 阅读 · 0 评论 -
51单片机——STC89C52_模拟IIC驱动代码1.1版本
1、优化《51单片机——STC89C52_模拟IIC通讯驱动1.0》里的代码,本模拟IIC代码适用于AT24C02,其他器件可能需要在代码里加入延迟。建议用本版本或后续版本,别用1.0及之前的版本。2、对于IIC通讯,我觉的有2种通讯方案。 方案1:每次函数结束后未释放SDA线,且SCL=1; 方案2:每个函数结束后释放SDA线,且SCL=0; 本次采用方案1,方案2有时间在调试。3、对于IIC时序,也就6种:开始信号、结束信号、写1字节、读1字节、接收ACK、发送AC...原创 2021-03-24 17:57:02 · 991 阅读 · 0 评论 -
51单片机——8位数码管显示正整数和小数及解决鬼影问题1.2
1、优化上节《51单片机——8位数码管显示正整数和小数及解决鬼影问题1.1》里的代码。2、原来的小数对于DS18B20温度转换有问题,本次直接解决了,对DS18B20温度转换想了解的请看本人的《51单片机——DS18B20温度传感器-1总线通讯1.2》3、对DS18B20转换问题(小数、正负号小数、正整数)修改了原来的convert_long_int()这个函数。本次主要看void convert_long_int(unsigned long int DATA,bit flag_bit,unsig.原创 2021-01-30 16:56:58 · 1219 阅读 · 0 评论 -
51单片机——DS18B20温度传感器-1总线通讯1.2
写的不知道好不好,有什么不对的地方还请指出,谢了。1、本节基于DS18B20 1总线通讯。DS18B20温度转换很慢,初始化复位也慢,读取它的温度不需要那么频繁,可按照需要修改。2、在《51单片机——DS18B20温度传感器-1总线通讯1.1》章节上做代码优化了,主要对小数转换及显示问题算法优化了。3、12位精度显示的时候最后面那位老是0应该为0或者5的,不知道是不是精度太高芯片转换不到了,温度最大精确到百位已经可以了.4、在调试的时候发现有时候会出现-0.0000,在访问DS18B20的时原创 2021-01-30 16:16:27 · 1007 阅读 · 0 评论 -
51单片机——DS18B20温度传感器-1总线通讯1.1
写的不知道好不好,有什么不对的地方还请指出,谢了。1、本节基于DS18B20 1总线通讯。DS18B20温度转换很慢,初始化复位也慢,读取它的温度不需要那么频繁,可按照需要修改。2、驱动DS18B20,代码3个:初始化DS18B20、写1字节、读1字节。3、在《51单片机——DS18B20温度传感器-1总线通讯1.0》章节上做代码优化了,主要解决了小数转换及显示问题。4、温度读取出来后用数码管来显示小数,上章节数码管显示小数有精度问题,本次直接优化OK,只是12位精度显示的时候最后面那位老是原创 2021-01-30 12:11:14 · 685 阅读 · 0 评论 -
51单片机——UART串口通讯-波特率可选,增添定时器2产生波特率1.1版本
1、优化《51单片机——UART串口通讯-波特率可选,增添定时器2产生波特率1.0》里的代码。2、原串口中断里的ES去掉了,感觉鸡肋没有鸟用。3、修改的地方很少哈。4、特殊备注:当要使用printf()函数的时候需要在函数前面加上2行代码:ES=0;TI=1;xxxx你的代码;//TI=0;//printf();使用后会自动将TI置0,你不放心的话最好加上TI=0;ES=1;#ifndef __UART_H__#define __UART_H__// bps480原创 2020-11-30 14:56:45 · 1538 阅读 · 2 评论 -
51单片机——启用定时及使用1.1版本
1、优化《51单片机——启用定时及使用1.0》里的代码。2、主要是一些小改动。3、主要包括:定时器0,8位自动重装、16位手动重装;定时器1,8位自动重装、16位手动重装;定时器2,16位自动重装。备注:你想使用哪个就初始化配置哪个,注意time0、time1、time2、time00、time11是局部全局变量,如果外部要使用请去掉static,在.h里使用extern进行修饰一下。如果觉的好,麻烦点赞一下哈。#ifndef __TIME_H__#define __TIME_H__原创 2020-11-30 11:45:46 · 396 阅读 · 0 评论 -
51单片机——AT24C02_EEPROM驱动-模拟IIC通讯32页8字节缓存1.1版本
1、优化上节《51单片机——AT24C02_EEPROM驱动-模拟IIC通讯32页8字节缓存1.0》里的代码。2、增添了读取AT24C02的状态、增添了有多少个AT24C02器件。3、主要优化读、写,页读、页写,擦除里的代码,减少不必要的代码。#ifndef __AT24C02_H__#define __AT24C02_H__extern unsigned char Mount_DDR_AT24C02[8];//挂载的器件地址,若为0则表示没有器件extern unsigned cha原创 2020-11-29 12:25:42 · 247 阅读 · 0 评论 -
51单片机——8位数码管显示正整数和小数及解决鬼影问题1.1
1、优化上节《51单片机——8位数码管显示正整数和小数及解决鬼影问题1.0》里的代码。2、原来dt_display(xxx),显示一会就不显示了,本次直接优化掉了,数码管dt_display();放入main函数里即可。3、增添数码管初始化函数。4、去除了清空数码管函数,这个感觉没有啥用。备注:转换小数convert_float()函数有点小问题,主要是小数精确度的问题,这个后期有眉目了在优化。#ifndef __DT_H__#define __DT_H__#include ".原创 2020-11-29 12:09:21 · 2554 阅读 · 0 评论 -
51单片机——矩阵按键逐行扫描短按长按一直按方案1.2
1、删减了《51单片机——独立按键、矩阵按键多种方案1.1》里的一些不怎么用的代码。2、添加了逐行扫描按键(需要定时器20毫秒配合使用)。3、支持按键短按、长按、一直按,代码里只做了短按处理,如要处理长按和一直按只需添加相应的代码即可。4、按键处理我只点亮led灯了,需要其它功能自行添加即可。5、最大优化我觉得是没有一个delay延迟。备注:按键处理及按键扫描放入定时器中断里即可。#ifndef __KEY2_H__#define __KEY2_H__extern void原创 2020-11-29 11:06:41 · 1252 阅读 · 0 评论 -
51单片机——独立按键、矩阵按键多种方案1.1
1、优化了《51单片机——独立按键、矩阵按键多种方案1.0》的代码。2、添加了矩阵按键逐行扫描法KEY16_1、KEY16_2#ifndef __KEY_H__#define __KEY_H__#include "delay.h"//按键占用P3口extern unsigned char key(void);//返回2则按键2被按下,其他按键同理,本函数只循环扫描一次extern unsigned char key2345(void); //函数返回值为2、3、4、5分别对应按键2、原创 2020-11-28 23:23:29 · 735 阅读 · 0 评论 -
51单片机——DS1302实时时钟驱动-SPI模拟通讯(下)1.1
1、删减《51单片机——DS1302实时时钟驱动-SPI模拟通讯(下)1.0》里不常用的代码,只保留突发模式下读写DS1302#ifndef __DS1302_1_H__#define __DS1302_1_H__extern unsigned char DS1302[7];//年 星期 月 日 时 分 秒,读取和写入的数据均会保存在数组里面extern unsigned char DS1302_RAM[31];//时钟工作在突发模式下24小时制extern void write_RT原创 2020-11-28 23:10:43 · 238 阅读 · 0 评论 -
51单片机——DS1302实时时钟驱动-SPI模拟通讯(上)1.1
1、优化一下《51单片机——DS1302实时时钟驱动-SPI模拟通讯(上)1.0》里的代码。2、改动不打,无添加功能。#ifndef __SPI_H__#define __SPI_H__extern void STATR_SPI(void);//1、单片机变异SPI通讯启动信号extern void STOP_SPI(void); //2、单片机结束spi通讯extern void write_1_byte_SPI(unsigned char);//3、单片机写一个字节数据,和iic原创 2020-11-28 23:02:10 · 326 阅读 · 0 评论 -
51单片机——花样驱动LED灯1.1
1、本次只优化了代码,改动不大。2、加入了用户控制8个led灯指令。备注:代码有后遗症,代码中用到了软件delay延迟,建议使用定时器。#ifndef __LED_H__#define __LED_H__#include "delay.h"extern void LED_ON(); //点亮8个LED灯常亮extern void LED_OFF(); //关闭8个LED灯extern void LED_shan_suo(unsigned char x); //8个LE原创 2020-11-28 17:42:59 · 604 阅读 · 0 评论 -
51单片机——delay软件延迟1.2版本
1、优化上节51单片机——delay软件延迟1.0里面的代码。2、这是一个很简单的软件延迟代码,在这里就不多叙述了。3、代码功能有5us延迟、11.95us(进入一次的时间us最大输入255,即最大时间为3047.25us)、最大65535ms延迟、最大255ms延迟。4、特殊备注:单片机晶振为11.0592MHZ#ifndef __DELAY_H__#define __DELAY_H__extern void delay_5us(void);//延迟5us时间extern voi原创 2020-11-28 17:18:48 · 811 阅读 · 2 评论 -
51单片机——启用定时及使用1.0
1、我的reg52.h里没有定义T2MOD,故我自行添加sfr T2MOD=0xc9;2、在代码里我使用了led灯做调试。定时1s,16位定时器调试OK,8位的未调试,在以后在调试了。3、我的CPU晶振11.0592MHZ4、关于定时器初值计算公式里,毫秒最大只能输入71,微妙最大只能输入119,要不然计算公式会变成负值。#ifndef __TIME_H__#define __TIME_H__//时间不能大于71ms,如需更大的定时,需要在定时中断函数里累加71ms//定时时间是ms原创 2020-08-29 13:39:30 · 910 阅读 · 0 评论 -
51单片机——定时器初值计算公式1.0版本
1、包含定时器0、定时器1、定时器22、8位模式和16位模式下定时器初值计算公式。3、如果不使用类型转换,结果将会错误。备注://对于毫秒定时器,时间不能大于71ms,如需更大的定时,需要在定时中断函数里累加计算//对于微妙定时器,时间不能大于119us,如需更大的定时,需要在定时中断函数里累加计算//定时时间是ms毫秒//建议定时为5ms\10ms\15ms\20ms\25ms\30ms\35ms\40ms\...70ms//对于us微妙//建议定时10us\20us\30原创 2020-08-29 13:29:47 · 3321 阅读 · 0 评论 -
51单片机——UART串口通讯-波特率可选,增添定时器2产生波特率1.0
1、51单片机自带硬件串口接口,使用时只需要进行寄存器配置即可。2、定时器1波特率有4种可选择,默认9600bps。另外还有1个字节的发送函数,字符串发送函数。3、增添:定时器2波特率有5种可选择,默认9600bps。3、有几个寄存器默认的reg52.h里面没有,我也给添加进去了,但是我也没有用到。4、GB2312编码汉字占2个字节,UTF-8汉字占3个字节,英文均占用1个字节。使用串口工具需要注意,要不会出现中文乱码。5、串口波特率也要一致,要不然也会出现乱码情况。#ifndef原创 2020-08-15 14:09:49 · 2618 阅读 · 1 评论 -
51单片机——点阵屏8*8基于74HC595移位锁存器驱动1.0
1、8*8共阳极点阵屏,8行8列。2片74HC595串联芯片。2、1.使用小工具建立了0-10及心型图标真值表。2.复位显示。3.写1字节数据。4.将数据锁存并输出。5.点阵屏的随意显示(显示的真值表)。6.应用测试代码(不太全未加入全部都亮)。3、8行8列,故每次要写入2个字节,第一个字节由于硬件连接到的是列,故第一个字节为列数据,第二个字节为行扫字节。4、由于硬件原因,74HC595有部分操作不了。代码里我给注释掉了。#ifndef __DISPLAY88_H__#define __原创 2020-08-04 13:02:28 · 1239 阅读 · 0 评论 -
51单片机——UART串口通讯-波特率4种模式可选1.0
#ifndef __UART_H__#define __UART_H__#include <reg52.h>sfr IPH_ =0xB7;//中断优先级高位寄存器sfr SADEN_ =0xB9;//从机地址掩码寄存器sfr SADDR_ =0xA9;//从机地址控制寄存器// bps4800 0输入// bps9600 1输入// bps19200 2输入// bps57600 3输入// bps115200 4输入//串口初始化装载,使用定时器1产.原创 2020-07-24 13:36:29 · 3106 阅读 · 2 评论 -
51单片机——LCD1602显示驱动-8080通讯(下)1.0
写的不知道好不好,有什么不对的地方还请指出,谢了。1、本节用到了上节8080通讯基本驱动。2、驱动LCD1602,代码9个:初始化LCD1602、显示屏开或关和光标设置、LCD1602地址指针的设置、数据指针的位置设置、清屏操作、LCD显示写1个字节数据、LCD写入16个字节数据、LCD显示n字节数据、外加测试代码。3、哪个复位LCD1602是看网上别人的代码,我看手册也没增清楚为何这样复位。4、另外测试代码太过于简单,我以后在写代码的话,我要在代码后面添加测试代码(我觉的这样好)。#原创 2020-07-19 09:53:12 · 919 阅读 · 1 评论 -
51单片机——LCD1602显示驱动-8080通讯(上)1.0
写的不知道好不好,有什么不对的地方还请指出,谢了。1、提到LCD1602就需要先知道ASCLL码,特别是'\0'的作用及使用。2、LCD1602驱动类似于因特尔8080通讯。3、LCD基本驱动接口有:写1字节指令、读1字节数据、写1字节数据、读取LCD1602状态。4、每次读写均要判断LCD1602的状态,不判断谁知道它处理之前的数据忙了没。#ifndef __LCD_H__#define __LCD_H__#include <reg52.h>sbit RS .原创 2020-07-19 09:26:31 · 1205 阅读 · 0 评论 -
51单片机——DS1302实时时钟驱动-SPI模拟通讯(下)1.0
写的不知道好不好,有什么不对的地方还请指出,谢了。1、本节基于DS1302-SPI接口驱动,需要用到上节SPI接口驱动。2、驱动DS1302,单独读写有14个接口,RTC突发模式读写,RAM突发模式读写。3、对于DS1302除去RAM,内部存储的是BCD码,不懂的可以自行学下。4、本驱动里含有接口:数据转换BCD码、BCD码转换数据、关闭写保护、打开写保护、写1字节命令和写数据、写1字节命令和读数据、7个日历独立的读写、7个日历连续读写、RAM连续读写。5、本DS1302驱动里,每次进行原创 2020-07-19 09:05:34 · 409 阅读 · 0 评论 -
51单片机——DS1302实时时钟驱动-SPI模拟通讯(上)1.0
写的不知道好不好,有什么不对的地方还请指出,谢了。1、SPI对于DS1302变相通讯,时钟上升沿从器件接收数据,时钟下降沿CPU发送数据。通讯均为先发送低位最后发送高位。2、SPI标准通讯有4种模式。3、SPI接口代码4个:启动信号、结束信号、写1字节、读1字节。#ifndef __SPI_H__#define __SPI_H__#include <reg52.h>sbit SCLK=P1^0;//时钟sbit IO = P1^1;//数据sbit CE =原创 2020-07-19 08:35:10 · 355 阅读 · 0 评论 -
51单片机——DS18B20温度传感器-1总线通讯1.0
写的不知道好不好,有什么不对的地方还请指出,谢了。1、本节基于DS18B20 1总线通讯。2、驱动DS18B20,代码3个:初始化DS18B20、写1字节、读1字节。3、运用DS18B20,接口有7个:读取ROM编码、配置高温报警低温报警及精度、温度转换、拷贝寄存器值到EEPROM、召回EEPROM值到寄存器里、读取DS18B20的状态(好像没有什么用)、读取DS18B20的温度(float类型,精度自行选择)。4、温度读取出来后用数码管来显示小数,目前数码管显示小数有点小问题。这个问题以后原创 2020-07-18 17:26:20 · 595 阅读 · 1 评论 -
51单片机——PCF8591_ADC_DAC驱动-模拟IIC通讯1.0
写的不知道好不好,有什么不对的地方还请指出,谢了。1、上节已经单独写好了IIC驱动代码,本次驱动PCF8591就直接拿来用了。2、首先,运用了go to语句,不知道如何使用的可自行学习。3、驱动PCF8591,接口代码3个:读取端口的数字信号、通过端口输出模拟量、PCF8591数字转模拟量算法函数。4、本代码里加入了判断通讯是否异常,感觉好啰嗦,应该单独写一个测试代码(测试代码以后在写),把正常通讯的精简一下。#ifndef __PCF8591_H__#define __PCF859原创 2020-07-18 16:45:46 · 2684 阅读 · 1 评论 -
51单片机——AT24C02_EEPROM驱动-模拟IIC通讯32页8字节缓存1.0
写的不知道好不好,有什么不对的地方还请指出,谢了。1、上节已经单独写好了IIC驱动代码,本次驱动AT24C02就直接拿来用了。2、首先,运用了go to语句,不知道如何使用的可自行学习。3、驱动AT24C02,接口代码5个:写1字节数据、读1字节数据、页写(1页16个字节)、页读(1字节,搭配for循环可以16个字节)、擦除EEPROM。4、本代码里加入了判断通讯是否异常,感觉好啰嗦,应该单独写一个测试代码(测试代码以后在写),把正常通讯的精简一下。#ifndef __AT24C02_原创 2020-07-18 16:18:51 · 414 阅读 · 2 评论 -
51单片机——STC89C52_模拟IIC通讯驱动1.0
写的不知道还不好,有什么不对的地方还请指出,谢了。1、对于IIC通讯,我觉的有2种通讯方案。 方案1:每次函数结束后未释放SDA线,且SCL=1; 方案2:每个函数结束后释放SDA线,且SCL=0; 本次采用方案1,方案2有时间在试试。2、对于IIC时序,也就6种:开始信号、结束信号、写1字节、读1字节、接收ACK、发送ACK/NO_ACK3、由于AT24C02IIC通讯时序很快,51单片机软件模式IIC时序速度慢,故,不用延迟就可以,在这里我均延迟了5us时间。...原创 2020-07-18 15:51:34 · 1463 阅读 · 0 评论 -
51单片机——8位数码管显示正整数和小数及解决鬼影问题1.0
写的不知道还不好,有什么不对的地方还请指出,谢了。正整数显示无异常,小数显示有点异常(小数会有精度问题,后面在处理,先给大家贴出来代码)。本次,使用了数组用来存放要显示的数值。用单独的数码管显示函数进行显示,之前把数码管显示函数放在数据处理里面了,那样会导致每次做无用的功。另外,为了显示的稳定性,加入了清除数码管显示,初始化数码管代码。最重要的是我解决了“鬼影问题”,我看别人写的数码管代码,大都是:送位选码——送段选码——延迟,然后下次循环。这样均有产生“鬼影问题”,问题就在代码流程原创 2020-07-18 15:36:38 · 2621 阅读 · 1 评论 -
51单片机——独立按键、矩阵按键多种方案1.0
写的不知道还不好,有什么不对的地方还请指出,谢了。对于独立按键,方法1是多次判断。方法2是利用了switch语句。对于矩阵按键,直接就采用了switch语句了。哪个计算器没有设计,等待后面闲着在整吧。//独立按键 S2 S3 S4 S5//分别对应 P30/TX P31/RX P32/INTO P33/INT1#include"key.h"#include "delay.h"//独立按键,函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5unsigne原创 2020-07-18 14:52:50 · 931 阅读 · 0 评论 -
51单片机——蜂鸣器按照次数响起1.0
写的不知道还不好,有什么不对的地方还请指出,谢了。本次使用了do while,听说比单独的while循环速度快,具体也不太清楚,就按照别人说的了。且蜂鸣器每次响1秒,响的次数可自定义最大1次循环255(因为定义的是unsigned char)#ifndef __BUZZER_H__#define __BUZZER_H__#include <reg52.h>sbit BU=P2^3;void buzzer(unsigned char x); //蜂鸣器响x次,1次循环最多原创 2020-07-18 14:36:36 · 4108 阅读 · 1 评论 -
51单片机——花样驱动LED灯1.0
不需要啰里啰唆了,别人的代码都在一个main()函数里面。在这里我直接使用模块化编程,有不懂模块化编程的可自行学习一下。也不啰里啰唆的写第一个点亮LED灯了。写的不知道还不好,有什么不对的地方还请指出,谢了。#ifndef __LED_H__#define __LED_H__#include <reg52.h>#define p1 P1sbit p1_0 = P1^0;void LED_ON(); //点亮8个LED灯常亮void LED_O原创 2020-07-18 14:04:33 · 683 阅读 · 0 评论 -
51单片机——delay软件延迟1.0
//软件延迟ms级别、us级别、5us#include <intrins.h>void delay_us(unsigned char us) //us级别延迟,最大输入255,us--1次用6.5us,进入1次函数需要11.95us{ while (us--);}void delay_ms(unsigned int ms) //设置毫秒级别延迟函数,z最大输入65535{ unsigned char x; for (ms; ms > 0; ms--) for (.原创 2020-07-18 13:41:21 · 3077 阅读 · 0 评论