久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1384|回復: 2
收起左側

stc12c2052串口通信接收PWM控制信號的程序問題,偶爾能用

[復制鏈接]
ID:508562 發表于 2020-3-26 08:38 | 顯示全部樓層 |閱讀模式
利用12寫了個串口通信接收PWM控制信號的程序,可是通過串口調試,單片機能收到串口發送的數據但是不能將數據用作控制信號的變量,但是偶爾又可以控制,不知為什么下面是代碼:
#include <reg52.h>         
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int

/************************************************/
/*************定義PCA特殊功能寄存器**************/
/************************************************/
sfr        CCON = 0xd8;
sfr CMOD = 0xd9;
sfr CL = 0xe9;
sfr CH = 0xF9;
sfr CCAPM0 = 0xda;
sfr CCAP0L = 0xea;
sfr CCAP0H = 0xfa;
sfr CCAPM1 = 0xdb;
sfr CCAP1L = 0xeb;
sfr CCAP1H = 0xfb;
sfr CCAPM2 = 0xdc;
sfr CCAP2L = 0xec;
sfr CCAP2H = 0xfc;
sfr CCAPM3 = 0xdd;
sfr CCAP3L = 0xed;
sfr CCAP3H = 0xfd;
sfr PCAPWM0 = 0xf2;
sfr PCAPWM1 = 0xf3;
sfr PCAPWM2 = 0xf4;
sfr PCAPWM3 = 0xf5;
sfr        P3M1=0xb1;
sfr        P3M0=0xb2;        
sfr        P1M1=0x91;
sfr        P1M0=0x92;  

sbit CCF0 = CCON^0;
sbit CCF1 = CCON^1;
sbit CR = CCON^6;
sbit CF = CCON^7;
sbit LED1 = P1^7;
sbit LED2 = P1^6;
sbit LED3 = P1^5;

sbit rs485dir = P1^0;

uchar a, b, c, d;
//uchar addr = 0x01;
uchar ld;
uchar pl;
uchar status1;
uchar status2;
uchar omode = 0x01;
bit flag = 1;
uint fre[]={12000,6000,4000,3000,2400,2000,1714,1500,1200,1000};
uchar bri[]={0x19,0x32,0x4b,0x64,0x7d,0x96,0xaf,0xc8,0xe1,0xfa};
void delay(uint i);
void delayus(uchar a);
void Serial_communication();                                 
void SerialInit();

void main()
{
        P3M0 = 0;                                                          //******************//
        P3M1 = 1;                                                          //*設定IO口工作模式*//
        P1M0 = 0;
        P1M1 = 0;               
        ld = 0;
        pl = 9;
        status1 = 0x00;
        status2 = 0x03;                                                                                                         
        SerialInit();        
        while(1)
        {               
                delay(1000);           
                LED1 = 1;
                LED2 = 1;
                LED3 = 1;

                CCON = 0;                                                          //關閉PCA寄存器CF中斷//
        
                CL = 0;                                                                 //初始化PCA16位寄存器值//
                CH = 0;                                                                  //***PWM功能使能****//           
        
                CMOD = 0x00;                                                 //*確定時鐘頻率模式*//        
        
                CCAPM1 = 0x42;                                                //****PWM輸出使能****//                 
                if(a==0x01)
                {                          
                        switch(b)
                        {
                                case 0x02:
                                        switch(c)
                                        {
                                                case 0:        ld = 0;        break;
                                                case 1:        ld = 1;        break;
                                                case 2:        ld = 2;        break;
                                                case 3:        ld = 3;        break;
                                                case 4: ld = 4;        break;
                                                case 5:        ld = 5;        break;
                                                case 6:        ld = 6;        break;
                                                case 7:        ld = 7; break;
                                                case 8:        ld = 8;        break;
                                                case 9: ld = 9;        break;
                                                default:        break;
                                        }
                                case 0x03:                                 
                                        switch(c)
                                        {
                                                case 0:        ld = 0;        break;
                                                case 1:        ld = 1;        break;
                                                case 2:        ld = 2;        break;
                                                case 3:        ld = 3;        break;
                                                case 4: ld = 4;        break;
                                                case 5:        ld = 5;        break;
                                                case 6:        ld = 6;        break;
                                                case 7:        ld = 7; break;
                                                case 8:        ld = 8;        break;
                                                case 9: ld = 9;        break;
                                                default:        break;
                                        }
                                case 0x04:
                                        switch(c)
                                        {
                                                case 0:        status1 = 0;        break;
                                                case 1:        status1 = 0x03;        break;
                                                default:        break;
                                        }
                                default:        break;
                        }
                }
                CCAP1L = bri[ld];                                        //****調節占空比*****//
                CCAP1H = bri[ld];                                         //****無縫傳輸下一個占空比值給CCAPL*****//
                CR = 1;                                                                //***啟動PCA計數器***//
               
                   flag = 1;
                while(flag)
                {                 
        //                if(flag==1)
        //                        delay(fre[pl]);        
                                                                        
                        PCAPWM1 = status1;                                        //EPC0H與EPC0L為低PWM輸出高//  
                        delay(fre[pl]);
        
                        PCAPWM1 = status2;                                        //EPC0H與EPC0L為高PWM輸出低//
                        delay(fre[pl]);
                }
        }
}

