上一篇發的是,只能單一的發,這是連續發送,打開電腦串口助手可以接受都你發的東西,原理就是,比如你隨便輸三位數,發送給單片機,讓數碼管顯示,可是你的讓單片機知道你發是什么,分別把你的三位數,每一位都取出來,傳遞給你寫的串口通信那塊,,不要想著這樣就結束了,這樣想只能單一的發送,不能連續的發送和接收,你想怎么樣才能讓它連續的接收和發送呢。其原理差不多,就比如像你強火車票一樣,一直不停的刷新,希望有火車票一樣,(比喻不好還請見諒)而你實現連續串口發送接收原理我自己感覺差不多,就是把你串口接收發送那塊,不斷的刷新,這樣就可以實現,連續接收和發送了
單片機源程序如下:
- /*********************該程序可實現燈的亮滅**可以實現串口通信以及電腦控制單片機/*實現連續發送*********************************/
- /*該程序寫的比較好*//*通過兩個不同的標志位實現,非常棒*/
- //可以連續發送
- #include <STC15f2k60s2.h>
- #define u16 unsigned int
- #define u8 unsigned char
- u16 pwm_value;
-
- sbit LED = P1^0;//用于檢測電腦與單片機串口正常通信
- unsigned char UART_buff;//串口的接收和發送(只能是單個字符的使用)
- unsigned char receive[50];//用于接收所發出來的字符串
- unsigned char i;
- int xianshi,copy;
- double shuju;
- bit New_rec = 0, Send_ed = 1, Money = 0; //定義的一些標記位
- unsigned char code DSY_CODE[]=
- {
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
- };//這是時鐘所用到的數
- /*******用于一毫秒的延時****************/
- void delayms(unsigned int xms)
- {
- unsigned int i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*數碼管顯示程序2*/
- void display1(int h)
- {
- P2=0xfe;
- P0=DSY_CODE[h/100]&0x7f;
- delayms(1);
- P2=0xff;
- P0=0xff;
- P2=0xfd;
- P0=DSY_CODE[h%100/10];
- delayms(1);
- P2=0xff;
- P0=0xff;
- P2=0xfb;
- P0=DSY_CODE[h%100%10];
- delayms(1);
- P2=0xff;
- P0=0xff;
- }
- //========================================================================
- // 函數: UpdatePwm(u8 PCA_id, u16 pwm_value)
- // 描述: 更新PWM值.
- // 參數: PCA_id: PCA序號. 取值 PCA0,PCA1,PCA2,PCA_Counter
- // pwm_value: pwm值, 這個值是輸出高電平的時間.
- // 返回: none.
- // 版本: V1.0, 2012-11-22
- //========================================================================
- void UpdatePwm(u16 uart_date)
- {
- pwm_value=uart_date/2;
- if(pwm_value == 0)
- {
- CCAP0H =0xff;
- }
- else
- {
- CCAP0H = (u8)(256 - pwm_value);
- }
- }
- //----------------------------------------------
- void main (void)
- {
- AUXR |= 0x40; //設置1T
- AUXR &= 0xfe; //設置定時器1為串口1波特率發生器
- PCON &= 0x7f; //不加倍
- TMOD = 0x20; //定時器1工作方式2
- TH1 = 0xdc;
- TL1 = 0xdc;
- SM0 = 0;
- SM1 = 1;
- REN = 1;
- TR1 = 1;
- ES = 1;
- EA = 1;
-
- while(1)
- {
- while(i%3==0&&i!=0)
- {
- copy=i/3;
- // shuju=(double)(receive[0])+(double)(receive[1])/10+(double)(receive[2])/100;
- shuju=(double)(receive[(copy-1)*3])+(double)(receive[(copy-1)*3+1])/10+(double)(receive[(copy-1)*3+2])/100;
- xianshi=shuju*100;
- display1(xianshi);
- // PCA0初始化
- AUXR1 &= ~0x30;
- AUXR1 |= 0x10; //切換IO口, 0x00: P1.2 P1.1 P1.0 P3.7, 0x10: P3.4 P3.5 P3.6 P3.7, 0x20: P2.4 P2.5 P2.6 P2.7
- CCAPM0 = 0x42; //工作模式 PWM
- PCA_PWM0 = (PCA_PWM0 & ~0xc0) | 0x00; //PWM寬度, 0x00: 8bit, 0x40: 7bit, 0x80: 6bit
- CMOD = (CMOD & ~0xe0) | 0x08; //選擇時鐘源, 0x00: 12T, 0x02: 2T, 0x04: Timer0溢出, 0x06: ECI, 0x08: 1T, 0x0A: 4T, 0x0C: 6T, 0x0E: 8T
- CR = 1;
- UpdatePwm(xianshi);
- }
- if ((New_rec == 1) && (Send_ed == 1))
- { //如果收到新數據及發送完畢
- New_rec = 0;
- Send_ed = 0;
- }
- }
- }
- //----------------------------------------------
- void ser_int (void) interrupt 4
- {
- if(RI == 1)
- { //如果收到.
- RI = 0; //清除標志.
- New_rec = 1;//表明收到了信息了
- if((SBUF >= '0') && (SBUF <= '9'))
- {
- receive[i]=SBUF-'0';//將字符串按字節放入到數組當中,起到一定的緩存作用
- i++;
- }
- UART_buff = SBUF; //接收.只支持字符,不支持字符串
- SBUF=UART_buff;//這個用于電腦串口的接收,也就是發送
- TI = 0; //清除標志.
- Send_ed = 1;
- }
- else { //如果送畢.
- TI = 0; //清除標志.
- Send_ed = 1;
- }
- }
- ///*********************該程序可實現燈的亮滅**可以實現串口通信以及電腦控制單片機/只能發送單個*********************************/
- ///*該程序寫的比較好*//*通過兩個不同的標志位實現,非常棒*/
- //#include <STC15f2k60s2.h>
- //
- //#define u16 unsigned int
- //#define u8 unsigned char
- //
- //u16 pwm_value;
- //
- //sbit LED = P1^0;//用于檢測電腦與單片機串口正常通信
- //unsigned char UART_buff;//串口的接收和發送(只能是單個字符的使用)
- //unsigned char receive[50];//用于接收所發出來的字符串
- //unsigned char i;
- //int xianshi;
- //double shuju;
- //bit New_rec = 0, Send_ed = 1, Money = 0; //定義的一些標記位
- //unsigned char code DSY_CODE[]=
- //{
- //0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
- //};//這是時鐘所用到的數
- ///*******用于一毫秒的延時****************/
- //void delayms(unsigned int xms)
- //{
- //unsigned int i,j;
- //for(i=xms;i>0;i--)
- //for(j=110;j>0;j--);
- //}
- ///*數碼管顯示程序2*/
- //void display1(int h)
- //{
- //P2=0xfe;
- //P0=DSY_CODE[h/100]&0x7f;
- //delayms(1);
- //P2=0xff;
- //P0=0xff;
- //P2=0xfd;
- //P0=DSY_CODE[h%100/10];
- //delayms(1);
- //P2=0xff;
- //P0=0xff;
- //P2=0xfb;
- //P0=DSY_CODE[h%100%10];
- //delayms(1);
- //P2=0xff;
- //P0=0xff;
- //}
- //
- ////========================================================================
- //// 函數: UpdatePwm(u8 PCA_id, u16 pwm_value)
- //// 描述: 更新PWM值.
- //// 參數: PCA_id: PCA序號. 取值 PCA0,PCA1,PCA2,PCA_Counter
- //// pwm_value: pwm值, 這個值是輸出高電平的時間.
- //// 返回: none.
- //// 版本: V1.0, 2012-11-22
- ////========================================================================
- //void UpdatePwm(u16 uart_date)
- //{
- // pwm_value=uart_date/2;
- // if(pwm_value == 0)
- // {
- // CCAP0H =0xff;
- // }
- // else
- // {
- // CCAP0H = (u8)(256 - pwm_value);
- // }
- //}
- //
- ////----------------------------------------------
- //void main (void)
- //{
- // AUXR |= 0x40; //設置1T
- // AUXR &= 0xfe; //設置定時器1為串口1波特率發生器
- // PCON &= 0x7f; //不加倍
- // TMOD = 0x20; //定時器1工作方式2
- // TH1 = 0xdc;
- // TL1 = 0xdc;
- // SM0 = 0;
- // SM1 = 1;
- // REN = 1;
- // TR1 = 1;
- // ES = 1;
- // EA = 1;
- //
- // while(1)
- // {
- // while(i>=2)
- // {
- // shuju=(double)(receive[0])+(double)(receive[1])/10+(double)(receive[2])/100;
- // xianshi=shuju*100;
- // display1(xianshi);
- //
- // // PCA0初始化
- // AUXR1 &= ~0x30;
- // AUXR1 |= 0x10; //切換IO口, 0x00: P1.2 P1.1 P1.0 P3.7, 0x10: P3.4 P3.5 P3.6 P3.7, 0x20: P2.4 P2.5 P2.6 P2.7
- // CCAPM0 = 0x42; //工作模式 PWM
- // PCA_PWM0 = (PCA_PWM0 & ~0xc0) | 0x00; //PWM寬度, 0x00: 8bit, 0x40: 7bit, 0x80: 6bit
- // CMOD = (CMOD & ~0xe0) | 0x08; //選擇時鐘源, 0x00: 12T, 0x02: 2T, 0x04: Timer0溢出, 0x06: ECI, 0x08: 1T, 0x0A: 4T, 0x0C: 6T, 0x0E: 8T
- // CR = 1;
- // UpdatePwm(xianshi);
- // }
- // if ((New_rec == 1) && (Send_ed == 1))
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
15電腦串口控制單片機電壓精美版1.zip
(31.15 KB, 下載次數: 13)
2018-5-19 08:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|