欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機_STC89C52_AT89S52_模擬串口收發(fā)數(shù)據(jù)程序(半雙工)
[打印本頁]
作者:
shushikuan
時間:
2021-6-8 17:12
標題:
51單片機_STC89C52_AT89S52_模擬串口收發(fā)數(shù)據(jù)程序(半雙工)
本程序?qū)崿F(xiàn)51單片機如STC89C52、AT89S52等單機模擬串口半雙工收發(fā)數(shù)據(jù),即接收數(shù)據(jù)時不能發(fā)送數(shù)據(jù),發(fā)送數(shù)據(jù)時不能接收數(shù)據(jù)。
占用系統(tǒng)資源定時器1或定時器2、外部中斷1。
當使用定時器1時,波特率固定為4800bps;當使用定時器2時,波特率在300~4800bps之間可調(diào)。
01.png
(47.98 KB, 下載次數(shù): 73)
下載附件
2021-6-8 17:08 上傳
02.png
(41.2 KB, 下載次數(shù): 54)
下載附件
2021-6-8 17:08 上傳
單片機源程序如下:
/************************************************************
* 名稱: 51單片機模擬半雙工串口收發(fā)數(shù)據(jù)
* CPU : STC89C52 @ 11.0592MHz
* IDE : KeilC51 UV4
* 作者 : 舒世寬
* 日期 : 2021-06-08
************************************************************/
#include "at89x52.h"
#define BAUD (4800) //波特率范圍 300 ~ 4800
#define FOSC (11059200UL) //晶振頻率
#define TMR_VAL (65536UL-FOSC/12/BAUD)
#define MYUART_TX_PIN P2_3 //可定義為除P3_3外的任意引腳
#define MYUART_RX_PIN P3_3 //因為使用了外部中斷,所以必須為P3_3
#define MYUART_RX_BUF_LEN 20 //接收緩沖區(qū)長度
#define MYUART_RX_LED P1_0 //接收數(shù)據(jù)指示燈
#define MYUART_TX_LED P1_1 //發(fā)送數(shù)據(jù)指示燈
bit MYUART_TX_FLAG = 0; //發(fā)送模式
bit MYUART_RX_FLAG = 0; //接收模式
bit MYUART_TX_BYTE_DONE = 0; //發(fā)送完成一個字節(jié)
unsigned char sbufdata = 0;
unsigned char data_bit_i = 0;
unsigned char byte_i= 0;
unsigned char myuart_rxbuf[MYUART_RX_BUF_LEN] = {0};
void delay()
{
unsigned int i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
void myuart_init_time()
{
T2MOD = 0; //默認值
T2CON = 0; //默認為16位自動重裝定時器
RCAP2L = TL2 = TMR_VAL; //設置定時初值低字節(jié)
RCAP2H = TH2 = TMR_VAL>>8; //設置定時初值高字節(jié)
TF2 = 0; //清除TF2標志
TR2 = 1; //定時器2停止計時
ET2 = 1; //允許定時器2中斷
}
void myuart_init_recv()
{
//初始化外部中斷1
IT1 = 1; // 1 --- 下降沿觸發(fā), 0 --- 低電平持續(xù)觸發(fā)
EX1 = 1; // 開啟外部中斷1
}
//外部中斷1處理程序
void isr_ext1(void) interrupt 2
{
unsigned char i;
if(MYUART_RX_PIN == 0)
{
for(i = 0;i<5;i++); //延時,軟件濾波
if(MYUART_RX_PIN == 0)
{
EX1 = 0; //禁止外部分中斷1
MYUART_RX_FLAG = 1;
sbufdata = 0;
data_bit_i = 0;
myuart_init_time();
}
}
}
void isr_timer2(void) interrupt 5
{
unsigned char tmp;
TF2 = 0; //定時器2中斷標志必須由軟件清零
//接收
if(MYUART_RX_FLAG == 1)
{
MYUART_RX_PIN = 1; //先置位,再讀取數(shù)據(jù)
if(data_bit_i < 8){
if(1==MYUART_RX_PIN)sbufdata |= 1<<data_bit_i;
data_bit_i++;
MYUART_RX_LED = 0;
}else if(data_bit_i == 8 && MYUART_RX_PIN == 1){
myuart_rxbuf[byte_i++]=sbufdata;
byte_i %= MYUART_RX_BUF_LEN; //防止溢出接收緩沖區(qū)
TR2 = 0; //關閉定時器2
EX1 = 1; //允許外部分中斷1
MYUART_RX_LED = 1;
MYUART_RX_FLAG = 0; //接收結(jié)束
MYUART_RX_PIN = 1; //置位,準備后面數(shù)據(jù)接收
}else{
TR2 = 0; //關閉定時器2
EX1 = 1; //允許外部分中斷1
MYUART_RX_LED = 1;
MYUART_RX_FLAG = 0; //接收結(jié)束
MYUART_RX_PIN = 1; //置位,準備后面數(shù)據(jù)接收
}
}
//發(fā)送
if(MYUART_TX_FLAG == 1)
{
if(data_bit_i ==0){
MYUART_TX_PIN = 0; //拉低,發(fā)送起始位
MYUART_TX_LED = 0;
}else if(data_bit_i < 9){
tmp = sbufdata & (1<<(data_bit_i-1));//先發(fā)送低位再發(fā)送高位
if(tmp == 0)
MYUART_TX_PIN = 0;
else
MYUART_TX_PIN = 1;
}else if(data_bit_i < 12){ //連續(xù)3個停止位的時間
MYUART_TX_PIN = 1; //拉高,發(fā)送停止位
}else{
TR2 = 0;
RCAP2L = TL2 = TMR_VAL; //設置定時初值低字節(jié)
RCAP2H = TH2 = TMR_VAL>>8; //設置定時初值高字節(jié)
MYUART_TX_BYTE_DONE = 1; // 發(fā)送完成一個字節(jié)
MYUART_TX_LED = 1;
MYUART_TX_PIN = 1; //拉高,準備后面數(shù)據(jù)發(fā)送
}
data_bit_i++;
}
}
void myuart_write_byte(unsigned char dat)
{
data_bit_i = 0;
sbufdata = dat;
TR2 = 1; //啟動定時器
MYUART_TX_BYTE_DONE = 0;
while(MYUART_TX_BYTE_DONE==0);
}
void myuartSendString(char * pstr)
{
if(*pstr)
{
MYUART_TX_FLAG = 1;
myuart_init_time();
while(*pstr)
{
myuart_write_byte(*pstr++);
}
MYUART_TX_FLAG = 0;
}
}
void myuartSendBuffer(unsigned char * pbuf,unsigned char len)
{
unsigned char i;
if(len>0)
{
MYUART_TX_FLAG = 1;
myuart_init_time();
for(i=0;i<len;i++)myuart_write_byte(pbuf[i]);
MYUART_TX_FLAG = 0;
}
}
void main(void)
{
int a,b,i;
MYUART_TX_PIN = 1;
MYUART_RX_PIN = 1;
EA = 1; //開啟全局中斷
myuart_init_recv(); //串口接收初始化
while(1){
delay();a = byte_i;
delay();b = byte_i;
if(a==b && a>0)
{
myuartSendBuffer(myuart_rxbuf,byte_i);
for(i=0;i<MYUART_RX_BUF_LEN;i++)myuart_rxbuf[i] = 0;
a=0;b=0;byte_i=0;
}
//myuartSendString("my uart demo test! shushikuan@163.com 12345 ok!!!!"); //50個字符
//myuartSendString("my uart demo test ok");
}
}
復制代碼
以上代碼51hei下載地址:
simuart.7z
(24.9 KB, 下載次數(shù): 41)
2021-6-8 19:23 上傳
點擊文件名下載附件
51單片機_STC89C52_AT89S52_模擬串口收發(fā)數(shù)據(jù)(半雙工)
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1