A. 51单片机如何修改波特率9600改成2400
用下面公式重新计算用于产生波特率的定时器重载值:
设9600波特率时定时器重载值是X;
设2400波特率时定时器重载值是Y;
当定时器重载值是8bit时(传统的51单片机型号,如AT89C51的T1):
Y=256-((256-X)*4)
当定时器重载值是16bit时(较新的51单片机型号,如C8051F系列的Timer3):
Y=65536-((65536-X)*4)
//-----------------------------------------------
粗略看了一下你的程序,你可以调整一下MAX_DELAY这个参数。我没具体计算过,只是怀疑是不是波特率降低之后,发送数据的时间变长了,如果发送数据的时间超过MAX_DELAY就会发送错误。
仅供参考。
B. 问一下51单片机能不能改成电源模块
看你这开发板是用USB线连接电脑,用USB取电并烧录程序。如果用电脑烧录程序以后,是可以用5Ⅴ电源模块供电,但应该是手机充电器的那种电源模块,插上USB线就供电了。你买其他类型的5V电源模块用不上。其实,用不着另买电源模块,肯定有手机充电器,用充电器就行的。买的电源模块没有USB口反倒不能用。但是,烧录程序时还必须用电脑。
C. 51单片机改io口
51的IO 很特别,属于SFR,不能直接或者间接寻址,所以不能像寄存器那样随意调换顺序。要么在定义的时候修改,要么使用以个接口函数,在接口函数中实现IO的兑换,这个函数可以接受参数什么的,可以做的比较人性化。
D. 51单片机程序修改
现在,你显示的是num1,其范围是0~60。
可以把它的上限,改为30,这就符合你的要求了。
另外再增加一个变量num2,其范围是0~60。
用它来控制红绿黄的交替变化,即可。
voiddisplay(ucharge,ucharshi)
{
if(num2<=25){P1=0xfe;}
elseif(num2<=30){P1=0xff;delay(2);P1=0xfd;}
elseif(num2<=60){P1=0xfb;}
……
}
……
voidtime0()interrupt1
{
TH1=(65536-5000)/256;//--应该是TH0=...
TL1=(65536-5000)%256;//--应该是TL0=...
num++;
if(num==10){
num=0;
num1++;
if(num1==30)num1=0;//用于显示秒数
shi=num1/10;
ge=num1%10;
num2++;
if(num2==60)num2=0;//用于控制变换
}
}
E. 51单片机数字电压表P0口改到P1口程序怎么改
delay(1);
EN=1;//拉高使能端,为制造有效的下降沿做准备。
delay(1);
EN=0;//en由高变低,产生下降沿,液晶执行命令。
}
void write_1602dat(uchar dat)//液晶写入数据函数
{
RS=1;//数据/指令选择置为数据
P0=dat;//送入数据 *******************************这个我改成了P1
delay(1);
EN=1; //en置高电平,为制造下降沿做准备。
delay(1);
EN=0; //en由高变低,产生下降沿,液晶执行命。
}
void lcd1602_init()//液晶初始化函数
{
uchar a;
RW=0;
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据。
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移。
write_1602com(0x01);//清显示
write_1602com(0x80);//显示固定符号从第一行第0个(从第0个开始数)位置开始显示
for(a=0;a<4;a++)
{
write_1602dat(tab1[a]);//向液晶屏写固定符号部分
}
write_1602com(0x80+9);//显示固定符号写入位置,从第一行第9个(从第0个开始数)位置开始显示。
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//写显示固定符号
}
}
/*************转速显示函数**********/
void display(unsigned long speed)//转速显示函数
{
if(speed<=99999)
{
uchar wan,qian,,shi,ge;//定义拆字变量
wan=speed/10000;//转速/10000得到万位
qian=speed%10000/1000;//转速/10000的余数/1000得到千位