本人是51单片机菜鸟,求助各位大神.

来自:    更新日期:早些时候
求助各位大神:用51单片机制作的简单计算器程序~

#include
#define uchar unsigned char;
uchar LED1,LED2,LED3,LED4;
uchar keyval,calflag,s_dat,d_dat;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned int number,r_dat;
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
void dealdat()
{
switch(calflag)
{
case 0:
r_dat=s_dat+d_dat;
break;
case 1:
r_dat=s_dat-d_dat;
break;
case 2:
r_dat=s_dat*d_dat;
break;
case 3:
r_dat=s_dat/d_dat;
break;
default:break;
}
LED1=(r_dat/1000)%10;
LED2=(r_dat/100)%10;
LED3=(r_dat/10)%10;
LED4=r_dat%10;
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}
void t0isr() interrupt 1
{
TH0=0xf4;
TL0=0x48;
switch(number)
{
case 0:P2=0x04;P0=distab[LED1];break;
case 1:P2=0x08;P0=distab[LED2];break;
case 2:P2=0x01;P0=distab[LED3];break;
case 3:P2=0x02;P0=distab[LED4];break;
default:break;
}
number++;
if(number>3)number=0;
}
main()
{
TMOD = 0x01;
number = 0;
TH0=0xf4;
TL0=0x48;
TR0=1;
ET0=1;
EA=1;
LED1=0;
LED2=0;
LED3=0;
LED4=0;
while(1)
{
getkey();
switch(keyval)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
LED3=LED4;
LED4=keyval;
LED1=0;
LED2=0;
break;
case 10:break; //"ON"
case 11: //"="
d_dat=LED3*10+LED4;
dealdat();
break;
case 12: //"/"
calflag=3;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 13: //"*"
calflag=2;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 14: //"-"
calflag=1;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
case 15: //"+"
calflag=0;
s_dat=LED3*10+LED4;
LED3=0;
LED4=0;
break;
default:break;
}
}
}

Fortran90续行符为 &。

当一个语句非常长以至于132列都书写不下时,允许有39个续行。在语句行最后加上续行符“&”号。如果把一个语句名、函数名等fortran中且有特定意义的字符分成两行,那么除在行末续行外,还要在下一行的开头加一个续行符, 如果字符串跨2行以上,则在续行的开始位置也要加&号。注意语句的有效字符是从“&”前和续行符“&”之后的位置算起
如:x=2+5&
+6
又如:x=sin(4.0)+si&
&n(1.0)

#include<reg52.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
uchar i=0,j=0,t=0,k,m1,m2,tmp1,tmp2,temp;
sbit P10=P1^0;//循迹传感器最左有测得信号 低电平有效
sbit P11=P1^1;//循迹传感器次左有测得信号
sbit P12=P1^2;//循迹传感器中有测得信号
sbit P13=P1^3;//循迹传感器次右有测得信号
sbit P14=P1^4;//循迹传感器最右有测得信号
sbit s1=P2^2;//单片机输出到L298N控制电机左后退
sbit s2=P2^3;//单片机输出到L298N控制电机左前进
sbit s3=P2^4;//单片机输出到L298N控制电机右后退
sbit s4=P2^5;//单片机输出到L298N控制电机右前进
sbit en1=P2^0;
sbit en2=P2^1;
sbit qian=P1^6;
sbit ce=P1^7;
sbit beep=P3^0;
sbit choose=P3^1;
sbit zheng=P3^6;
sbit fu=P3^7;
sbit ceshi=P3^5;
sbit ceshi2=P3^4;
void Delay(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<113;j++)
{
;
}
}
}

