1樓:杜哥是個小天才
#include
#include
unsigned char key_s, key_v, tmp;
char code str = "welcome! www.willar.com \n\r";
void send_str();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
void send_char(unsigned char txd);
sbit k1 = p1^4;
main()
tmod = 0x20; // 定時器1工作於8位自動過載模式, 用於產生波特率
th1 = 0xfd; // 波特率9600
tl1 = 0xfd;
scon = 0x50; // 設定序列口工作方式
pcon &= 0xef; // 波特率不倍增
tr1 = 1; // 啟動定時器1
ie = 0x0; // 禁止任何中斷
while(1)
if(scan_key()) // 掃描按鍵
delayms(10); // 延時去抖動
if(scan_key()) // 再次掃描
key_v = key_s; // 儲存鍵值
proc_key(); // 鍵處理
if(ri) // 是否有資料到來
ri = 0;
tmp = sbuf; // 暫存接收到的資料
p0 = tmp; // 資料傳送到p0口
send_char(tmp); // 回傳接收到的資料
}bit scan_key()
// 掃描按鍵
key_s = 0x00;
key_s |= k1;
return(key_s ^ key_v);
}void proc_key()
// 鍵處理
if((key_v & 0x01) == 0)
void send_char(unsigned char txd)
// 傳送一個字元
sbuf = txd;
while(!ti); // 等特資料傳送
ti = 0; // 清除資料傳送標誌
}void send_str()
// 傳送字串
unsigned char i = 0;
while(str[i] != '\0')
sbuf = str[i];
while(!ti); // 等特資料傳送
ti = 0; // 清除資料傳送標誌
i++; // 下一個字元
void delayms(unsigned char ms)
// 延時子程式
unsigned char i;
while(ms--)
for(i = 0; i < 120; i++);
拓展資料
c語言是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。
儘管c語言提供了許多低階處理的功能,但仍然保持著良好跨平臺的特性,以一個標準規格寫出的c語言程式可在許多電腦平臺上進行編譯,甚至包含一些嵌入式處理器(微控制器或稱mcu)以及超級電腦等作業平臺。
二十世紀八十年代,為了避免各開發廠商用的c語言語法產生差異,由美國國家標準局為c語言制定了一套完整的美國國家標準語法,稱為ansi c,作為c語言最初的標準。目前2023年12月8日,國際標準化組織(iso)和國際電工委員會(iec)釋出的c11標準是c語言的第三個官方標準,也是c語言的最新標準,該標準更好的支援了漢字函式名和漢字識別符號,一定程度上實現了漢字程式設計。
2樓:
首先是把資料傳送出去,傳送資料協議是自己定義的,一個資料頭2個位元組,20個位元組資料位,2個位元組crc校驗位,每個資料共24位元組的資料。
temp = temp ^ 0x11021
if ((*ptr & i) != 0)
temp = temp ^ (0x10000 ^ 0x11021);
}ptr++;
}crc = temp;
dword dwwrittenlen = 0;
printf("main baseline往串列埠傳送資料成功!");
/***********關閉串列埠***********/
closehandle(hcom);}
資料傳送成功,主要是接收的程式除錯了很久,一開始也是打算一個資料24個位元組24個位元組來迴圈接收,但是每組資料會在固定的第10-13個位元組出錯。
//設定讀超時
timeouts.readintervaltimeout = 1000;
timeouts.readtotaltimeoutmultiplier = 500;
timeouts.readtotaltimeoutconstant = 5000;
//設定寫超時
timeouts.writetotaltimeoutmultiplier = 500;
timeouts.writetotaltimeoutconstant = 2000;
設定超時
dcb dcb1;
getcommstate(hcom1, &dcb1);
dcb1.baudrate = 115200;//波特率為9600
dcb1.bytesize = 8;//每個位元組有8位
dcb1.parity = noparity;//無奇偶校驗位
dcb1.stopbits = twostopbits;//兩個停止位
//dcb1.fparity = false;
//dcb1.fnull = false;
setcommstate(hcom1, &dcb1);
dword wcount=8;//讀取的位元組數
fclose(fp1);
}closehandle(hcom1);
}最後 就是將傳送的資料和接收的資料放到txt檔案裡進行了比對,完全沒有問題。
3樓:匿名使用者
以下是我剛改的程式編譯成功了
請參考#include"reg51.h"
//定義全域性變數
unsigned char data_10[10]=;
unsigned char time_50ms,count;
bit flag=0;
bit data_flag=0;
函式名:uart串列埠初始化函式
調 用:uart_init();
參 數:無
返回值:無
結 果:啟動uart串列埠接收中斷,允許串列埠接收,啟動t/c1產生波特率(佔用)
備 注:振盪晶體為12mhz,pc串列埠端設定 [ 4800,8,無,1,無 ]
void uart_init (void)
函式名:uart串列埠接收中斷處理函式
調 用:[sbuf收到資料後中斷處理]
參 數:無
返回值:無
結 果:uart串列埠接收到資料時產生中斷,使用者對資料進行處理(併傳送回去)
備 注:過長的處理程式會影響後面資料的接收
void uart_r (void) interrupt 4 using 1
if(flag)
函式名:定時/計數器初始化函式
調 用:t_c_init();
參 數:無
返回值:無
結 果:設定sfr中t/c1和(或)t/c0相關引數
備 注:本函式控制t/c1和t/c0,不需要使用的部分可用//遮蔽
void t_c_init (void)
函式名:定時/計數器0中斷處理函式
調 用:[t/c0溢位後中斷處理]
參 數:無
返回值:無
結 果:重新寫入16位計數暫存器初始值,處理使用者程式
備 注:必須允許中斷並啟動t/c本函式方可有效,重新寫入初值需和t_c_init函式一致
void t_c0 (void) interrupt 1 using 1
main()
希望能解決您的問題。
編寫微控制器串列埠收發資料的完整程式(c語言編寫)
4樓:驚鴻
我用的新唐晶片,8051核心,跟51差不多,望採納
void uart_initial (void)
以上是初始化的
void send_data_to_uart1(uint8 c)
void uart_isr (void) interrupt 4 //序列中斷服務程式
else if(receive_date_size > 0 && receive_date_size < 4)
else if(receive_date[c] == last_date && receive_date_size ==4)
else}}接收
C語言中如何實現多組資料輸入輸出
c語言中有一個 標準輸入函式,即 scanf函式,它可以讀取輸入的任意格式版型別的資料。scanf函式也有返 權回值,返回型別為int型別,它返回成功讀入的專案的個數。如果它沒有讀取任何專案 當它期望一個數字而您卻鍵入了一個非數字字串時就會發生這種情況,scanf 會返回0。當它檢測到 檔案結尾 e...
c語言實現的雙向連結串列插入程式,C語言實現的雙向連結串列插入程式
雙向連結串列 include include typedef struct node node node create list int j node head,p1,p2 p2 head node malloc sizeof node head i a 0 head next head prior...
如何用c語言實現多組資料輸入,每組資料一行每行資料個數任意
程式要求是首先輸入一個數字確認行數,然後在每一行輸入一組整數 長度是由輸入者輸入的數字個數決定 我想用二維陣列鍵入,這一部分的 如下 演算法競賽題目中,由於重定向,最後將會出現eof,而eof標誌著輸入的結束。為了利用eof,演算法競賽選手無需考慮到底是什麼東西 事實上,很多演算法選手到今天甚至不知...