void delay(uint i)
{
        uint a,c;
        for(a=399;a>0;a--)
                        for(c=0;c<i;c++);
}

void delayus(uchar a)
{
    uchar i,j;
    for(i=0;i<120;i++)
            for(j=0;j<a;j++);
}
void SerialInit()
{
        SCON = 0xf0;
        PCON = 0x00;
        TMOD = 0x20;
        TH1 = 0xf9;
        TH1 = 0xf9;
        TR1 = 1;
        ES = 1;
        EA = 1;
                rs485dir = 0;
}

void Serial_communication()        interrupt 4
{         
        while(!RI);
        RI = 0;         
        a = SBUF;
        flag = 0;
        if(RB8==1)
        {  
                switch(a)
                {
                        case 0x01:           
                                SM2 = 0;
                                rs485dir = 1;
                                delayus(50);

                                TI = 0;
                                TB8 = 1;
                                SBUF = a;
                                while(!TI);
                                TI = 0;                  
                                LED1 = 0;
                                LED2 = 1;
                                LED3 = 1;        

                                rs485dir = 0;
                                RI = 0;
                                while(!RI);
                                RI = 0;               
                                delayus(30);
                                b = SBUF;        
                                                  
                                rs485dir = 1;
                                delayus(50);
                                SBUF = b;
                                TI = 0;
                                TB8 = 1;
                                while(!TI);
                                TI = 0;                  
                                LED1 = 1;
                                LED2 = 0;
                                LED3 = 1;
                                       
                                rs485dir = 0;         

                                while(!RI);
                                RI = 0;           
                                delayus(30);
                                c = SBUF;
                                                   
                                rs485dir = 1;
                                delayus(50);
                                SBUF = c;
                                TI = 0;
                                TB8 = 1;
                                while(!TI);
                                TI = 0;               
                                rs485dir = 0;
                                 
                                LED1 = 1;
                                LED2 = 1;
                                LED3 = 0;        

                                while(!RI);
                                RI = 0;           
                                delayus(30);
                                d = SBUF;
                                                   
                                rs485dir = 1;
                                delayus(50);
                                SBUF = d;
                                TI = 0;
                                TB8 = 1;
                                while(!TI);
                                TI = 0;                  
                                rs485dir = 0;
                                SM2 = 1;        
                                break;

                        case 0xfe:        
                                SM2 = 0;
                                rs485dir = 1;         
                                LED1 = 0;
                                LED2 = 1;
                                LED3 = 1;
                                delayus(50);         

                                TI = 0;
                                TB8 = 1;
                                SBUF = a;   
                                while(!TI);
                                TI = 0;         
                                LED1 = 1;
                                LED2 = 0;
                                LED3 = 1;  

                                rs485dir = 0;
                                RI = 0;
                                while(!RI);
                                RI = 0;
                                b = SBUF;
                                LED1 = 1;
                                LED2 = 1;
                                LED3 = 0;        
                                while(!RI);
                                RI = 0;           
                                c = SBUF;                  
                                SM2 = 1;        
                                break;

                        default:        SM2 = 1;        break;
                }
        }
        if(RB8==0)
        {
                SM2 = 1;
        }
}

回復

使用道具 舉報

ID:508562 發表于 2020-3-26 08:43 | 顯示全部樓層
串口調試 12返回的數據也沒問題
1585183512(1).jpg
回復

使用道具 舉報

ID:508562 發表于 2020-3-26 15:28 | 顯示全部樓層
問題已解決是 波特率太高 導致通信可靠性下降
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人性生交大片 | 91国自视频 | 欧美日韩亚洲国产 | 天堂在线中文 | 欧美日韩一区二区三区四区 | 99视频免费看 | 久久99网 | 中文av在线播放 | 午夜伊人 | 欧美13videosex性极品 | 性天堂网 | 99视频在线 | www.久久久久久久久久久久 | 91麻豆精品国产91久久久久久久久 | 久久久成人免费视频 | 亚洲精品视频免费观看 | 亚洲在线一区二区 | 国产成人精品久久二区二区91 | 久久99精品久久久久婷婷 | 日韩精品一区二区三区中文在线 | 国产成人叼嘿视频在线观看 | 久久国产精品视频 | 亚洲精品综合 | 色免费视频 | 91精品国产综合久久久动漫日韩 | 日韩精品一区二区三区中文在线 | 91天堂网 | 久热国产精品视频 | 久久精品小视频 | 7777在线视频 | 欧美日韩在线观看一区二区三区 | 天堂在线中文字幕 | 91干b| 91网站视频在线观看 | 欧美午夜精品 | 久久精品国产亚洲 | jav成人av免费播放 | 国产精品亚洲视频 | 国产黄色网 | 二区欧美 | 欧美国产一区二区 |