void init()
{
TMOD=0x02; /* 设定T0的工作模式为2 */
TH0=0x9c; /* 装入定时器的初值 */
TL0=0x9c;
EA=1; /* 开中断 */
ET0=1; /* 定时器0允许中断 */
TR0=1; /* 启动定时器0 */

}
/* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */
void motor(uchar index, int speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed); /* 取速度的绝对值 */
if(speed>0) /* 速度值为正则正转 */
{
s1=1;
s2=0;
}
if(speed<0) /* 为负数则反转 */
{
s1=0;
s2=1;
}
}
if(index==2)
{
m2=abs(speed);
if(speed>0)
{
s3=1;
s4=0;
}
if(speed<0)
{
s3=0;
s4=1;
}
}
}
}

void main()
{
init();
zheng=1;
fu=0;
ceshi=0;
ceshi2=1;
P1=0xff;

if(choose==1)
while(1)
{
temp=(P1|0xe0);
switch(temp)
{
case 0xf7:i=1;motor(1,50);motor(2,0);break;
case 0xef:i=2;motor(1,50);motor(2,0);break;
case 0xe7:i=3;motor(1,50);motor(2,0);break;
case 0xe3:i=4;motor(1,50);motor(2,0);break;
case 0xf3:i=5;motor(1,50);motor(2,0);break;
case 0xfe:j=1;motor(1,0);motor(2,50);break;
case 0xfc:j=2;motor(1,0);motor(2,50);break;
case 0xf8:j=3;motor(1,0);motor(2,50);break;
case 0xf9:j=4;motor(1,0);motor(2,50);break;
case 0xfd:j=5;motor(1,0);motor(2,50);break;
case 0xfb:k=1;motor(1,30);motor(2,30);break;
case 0xf1:k=2;motor(1,30);motor(2,30);break;
case 0xe0:motor(1,30);motor(2,30);break;
case 0xff:if(i==1||i==2||i==3||i==4||i==5){i=0;motor(1,50);motor(2,0);}
if(j==1||j==2||j==3||j==4||j==5){j=0;motor(1,0);motor(2,50);}
if(k==1||k==2){k=0;motor(1,30);motor(2,30);}break;
default : break;
}
if(qian==0)
{
beep=0;
TR0=0;en1=0;en2=0;EA=0;ET0=0;
while(!qian);
TR0=1;en1=1;en2=1;EA=1;ET0=1;
beep=1;
}
if(ce==0)
{
beep=0;
TR0=0;en1=0;en2=0;EA=0;ET0=0;

Delay(2000);
TR0=1;en1=1;en2=1;EA=1;ET0=1;
beep=1;
while(ce==0)
{motor(1,15);
motor(2,15);
}
}
}
else
{
P0=0xff;
while(1)
{
switch(P0&0x1f)
{
case 0x11: motor(1,50);motor(2,50);Delay(1000);break;
case 0x12: motor(1,0);motor(2,50);Delay(1000);break;
case 0x14: motor(1,50);motor(2,0);Delay(1000);break;
case 0x18: motor(1,-50);motor(2,-50);Delay(1000);break;
default:motor(1,0);motor(2,0);break;
}
}
}

}

void timer0() interrupt 1 /* T0中断服务程序 */
{

if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1)
en1=1;
else
en1=0; /* 产生电机1的PWM信号 */

if(t<tmp2)
en2=1;
else
en2=0; /* 产生电机2的PWM信号 */

t++;
if(t>=100)
t=0; /* 1个PWM信号由100次中断产生 */
}

这个是可循迹智能小车的程序 你自己研究吧

占空比就用定时器中断来控制就好了

如果你用的是舵机,它的控制是20ms的脉冲,0.5~2.5分别是脉宽即高电平,还有你的舵机角度是多少,比如是180度的话,那就是0.5对应-90度,1对应-45度,1.5是中性位即停止,2对应45度2.5对应90度。你说的是同向控制即假设你左边舵机用的是0.5ms那么右边用的就是2.5ms就可以控制同向旋转了;

顶楼上很不错!!!!1

.


本人是51单片机菜鸟,求助各位大神.视频

