1、先擺上我所使用的C51單片機(jī)開(kāi)發(fā)板的原理圖
c51串口的硬件電路
?單片機(jī)的最小系統(tǒng)
?????????假如說(shuō)電路板上沒(méi)有CH340芯片,我們就要使用TTL轉(zhuǎn)USB模塊來(lái)進(jìn)行電平的轉(zhuǎn)換,然后將模塊的RX接單片機(jī)的TX,模塊的TX接單片機(jī)的RX,來(lái)進(jìn)行接線連接。
?????????在連接好連線后,我們打開(kāi)計(jì)算機(jī)管理,來(lái)查看端口是否存在,如果沒(méi)有,我們需要下載CH340驅(qū)動(dòng),驅(qū)動(dòng)的鏈接在下面
https://download.csdn.net/download/qq_27699199/87017256
?安裝后就可以識(shí)別了;;;;常見(jiàn)的失敗的原因,需要檢查自己的usb線是否帶數(shù)據(jù)傳送的功能,有些時(shí)候我們使用的usb線只有電源充電的功能,而沒(méi)有通信的功能?。。?!血的教訓(xùn)
以上是我們的前期的硬件和軟件準(zhǔn)備
?2、keil軟件的講解
我將關(guān)于串口的程序放在了uart.c文件中了
?該C文件中的uart初始化函數(shù)
/*******************************************************************************
* 函 數(shù) 名 : uart_init
* 函數(shù)功能 : 串口通信中斷配置函數(shù),通過(guò)設(shè)置TH和TL即可確定定時(shí)時(shí)間
* 輸 入 : baud:波特率對(duì)應(yīng)的TH、TL裝載值
* 輸 出 : 無(wú)
*******************************************************************************/
void uart_init(u8 baud)
{
SCON=0X50; //設(shè)置為工作方式1
TMOD|=0X20; //設(shè)置計(jì)數(shù)器工作方式2
PCON=0X80; //波特率加倍
TH1=RELOAD_COUNT; //計(jì)數(shù)器初始值設(shè)置
TL1=TH1;
ES=1; //關(guān)閉接收中斷
EA=1; //打開(kāi)總中斷
TR1=1; //打開(kāi)計(jì)數(shù)器
TI=1; //發(fā)送中斷標(biāo)記位,如果使用printf函數(shù)的必須設(shè)置
}
下面是芯片手冊(cè)中對(duì)于? 串行口控制寄存器SCON 和? 電源控制寄存器PCON寄存器的介紹,這里使用? |=? 是為了不改變除了我們?cè)O(shè)置的位之外的其他的數(shù)據(jù)位,我們代碼實(shí)際上是設(shè)置了8位UART波特率可變。
---------------------------------------------------------------------------------------分割線--------------------------
通過(guò)設(shè)置TH1和TL1的值來(lái)設(shè)置串口的波特率,TH1和TL1填一樣的值
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-434840.html
?設(shè)置定時(shí)器1的計(jì)數(shù)值,按下表的預(yù)先值設(shè)置
?
3、printf的重定向
直接上代碼:
注意,printf的重寫(xiě)需要增加#include <stdio.h>的頭文件
寫(xiě)發(fā)送一個(gè)字節(jié)函數(shù)
//串口發(fā)送一個(gè)字節(jié)數(shù)據(jù)
void UART_Send(unsigned char Byte)
{
SBUF=Byte;
while(TI==0); //TI:串口1發(fā)送完成中斷請(qǐng)求標(biāo)志。需要軟件清零。
TI=0;
}
puchar重寫(xiě)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-434840.html
//重定向printf
char putchar(char c)
{
UART_Send(c);
//TX1_write2buff(c);
return c;
}
之后就可以使用printf來(lái)使用串口了
printf具體的打印格式為
數(shù)據(jù)類型 | 打印格式 |
u8 | %d |
s8 | %d |
u16 | %d or %hu |
s16 | %d or %hd |
u32 | %u |
s32 | %d |
u64 | %llu |
s64 | %lld |
int | %d |
unsigned int | %u |
short int | %d or %hd |
long | %ld |
unsigned long | %lu |
long long | %lld |
unsigned long long | %llu |
char | %c |
char * | %s |
bool (#define stdbool.h) | %d |
unsigned int/int------>十六進(jìn)制 | %0x |
unsigned long/long---->十六進(jìn)制 | %0lx |
long long/unsigned long long ----->十六進(jìn)制 | %0llx |
unsigned int/int------>八進(jìn)制 | %0o |
unsigned long/long---->八進(jìn)制 | %0lo |
long long/unsigned long long ----->八進(jìn)制 | %0llo |
float | %f |
double | %f or %lf |
科學(xué)技術(shù)類型(必須轉(zhuǎn)化為double類型) | %e |
限制輸出字段寬度 | %x.yf (x:整數(shù)長(zhǎng)度,y:小數(shù)點(diǎn)長(zhǎng)度) |
到了這里,關(guān)于C51單片機(jī)串口發(fā)送數(shù)據(jù)的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!