
51单片机
生而无知,生而有涯
lll_lll_|||
生于尘世间 天地一过客 故事留给后人看
展开
-
PCA9536——填坑
0.问题使用PCA9536输出模式控制4个小灯,开始时候按几次就不显示了,以为是接线不稳定原因。后来一按开机电源就不显示了,以为是其他器件电源不稳定导致。1.问题1排除接线问题,重新接线,重新做端子,没有解决,可以排除是接线问题。2.问题2排除有一个电源器件,去掉之后发现不影响小灯。可以确定是电源问题。怀疑是接上这个器件之后整体功率过高,导致PCA9536提供功率不够,相当于断电,但是直接断电重启不影响。3.分析原因为何直接切断机器电源重启小灯就...原创 2021-05-11 18:46:13 · 841 阅读 · 1 评论 -
24c64——填坑
1.地址16位,不是24c02这样的8位因此在写地址的时候2.延时5ms在写数据完成之后,需要间隔5ms才能正确读数据如上图最后一行的5ms延时,否则无法正确读写!!!!原创 2021-05-08 17:43:41 · 1311 阅读 · 0 评论 -
机械按键——长按短按、长短一起按,先短后长先长后短,三个键一起按——位操作
1.按键优化上个使用三行代码的按键一次只能按一个键,按下一个键再按另一个键会被阻塞掉,因此可能导致整个系统被阻塞,因此这里重新用了一种位操作来保存按键值。上一个项目代码连接:51单片机——按键,定时器消抖,短按,长按,三行代码,状态机2.代码变化按键识别上,从一次识别一个按键到三个按键并行识别。原来的代码只能识别是那个键按下,不能识别清楚哪个键弹起,可能我按下一个键同时按下另一个键再释放,就无法识别释放的是哪个按键。现在的代码,三个按键哪个按下哪个释放都能清楚识别。现在代码如..原创 2021-05-11 14:57:18 · 1291 阅读 · 3 评论 -
C语言Sprintf用法
如图,两种简单用法#include <iostream>#include<stdio.h>// 程序的主函数int main(){ char a[20]; a[0] = 'p'; a[1] = 't'; sprintf(&a[2],"%3s","asd"); sprintf(&a[5],"kjl"); for (int i = 0; i < 10; i++) { print.原创 2021-07-02 09:10:44 · 356 阅读 · 0 评论 -
串口打印小数
一般串口是打印一个8位字符,或者打印一个数组,如果要打印小数,就要用到格式化输出,把小数格式化输出到数组里面。 u8 a[10], b[10]; co2 = 1.001; tvoc = 2.001; sprintf(&a[0], "%1.3f\r\n", co2); sprintf(&b[0], "%1.3f\r\n", tvoc); PutString(a, 7); PutString(b, 7);...原创 2021-07-23 14:59:45 · 1859 阅读 · 0 评论 -
51单片机——串口1通信
mark#include <STC15.H> //52头文件#include <UART.H>bit busy1;/*-------------------------------------------串口1初始化----------------------------------------------*/void Uart1Init(void){ PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据.原创 2021-06-25 17:52:44 · 712 阅读 · 0 评论 -
51单片机——串口2通信
mark#include <STC15.H> //52头文件#include <UART2.H>#define S2RI 0x01 //S2CON.0#define S2TI 0x02 //S2CON.1bit busy2;u8 Uart2_RecvBuf[30] = {0}; //串口数据缓存u8 uart2Index = 0; //绶存指针u8 uart2RXEnd = 0;u8 Uart2RXLength = 0;/*-.原创 2021-06-25 13:34:44 · 3092 阅读 · 0 评论 -
Keil c51编译提示 code space memory overlap
原因是中断号重复原创 2021-06-24 16:53:05 · 2380 阅读 · 0 评论 -
51单片机——串口3通信
不多说,直接上代码,参考STC15中文官方文档配置寄存器本文作为实验,不考虑安全性,没有对全局变量封装#include <DisPlay.H> //屏幕通信专用 串口3 9600//RX3-P0.0 TX3-P0.1#define S3RI 0x01 //S3CON.0#define S3TI 0x02 //S3CON.1#define S3_S0 0x02 //P_SW2.1bit busy;u8 Uart3_RecvBuf[30] = {0}; //串口.原创 2021-06-24 15:15:21 · 1192 阅读 · 2 评论 -
51单片机——定时器0使用
void Timer2Init(void) //1ms @11.0592MHz{ AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0xCD; //设置定时初值 TH0 = 0xD4; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET...原创 2021-06-02 16:33:12 · 3565 阅读 · 3 评论 -
51单片机——增强型PWM,使用自带PWM发生器
0.序之前用定时器做了模拟PWM输出,得到的1k左右波形还行,到10k往上波形就特别难看,又是跳变又是长短不一。后来在参考手册上面看到stc15w4k原创 2021-06-02 15:41:13 · 3291 阅读 · 9 评论 -
keil 编译提示 requires ANSI-style prototype
昨晚遇到过,解决了,睡了一觉醒来又忘了。。特此记录。他的头文件定义,但是初始化函数可以用。while循环里面不能用,仔细一看气死人,原来是自己定义错了,别说Keil罢工,路径都错了搁我也不认识。。。。再遇同样的问题请大家把我捶死...原创 2021-03-22 08:49:27 · 27442 阅读 · 9 评论 -
51单片机——中断系统
0.中断号1.应用串口、定时器2.分析占坑原创 2021-03-20 09:01:45 · 217 阅读 · 0 评论 -
51单片机——读写AT24c64
0.序从stm32上移植下来的代码,改了间隔时间,证明本代码可移植性很强。注意自己的单片机型号,修改间隔时间以正确读写。该代码,适用于AT24C64所有场合,STM32、51都适用。51型号 :STC15W4K32S4存储器:AT24C64 (好像看到说,24c64和24c02不一样,02地址是8位,64地址是16位,所以64不能直接用02的代码)不要设置开漏模式,使用默认的准双向口,代码内容应该是有了读后写操作,所以设置开漏反而无法读写,我在这里卡了2小时。1.注意延时,...原创 2021-03-19 18:19:06 · 8266 阅读 · 2 评论 -
51单片机——按键,定时器消抖,短按,长按,三行代码,状态机
0.序今天太晚了,先不写介绍了,代码中注释非常详细,很方便移植1.分析占坑,有时间再截图分析2.代码#include <KEY.H>// 按键 Key0-P4.6 Key1-P3.6 Key2-P3.5sbit key0=P4^6;sbit key1=P3^6;sbit key2=P3^5;u16 ul_ms=0; //在定时器中++u8 uc_Key_flag = 0; //在定时器中每10ms置1,定时器延时u8 keyPressFlag...原创 2021-03-17 21:14:04 · 9996 阅读 · 8 评论 -
51单片机——IO口工作模式及配置
1.四种模式如图,四种模式,此为P2和P4,其他IO口一样2.配置从上面的图可看出,若配置为推挽模式,需要M1=0,M0=1。因此通过移位操作将下图P2.2和P2.3配置为推挽模式void ledInit(void){ P2M1 &= 0<<2; //p22 P2M1 &= 0<<3; //p23 P2M0 |= 1<<2; P2M0 |= 1<<3;}...原创 2021-03-16 14:28:35 · 16123 阅读 · 7 评论 -
51单片机——定时器2使用
代码比较简单,但是有时候配置可能就忘了,这里记录下,方便下次使用注意配置特殊寄存器时候使用 |与符号,不要直接等于来赋值,否则会影响其他定时器的配置#include <Interrupt.H>#include <STC15.H>#include <LED.H>u16 counter2=0; //定时器2计数器/*------------------------------定时器2-------------------------------*/..原创 2021-03-16 11:12:14 · 6006 阅读 · 2 评论 -
51单片机——串口1收发
1.修改参考网上代码,发现无法运行,于是修改修改串口初始化,不加这几个没法接收 TI=0; RI=0; REN=1; //不开启这个无法接受数据 //PS=1; //提高串口中断优先级 ES=1; //开启串口中断使能 EA=1;2.问题修改后发现有不合理的地方,待后期修改,如下图,应该接收超时然后返回0,但是返回0之后就错了,如果不从这里跳出函数,会发现是1个字1个字接收,无法正常收发3.代码本文参考的代码非常好,...原创 2021-03-16 11:01:26 · 3214 阅读 · 0 评论 -
51单片机——串口1简单通信
1.串口怎么用2.设置工作方式一般使用工作方式2TMOD寄存器使用从高位到低位,选择方式2,M1M0为1/0,即值为,TMOD值为0x203.波特率设置使用STC-ISP自带的波特率计算器4.开启串口、开启中断5.写中断服务清除标志位6.写发送函数串口一次只能发一个字节,也就是8位,发完才能开始下一个,因此写一个发送字符串的函数调用发送字节的函数即可7.代码如下#include <STC15.H>#in...原创 2021-03-11 17:22:35 · 1924 阅读 · 0 评论 -
51单片机—— PWM、呼吸灯
小灯的有效显示应该是50hz,所以周期是20ms#include <STC15.H> //52头文件 u8 Tcount, dutyfactor, direct; //一个PWM周期内的:周期计数,占空比,方向sbit LED = P2^2; //位定义,led灯引脚sbit LED2 = P2^3;void InterruptInit(); //中断初始化配置的函数声明void Time0(); //定时器0中断的函数声明void breat.原创 2021-03-11 16:37:25 · 7249 阅读 · 3 评论