|
通過(guò)串口助手和虛擬串口,實(shí)現(xiàn)仿真,上位機(jī)發(fā)送1/2/3.....控制占空比。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (70.76 KB, 下載次數(shù): 59)
下載附件
2020-12-1 16:17 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- #define uint unsigned int
- uint pp;
- char num=2,dis;
- #define jingzhen 11059200UL /*使用晶體*/
- #define botelv 9600UL /*波特率定義為9600*/
- unsigned char zifuchuan[]="清翔電子開(kāi)發(fā)板是您最好的選擇!\n"; //待顯示字符。
- volatile unsigned char sending;
- sbit down = P3^5;
- sbit up = P3^6;
- sbit led=P1^0;
- uint8 t = 0;
- uint8 PWM_T = 0; //占空比控制變
- unsigned char posit=0;
- sbit W1=P2^4;
- sbit W2=P2^5;
- sbit W3=P2^6;
- sbit W4=P2^7;
- unsigned char buf;
- unsigned char code table[]=
- {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF,0x00};
- unsigned char disbuff[4]={0,0,0,0};
- void delayms(unsigned int z) //延時(shí) z ms //這里用來(lái)修改是12延時(shí)還是51 ,帶xy的是12
- {
- int i;
- while(z--)
- for(i=0;i<110;i++);
- }
- void keyscan()
- {
- if(!up)
- {
- if(PWM_T<100)
- {
- PWM_T=PWM_T+10;
-
- }num++;
- if(num>9) num=9;
- while(up==0);
-
- }
- if(!down)
- {
- if(PWM_T>0)
- {
- PWM_T=PWM_T-10;
-
- }num--;
- if(num<0) num=0;
- while(down==0);
-
- }
-
- }
- void play() //顯示數(shù)字
- {
- P0=0XFF;
-
- if(posit==0)P0=table[1];
- if(posit==1)P0=table[0];
- if(posit==2){P0=table[num];}
- switch(posit)
- {
- case 0 : W1=1;W2=0;W3=0;W4=0; break;
- case 1 : W1=0;W2=1;W3=0;W4=0; break;
- case 2 : W1=0;W2=0;W3=1;W4=0; break;
- //case 3 : W1=0;W2=0;W3=0;W4=1; break;
- }
- delayms(5);
- posit++;
- if(posit>2) //每進(jìn)一次顯示函數(shù),變量加1
- posit=0;
- }
- void init()
- {
- SCON = 0x50; // SCON: 方式 1, 8-bit, 允許接收數(shù)據(jù)
- TMOD |= 0x20; // TMOD: 設(shè)置定時(shí)器1工作在方式2, 8-bit 自動(dòng)重裝
- TH1 = 0xFD; // TH1: 初始值為0xFD 波特率:9600 晶振頻率:11.0592MHz
- TL1 = 0x0;
- TR1 = 1; // TR1: 開(kāi)啟定時(shí)器1
- EA = 1; //打開(kāi)總中斷
- ES = 1; //打開(kāi)串口中斷
- }
- // 發(fā)送一個(gè)字節(jié)數(shù)據(jù)
- void uart_send_byte(unsigned char dat)
- {
- SBUF = dat;
- while(!TI);
- TI = 0;
- }
- // 發(fā)送字符串
- void uart_send_str(unsigned char *s)
- {
- while(*s != '\0')
- {
- uart_send_byte(*s);
- s++;
- }
- }
- void main()
- {
- TMOD = 0x02; //定時(shí)器0,工作模式2,8位定時(shí)模式
- TH0=210; //寫(xiě)入預(yù)置初值(取值1-255,數(shù)越大PWM頻率越高)
- TL0=210; //寫(xiě)入預(yù)置值 (取值1-255,數(shù)越大PWM頻率越高)
- TR0=1; //啟動(dòng)定時(shí)器
- ET0=1; //允許定時(shí)器0中斷
- EA=1; //允許總中斷
- led=1; //初始化P1,輸出端口
- PWM_T=30;
- init();
- while(1)
- {
- keyscan();
- play();//顯示num當(dāng)前值,占空比為num/10。
- }
- }
- /****************************************************
- /定時(shí)器0中斷模擬PWM
- ****************************************************/
- timer0() interrupt 1
- {
- t++; //每次定時(shí)器溢出加1
-
- if(t==100) //PWM周期 100個(gè)單位
- {
- t=0; //使t=0,開(kāi)始新的PWM周期
- led=0; //輸出端口
- }
-
- if(PWM_T==t) //按照當(dāng)前占空比切換輸出為高電平
- {
- led=1; //
- }
- }
- void uart_interrupt(void) interrupt 4 //也叫串行中斷服務(wù)程序
- {
- unsigned char recv_data;// 用來(lái)存放接收到的數(shù)據(jù)
- unsigned char send_data[] = "I received.\n";// 要發(fā)送的信息
-
- if(RI) //接收數(shù)據(jù)(1字節(jié))完畢,RI會(huì)被硬件置1
- {
- RI = 0; // 將 接收中斷標(biāo)志位 清零(讓串口可以繼續(xù)接收數(shù)據(jù))
- recv_data = SBUF; //讀取接收到的數(shù)據(jù),并存放到data
-
-
- if(recv_data == '0'){num=0;PWM_T=0;}
- if(recv_data == '1'){num=1;PWM_T=10;}
- if(recv_data == '2'){num=2;PWM_T=20;}
- if(recv_data == '3'){num=3;PWM_T=30;}
- if(recv_data == '4'){num=4;PWM_T=40;}
- if(recv_data == '5'){num=5;PWM_T=50;}
- if(recv_data == '6'){num=6;PWM_T=60;}
- if(recv_data == '7'){num=7;PWM_T=70;}
- if(recv_data == '8'){num=8;PWM_T=80;}
- if(recv_data == '9'){num=9;PWM_T=90;}
- play();
- uart_send_str(send_data);
- }
- if(TI)
- {
- TI = 0;
- }
- }
- /*void serial() interrupt 4
- {
- ES = 0; //關(guān)閉串行中斷
- RI = 0; //清除串行接受標(biāo)志位
- buf = SBUF; //從串口緩沖區(qū)取得數(shù)據(jù)
- switch(buf)
- {
- case '0': num=0;PWM_T=0;break;
- case 0x32: num=1;PWM_T=10;break;
- case 0x33: num=2;PWM_T=20;break;
- case 0x34: num=3;PWM_T=30;break;
- case 0x35: num=4;PWM_T=40;break;
- case 0x36: num=5;PWM_T=50;break;
- case 0x37: num=6;PWM_T=60;break;
- case 0x38: num=7;PWM_T=70;break;
- case 0x39: num=8;PWM_T=80;break;
- case 0x40: num=9;PWM_T=90;break;
- default: num=10; break;
- }
- play();
- ES = 1; //允許串口中斷
- }*/
復(fù)制代碼
串口助手下載:http://www.zg4o1577.cn/bbs/dpj-199058-1.html
vspd虛擬串口助手可以到百度搜索或者51hei下載
所有資料51hei提供下載:
上位機(jī)控制pwm.zip
(4.97 MB, 下載次數(shù): 24)
2020-12-1 09:48 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|