#include #include /*****************************************************************************/ #define uint unsigned int //用简写符号表示无符号整型数据类型 #define uchar unsigned char //简写符号表示无符号字符型数据类型 #define FOSC 12000000 //晶振大小值设定,便于计算波特率 #define BAUD 9600 sbit PWM=P1^1; //控制信号输出口定义 uchar a,b,y,i,j,s[4]; /*******************************串口初始化程序********************************/ void InitUART(void) { unsigned int iTmpBaud; unsigned long lTmpBaud; iTmpBaud = 0; //首先选定定时器2作为波特率发生器,16位定时器,自动装载 SCON = 0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI 0 0 0 //0 1 0 1 0 PCON = 0x00; //PCON的地址是87H,这里SMOD =0 T2CON = 0x30; //TF2 EXF2 RCLK TCLK EXEN2 TR2 C(/T2) CP(/RL2) //0 0 1 1 0 0 0 0 /* T2MOD = 0x00; // / / / / / / T2OE DCEN //0 0 0 0 0 0 0 0*/ lTmpBaud = FOSC/BAUD; lTmpBaud /= 32; //12T-mode iTmpBaud = lTmpBaud & 0xFFFF; iTmpBaud = 65536 - iTmpBaud; RCAP2H = (iTmpBaud>>8) & 0x0FF; RCAP2L = iTmpBaud & 0x0FF; RI = 0; //清除接收中断标志 REN = 1; //允许串行接收 ES = 1; //允许串行中断 TR2 = 1; //启动定时器1 EA=1;//开总中断 } /*******************************定**********************************/ void int0() interrupt 1 周期 { 时器 0中断入口 //生成PWM控制信号脉冲 TL0=0x18; TH0=0xfc; PWM=0; //输出高电平 TH1=a; //设置定时器1初值 TL1=b; TR1=1; //开启定时器1 } //************************************通过串口将接收到数据发送给************************************** void R_S_Byte(uchar R_Byte) { SBUF = R_Byte; PC端 while( TI == 0 ); //查询法 TI = 0; } //*********************************串**************************************** void UARTRead(void) interrupt 4 控制指令 { if(RI) { s[i]=SBUF; //接收到的数据放入数组a } RI=0; i++; 收到数据 //接收上位机发送的//判断接收标志 口 if(i==4) { i=0; for(j=0;j<4;j++) { R_S_Byte(s[j]); } } } /***************************定时器1中断入口***************************/ void int3() interrupt 3 { TR1=0; //关闭定时器1 PWM=1; //改变控制信号状态 } //*********************************主程序*************************************** void main(void) { InitUART(); TMOD=0x11; TL0=0x18; TH0=0xfc; EA=1; ET0=1; ET1=1; TR0=1; while(1) { a=(65536-s[0]*10)/256; 电平初值 b=(65536-s[0]*10)%256; } } //定时器生成PWM占空比高 因篇幅问题不能全部显示,请点此查看更多更全内容