国内老牌的网站制作,济南网站制作推广,哪个网站可以做汽车评估,信誉好的做pc端网站昨天周五没有学习#xff0c;因为中午没有睡觉#xff0c;下午和晚上挤不出整块的时间。周日有考试今天也没有学很多啊#xff0c;但以后周末会是学一天#xff0c;另一天休息和写周总结。
今天学了串口通信和LED点阵屏#xff0c;硬件原理是真的很迷#xff0c;一但想搞…昨天周五没有学习因为中午没有睡觉下午和晚上挤不出整块的时间。周日有考试今天也没有学很多啊但以后周末会是学一天另一天休息和写周总结。
今天学了串口通信和LED点阵屏硬件原理是真的很迷一但想搞的明白就学的很慢还怪焦虑的但是感觉知道那么回事就行主要还是记住要如何设置就行吧
串口通信
串口初始化的代码可以去软件里面生成但是注意中间的一些设置按照视频的设置实现不了看弹幕还是挺有用的。
串口为UART四种模式我们通常使用模式一SCON控制
这图是串口的工作原理一般带t的代表发送为transmit带r的代表接受为receive
SBUF是串口数据缓存寄存器 数据显示在软件中有两种显示模式HEX/文本。HEX是原始数据就是二进制十六进制之类的文本是asc编码
串口向电脑发送数据
#include REGX52.H
#include Delay.h
#include UART.h
unsigned char Sec;
void UART_Init(void) //4800bps11.0592MHz
{PCON 0x8F; //波特率不倍速SCON 0x40; //8位数据,可变波特率TMOD 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式TL1 0xFA; //设定定时初值TH1 0xFA; //设定定时器重装值ET1 0; //禁止定时器1中断TR1 1; //启动定时器1
}
/*** brief 串口发送一个字节数据* param Byte要发送的字节数据* retval */
void UART_SendByte(unsigned char Byte)
{SBUFByte;while(TI0);TI0;
}
void main()
{UART_Init();while(1){UART_SendByte(Sec);Sec;Delay(1000);}}
电脑通过串口控制LED
因为用到了中断系统所以在初始化要额外设置
#include REGX52.H
#include Delay.h
#include UART.h
#include REGX52.H
/*** brief 串口初始化* param * retval */
void UART_Init(void) //4800bps11.0592MHz
{PCON 0x8F; //波特率不倍速SCON 0x50; //8位数据,可变波特率TMOD 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式TL1 0xFA; //设定定时初值TH1 0xFA; //设定定时器重装值ET1 0; //禁止定时器1中断TR1 1; //启动定时器1EA1;ES1;
}
/*** brief 串口发送一个字节数据* param Byte要发送的字节数据* retval */
void UART_SendByte(unsigned char Byte)
{SBUFByte;while(TI0);TI0;//TI,RI需要软件置零
}
/*串口中断函数模板
void UART_Routine() interrupt 4
{if(RI1){RI0;}
}
*/unsigned char Sec;
void main()
{UART_Init();while(1){UART_SendByte(Sec);Sec;Delay(1000);}}
void UART_Routine() interrupt 4
{if(RI1){P2SBUF;UART_SendByte(SBUF);RI0;}
}
LED点阵屏 这是LED点阵屏的工作原理D端需要通过74H595写入
SER是要写入的数据 SRLCK 置一下沉一位 RCLK 当写满8位输出D端
SERByte(0x80i)用来将Byte的每一位取出
LED点阵屏显示图形
#include REGX52.H
#include Delay.h
sbit RCKP3^5;//RCLK
sbit SCKP3^6;//SRCLK
sbit SERP3^4;#define MATRIX_LED_PORT P0/*** brief 74HC595写入一个字节* param * retval */
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i0;i8;i){SERByte(0x80i);SCK1;SCK0;} RCK1;RCK0;
}
/*** brief LED点阵屏显示一列数据* param Column 0-7 0在最左边* param Data 00-FF* retval */
void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT~(0x80Column);Delay(1);MATRIX_LED_PORT0xFF;
}void main()
{SCK0;RCK0;while(1){MatrixLED_ShowColumn(0,0x00);MatrixLED_ShowColumn(1,0x00);MatrixLED_ShowColumn(2,0x01);MatrixLED_ShowColumn(3,0x02);MatrixLED_ShowColumn(4,0x1C);MatrixLED_ShowColumn(5,0x3E);MatrixLED_ShowColumn(6,0x7B);MatrixLED_ShowColumn(7,0x58);}}LED点阵屏显示动画
这个就是帧流动用循环实现点阵图有软件可以生成再就是注意边界了
#include REGX52.H
#include Delay.h
#include MatrixLED.h
unsigned char code Animation[]{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x10,0x10,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,0x10,0x1F,0x11,0x03,0x14,0x18,0x10,0x00,0x04,0xFC,0x04,0x80,0x64,0x1C,0x04,0x00,0x10,0x1F,0x10,0x00,0x00,0x10,0x1F,0x10,0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,0x00,0x10,0x1F,0x0C,0x03,0x00,0x10,0x1F,0x10,0x04,0xFC,0x04,0x00,0xE0,0x18,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
void main()
{ unsigned char i0,Offset0,Count0;MatrixLED_Init();while(1){for(i0;i8;i){MatrixLED_ShowColumn(i,Animation[iOffset]);}Count;if(Count10){Count0;Offset;if(Offset40){Offset0;}}}}累是必然的。