51單片機的串口通訊例程:51單片機的串口通訊例程詳情見附件
- // 采用查詢方式進行串口通訊的例子
- // 采用這種方式的弊端:
- // 1.如果對方沒有發送數據,則本機無限等待,而不能做其它事情
- // 2.如果對方發送數據而本機正做其它事情,那么有可能丟失數據。
- // 因此實際上串口接收常采用中斷方式,串口發送則不需要。
- #include <reg51.h>
- extern void serial_init(void);
- extern unsigned char getchar(void);
- extern void putchar(unsigned char ch);
- extern void puthex(unsigned char ch);
- void main(void)
- {
- unsigned char i;
- serial_init(); // 串口初始化
- do {
- i=getchar(); // 如果沒有收到串口數據則一直等待(查詢接收串口數據的弊端)
- ++i;
- --i; // 觀察斷點
- putchar(i); // 在串口顯示接收到的ASCII數據(就是把原來收到的數據再送回串口)
- putchar(' ');
- putchar(' ');
- putchar('0');
- putchar('x');
- puthex(i); // 在串口以十六進制格式顯示接收的ASCII數據
- putchar(' ');
- putchar(' ');
- ++i;
- --i; // 觀察斷點
- }while(1);
- }
復制代碼
- // 題目:串口初始化C代碼
- // 要求:
- // 1.波特率1200bps,無奇偶校驗,停止位1,數據位8
- // 2.定時器T1做波特率發生器
- // 軟件模擬測試說明:
- // 1.這個測試采用查詢方式進行串口通訊
- // 2.將軟件仿真環境的晶震設為11.0592 MHz
- // 3.軟件模擬全速運行, 觀察波特率是1200bps
- // 4.在串口1中輸入數字或字母,可觀察到通訊是否有誤。
- //#pragma src
- #include <reg51.h>
- //串口初始化
- void serial_init(void)
- {
- //ET1 = 0; //CLR 0ABH ;禁止T1中斷
- TMOD = 0x20; //MOV 89H,#20H ;timer 1 mode 2: 8-Bit reload(定時器T1 模式2: 8位自動初值重裝)
- TH1 = 0xE8; //MOV 8DH,#0E8H
- TL1 = 0xE8; //MOV 8BH,#0E8H ;1200bps, 11.059
- TR1 = 1; //SETB 8EH ;啟動定時器1
- SCON = 0x50; // mode 1: 10-bit UART, enable receiver(模式1: 10位異步發送/接收, 使能接收允許位)
- //SM1 = 1; // ;串行口 模式1
- //SM0 = 0;
- //REN = 1; // ;允許串行中斷接收
- SM2 = 1; //SETB O9DH ;收到有效的停止位時才將RI置1
- ES = 1; //SETB 0ACH ;允許串行中斷
- EA = 1; //SETB 0AFH ;總中斷開
- }
- //中斷方式處理串口數據
- void serial(void) interrupt 4 using 1
- {
- if(RI)
- {
- // RI = 0;
- // 串口接收, 采用臨時緩沖
- }
- #if 0
- if(TI)
- {
- // TI = 0;
- // 串口發送, 沒有必要使用中斷方式
- }
- #endif
- }
- // 查詢方式接收串口數據
- unsigned char getchar(void)
- {
- while(!RI);// 沒有收到串口數據則一直等待
- RI=0;
- return SBUF;
- }
- // 查詢方式發送串口數據
- void putchar(unsigned char ch)
- {
- SBUF=ch;
- while(!TI);
- TI=0;
- }
- code unsigned char HEX_TAB []="0123456789ABCDEF";
- void puthex(unsigned char ch)
- {
- unsigned char i,j;
- i=ch>>4;
- j=ch&0x0f;
- putchar(HEX_TAB[i]);
- putchar(HEX_TAB[j]);
- }
復制代碼
不錯!!!!!!!!!
感謝分享.....................
感謝分享!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{:13_780:}收下了,哈哈!~
{:13_1488:}為什么我就下不了呢!。。。
haohaomashangqukankan好號碼閃回去
hsy2966于2011-3-1 23:12補充以下內容:
#include<reg52.h>
typedef unsigned int uint16;
typedef unsigned char uint8;
void init()
{
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
TR1=1;
SCON=0X50;
ES=1;
EA=1;
}
void main()
{
init();
while(1);
}
void serial() interrupt 4
{ RI=0;
ACC=SBUF;
ES=0;
P1=0Xef;
SBUF=ACC;
while(TI==0);
TI=0;
ES=1;
}
hsy2966于2011-3-1 23:12補充以下內容:
#include<reg52.h>
typedef unsigned int uint16;
typedef unsigned char uint8;
void init()
{
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
TR1=1;
SCON=0X50;
ES=1;
EA=1;
}
void main()
{
init();
while(1);
}
void serial() interrupt 4
{ RI=0;
ACC=SBUF;
ES=0;
P1=0Xef;
SBUF=ACC;
while(TI==0);
TI=0;
ES=1;
}
還在學習中,謝謝樓主了