簡單上下位機通信_C版
單片機源程序如下:
- /**********************
- 文件名稱:uart.c
- 作者:甘祥
- 說明:串口通信例程測試
- 修改記錄:
- ***********************/
- /**********************
- 基于STC15F2K60S2系列單片機C語言編程實現
- 使用如下頭文件
- ***********************/
- #include "STC15F2K60S2.h"
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define Machine_Focs 11059200L //晶振頻率
- #define BAUD1 9600 //波特率
- #define NMAX_KEY 100 //按鍵抖動次數
- sbit Key1 = P3^2 ; //啟動發送
- sbit Key2 = P3^3 ; //數字減少
- sbit Key3 = P1^7 ; //數字增加
- sbit LED_SEL=P2^3;
- uchar G_count;
- uchar display; //顯示發送數據
- uint Key1_count; //按鍵1計數
- uint Key2_count; //按鍵2計數
- uint Key3_count; //按鍵3計數
- uint Key_count; //按鍵總的抖動次數
- bit flg_1ms; //1ms的標志
- bit Key1_C;/*key1當前的狀態*/
- bit Key1_P;/*key1前一個狀態*/
- bit Key2_C;/*key2當前的狀態*/
- bit Key2_P;/*key2前一個狀態*/
- bit Key3_C;/*key3當前的狀態*/
- bit Key3_P;/*key3前一個狀態*/
- /*收發顯示數據相關*/
- bit Uart1_Sendbusy = 0 ;
- unsigned char display,flag;
- uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //顯示0-f
- /**********************
- 函數名稱:Timer0
- 功能描述:定時器0的中斷響應函數 ,定時100us
- ***********************/
- void Timer0() interrupt 1
- {
- TH0=(65535-1000)/256; //定時器初始值
- TL0=(65535-1000)%256;
- G_count++;
- if(G_count==10) //中斷10次對應1ms
- {
- G_count=0;
- flg_1ms=1;
- }
- flag++;
- if(flag==2)
- flag=0;
- P0=0;
- switch(flag)
- {
- case 0: P2=0x00;P0=duanxuan[display/16];break;
- case 1: P2=0x01;P0=duanxuan[display%16];break;
- }
- }
- /****************************************************************************
- *Uart1_Init()
- *初始化串口1的相關設置,設定串口的波特率等
- ***************************************************************/
- void Uart1_Init(void)
- {
- AUXR=0X80; //輔助寄存器 此時定時器0的速度是傳統的12倍,不分頻
- SCON|=0X50; //允許接收
- TL1=(65536-(Machine_Focs/4/BAUD1));
- TH1=(65536-(Machine_Focs/4/BAUD1))>>8;
- AUXR|=0X40; //輔助寄存器 此時定時器1的速度是傳統的12倍,不分頻
- RI=0; //接收中斷標志位
- TI=0; //發送中斷標志位
- TR1=1; //啟動定時器1
- ES=1; //串口中斷允許位
- EA=1; //總中斷允許位
- PS = 1 ; //串口1中斷高優先級
- }
- /*****************************************************************************
- *SendComData(INT8U)
- *發送單個字符給UART1以發送到PC機
- *如果需要奇偶校驗則此處需要修改
- *入口參數:dat,需要發送的八位數據
- ******************************************/
- void SendData(unsigned char dat)
- {
- while(Uart1_Sendbusy);
- Uart1_Sendbusy=1;
- SBUF=dat;
- }
- /********************************************************************************************
- *Uart1()
- *串口1中斷服務程序
- */
- void Uart1_fun() interrupt 4 using 1
- {
- if(RI) //接受完數據后 RI自動制1
- {
- RI=0;
- display=SBUF;
- }
-
- if(TI) //發送完數據后 RI自動制1
- {
- TI=0;
- Uart1_Sendbusy=0;
- }
- }
- /**********************
- 函數名稱:Init
- 功能描述:完成各部分功能模塊的初始化
- 入口參數:無
- 出口參數:無
- 備注:
- ***********************/
- void Init()
- {
- /************* **系統初始化 *******************/
- //推挽模式
- P3M0=0x00;
- P3M1=0x00;
- P2M0=0xff;
- P2M1=0x00;
- P0M0=0xff;
- P0M1=0x00;
- TMOD=0x01;//定時器0,方式1
- ET0=1;//開啟定時器中斷
- TH0=(65535-1000)/256;
- TL0=(65535-1000)%256;
- TR0=1;//啟動定時器
- Uart1_Init(); //外部中斷:低優先級
- display = 0x00;
- LED_SEL=0;
- flg_1ms=0;
- /*初始化所有按鍵的當前狀態、前一個狀態*/
- Key1_C=1;/*key1當前的狀態*/
- Key1_P=1;/*key1前一個狀態*/
- Key2_C=1;/*key2當前的狀態*/
- Key2_P=1;/*key2前一個狀態*/
- Key3_C=1;/*key3當前的狀態*/
- Key3_P=1;/*key3前一個狀態*/
- Key1_count=0x80+NMAX_KEY/3*2;
- Key2_count=0x80+NMAX_KEY/3*2;
- Key3_count=0x80+NMAX_KEY/3*2;
- Key_count=NMAX_KEY;
- }
- /********************************************************************/
- void main()
- {
- Init();
- while(1)
- {
- if(flg_1ms)
- {
- flg_1ms=0;
- if(Key1==0)
- Key1_count--;
- if(Key2==0)
- Key2_count--;
- if(Key3==0)//按鍵是按下狀態
- Key3_count--;
-
- Key_count--;//總的次數減1
- if(Key_count==0)//100次完了
- {
-
- if(Key1_count<0x80)
- {
- Key1_C=0;
- if(Key1_P==1) //下降沿(按鍵做動作)
- {
- Key1_P=0;
- SendData(display) ;
- }
- }
- if(Key1_count>=0x80)
- {
- Key1_C=1;
- if(Key1_P==0)
- Key1_P=1; //上升沿(假設不做動作那就繼續)
- }
- if(Key2_count<0x80)
- {
- Key2_C=0;
- if(Key2_P==1) //下降沿(按鍵做動作)
- {
- Key2_P=0;
- display--;
- }
- }
- if(Key2_count>=0x80)
- {
- Key2_C=1;
- if(Key2_P==0)
- Key2_P=1; //上升沿(假設不做動作那就繼續)
- }
- if(Key3_count<0x80)
- {
- Key3_C=0;
- if(Key3_P==1) //下降沿(按鍵做動作)
- {
- Key3_P=0;
- display++;
- }
- }
- if(Key3_count>=0x80)
- {
- Key3_C=1;
- if(Key3_P==0)
- Key3_P=1; //上升沿(假設不做動作那就繼續)
- }
-
- /*新一輪的判斷*/
- Key1_count=0x80+NMAX_KEY/3*2;
- Key2_count=0x80+NMAX_KEY/3*2;
- Key3_count=0x80+NMAX_KEY/3*2;
- Key_count=NMAX_KEY;
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
簡單上下位機通信_C版.zip
(67.55 KB, 下載次數: 7)
2018-9-5 13:18 上傳
點擊文件名下載附件
|