找回密码
 注册会员
搜索附件  
MCU资讯论坛 附件中心 单片机论坛 51单片机论坛 串口发送工具.rar

串口发送工具.rar

 

用软件通过串口控制PWM并用LED显示PWM值:
本人已调试成功,用易语言做的串口发送工具,发送PWM值,并在LED上显示PWM值,外加L298N可控制直流电机,也可用于舵机控制,但舵机控制还有点问题,波形不正常!现上传源码:/***********************************************************************************
* 标题: RS232串口通信试验(接受与发送) *
* *
* 1.通过本例程了解串口的基本原理及使用 ,理解并掌握对串口进行初始化 *
* *
* 2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机来做收发试验。
* 在调试助手字符串输入框中输入数字和字符,按发送按钮,然后观察接受窗口的变化。也可以用
* 调试助手自动循环发送。 *
* *
* 请学员认真消化本例程,学会用C语言操作串口 *
*************************************************************************************/
#include <REG52.H>
#include <intrins.h>
#define uchar unsigned char
sbit BEEP = P1^4;
sbit P21=P2^1; //PWM输出1
sbit P20=P2^0; //PWM输出2
sbit P26=P2^6; //用于L298N,控制直流电机
sbit P27=P2^7; //用于L298N,控制直流电机
bit Flag;
sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制
sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制
sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制
unsigned int ReData,SenData;
unsigned int i,LedNumVal=1 ;
unsigned int LedOut[10];
unsigned int PWM_T=15; //占空比控制变量
void delay(unsigned int i); //函数声名
// 此表为 LED 的字模
//unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
///////////////////串口输出//////////////////////
void fun_SclMode(uchar ReData)
{
unsigned int LedNumVal;
LedNumVal=ReData;
PWM_T=LedNumVal;
LedOut[0]=Disp_Tab[LedNumVal%10000/1000]; //千位
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点
LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[3]=Disp_Tab[LedNumVal%10]; //个位

for( i=0; i<9; i++) //实现8位动态扫描循环
{
P0 = LedOut; //将字模送到P0口显示

switch(i) //使用switch 语句控制位选 也可以是用查表的方式 学员可以试着自己修改
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;

}

delay(5);
}

}
//////////////////////////////////////////////////////////
timer0() interrupt 1 //定时器0中断服务程序
{
static unsigned int tt ; //tt用来保存当前时间在一秒中的比例位置
tt++; //每200微秒增加1
if(tt==100) //20毫秒的时钟周期
{ tt=0; //使tt=0,开始新的PWM周期
P20=0;
P21=0;
}
if(PWM_T==tt) //按照当前占空比切换输出为高电平
{
P20=1;
P21=1;
}
}
//////////////////////////////////////////////////////
void main (void)
{

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|=0x22; // 定时器0定时器1工作方式2
PCON|= 0x80; //用于12M
// PCON|= 0x00; //用于11.0592
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TH0=56; //写入预置初值56到定时器0,使200微秒溢出一次(12MHz)
TL0=56; //写入预置值,数字越大,平率越快
TR1 = 1;
TR0 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
ET0 = 1; //允许定时器0中断
BEEP=1;
// IE = 0x0;
P26=0;
P27=1;
while(1)
{
if (Flag==1)
{
SBUF=SenData; //SUBF接受/发送缓冲器
while(TI==0);
TI=0;
Flag=0;
}
fun_SclMode(ReData); //串口
}

}
/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{

if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
Flag=1;
}
}
/***************************************************************************
* *
* 延时程序 *
****************************************************************************/
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}



QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-25 04:32 , Processed in 0.036302 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部