制作出來的實物圖如下:
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- unsigned char key_s, key_v, tmp;
- char code str[] = "I love zhu xiao ying--CUMT \n\r";
- void send_int(void);
- 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()
- {
- send_int();
- TR1 = 1; // 啟動定時器1
- 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); // 回傳接收到的數據
- }
- }
- }
- void send_int(void)
- { TMOD = 0x20; // 定時器1工作于8位自動重載模式, 用于產生波特率
- TH1 = 0xF3; // 波特率2400
- TL1 = 0xF3;
- SCON = 0x50; // 設定串行口工作方式
- PCON&= 0xef; // 波特率不倍增
-
- IE = 0x0; // 禁止任何中斷
- }
- bit scan_key()
- // 掃描按鍵
- {
- key_s = 0x00;
- key_s |= K1;
- return(key_s ^ key_v);
- }
- void proc_key()
- // 鍵處理
- {
- if((key_v & 0x01) == 0)
- { // K1按下
- send_str(); // 傳送字串
- }
- }
- 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++);
- }
- }
復制代碼
所有資料51hei提供下載:
一步一步教你51_PC串口通信.rar
(65.27 KB, 下載次數: 11)
2018-11-16 14:56 上傳
點擊文件名下載附件
|