相关评论:
  • 17196756856单片机编程问题 菜鸟求助攻
    莫逸梵连等有点奇怪i=j=a=fmq=0;还有中断嵌套的问题,定时器0可以中断掉定时器1的中断,在定时器1中断的时候,定时器0也中断了,所以没法延续2s。应该在定时器1中断关掉定时器0.TR0=0;结束时再打开TR0=1

  • 17196756856跪求单片机的大神:本人专业是计算机相关的,一直想从事单片机相关的工 ...
    莫逸梵零基础除了要学单片机知识还要要学的辅助科目有 1,汇编语言,c语言 2,电路,数字电路,模拟电路 3,接口技术,传感器技术 4,一些相关芯片 5,相关的数学知识 6,软件操作知识 7,自动控制原理 这些可以在郭天祥老师的C51单片机C语言教程+数字电路这里入门后,然后逐步学习,深入学习,想要学好单片机,这些基础还不...

  • 17196756856单片机菜鸟问题
    莫逸梵回答第一个问题,比较复杂。2。LCALL ACALL SCALL 有什么区别 呵呵,根本没有什么SCALL,倒是有个SJMP。LCALL或LJMP: 3字节指令,转移的范围大,可达64K;ACALL或AJMP: 2字节指令,转移的范围小,只能达2K;SJMP: 2字节指令,转移的范围只能在-128~+127字节。

  • 17196756856求好的51单片机学习网站
    莫逸梵(这里有单片机学习的网上教程,连载哟!)强烈推荐之五: 51单片机:\/\/www.mcu51.com (这可是大名鼎鼎的哟!她的论坛在单片机世界的影响就象HELLOCQ在HAM中的影响一样。)强烈推荐之六: 哦,没有了! :D :D :D 衷心祝愿单片机爱好者及学习者们马到成功!!!(我也是正在学习中的菜鸟哟! ;)...

  • 17196756856关于C语言编写8051程序的问题
    莫逸梵第一,LZ 的主函数没有循环语句,虽然编译器 编译的时候 会帮你加上去,可是这不是个好习惯;第二,51单片机 只能识别低电平,无法识别高电平,所以,来低的可以识别,来高的,就需要硬件支持了。第三,真要写程序的话,LZ的要求描述,与程序都过于简单,无法设计合理程序。

  • 17196756856求救,求救,51单片机C语言中找一种类似位sbit的东西定义在结构体中_百...
    莫逸梵通过“与”、“或”、“移位”等实现。判断:要判断单字节二进制数A的BIT2,可以使用A&0b00000100,结果等于0,说明BIT2=0,否则,BIT2=1.设置:要将单字节二进制数A的BIT2置位为1,可以使用A||0b00000100,复位为0,可以使用A&0b11111011。读取:要读取单字节二进制数A的BIT2,可以使用“...

  • 17196756856要求用51单片机和DS1302来做万年历,我是菜鸟一个,想求教怎么画电路图...
    莫逸梵上传个仿真的吧,现在这是没闹钟功能的,其他的都和你的一样。自己有LED焊接了个数码管状的在办公室放着呢。

  • 17196756856〈菜鸟问题〉单片机MCS-51中MCS是什么意思
    莫逸梵现在的单片机内部都有ROM,在8031时代,内部是没有ROM的。EA只是用来选择优先读取的ROM的位置的,接高电平:先读取内部ROM,读完后在搜寻外部ROM。接低电平时:直接读取外部ROM,不再读取内部ROM.在使用8031时EA接地就行了。

  • 17196756856我是参加飞思卡尔的菜鸟,我已经看完了手把手写128程序,可是还是不会...
    莫逸梵先从最基本的单片机资源开始,可以从网上找例程,很多,各种寄存器、IO、AD、PWM如果测速的话还要加计数器。单片机熟悉之后再进行传感器包括硬件电路的学习。写程序一定要自己亲手写才行,从简单的点亮led开始写

  • 17196756856单片机菜鸟,蜂鸣器音调怎么控制求教各位大
    莫逸梵用频率调声调,电压调大小

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网