2019-02-22 22:27:02 LuDanTongXue 阅读数 584
  • 《计算机体系结构 硬件篇2》之 计算机通信

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    4193 人正在学习 去看看 张先凤

程序下载地址:
https://download.csdn.net/download/ludantongxue/10971448
对应硬件线路连接见上章:
https://blog.csdn.net/LuDanTongXue/article/details/87869557
对应单片机程序见上章:
https://blog.csdn.net/LuDanTongXue/article/details/87869806

程序界面:
上位机图片

程序参数说明:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

各个曲线段参数设置举例:
第一段S曲线加速30°:1转/秒启动,5转/秒结束
在这里插入图片描述

第二段匀速运动120°:5转/秒匀速
在这里插入图片描述

第三段S曲线减速30°:5转/秒启动,0.5转/秒结束
在这里插入图片描述

第四段S曲线反转加速30°:0.5转/秒启动,5转/秒结束
在这里插入图片描述

第五段匀速反转运动120°:5转/秒匀速
同第二段

第六段S曲线反转减速30°:5转/秒启动,1转/秒结束
在这里插入图片描述

至此各个曲线段对应的数组均已生成,将各数组复制到单片机程序即可(记得更改数组名称)。(微信ID:saskingku)

2019-07-04 18:09:37 weixin_43241517 阅读数 619
  • 《计算机体系结构 硬件篇2》之 计算机通信

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    4193 人正在学习 去看看 张先凤

单片机 PWM 占空比计算D=(256-CCAPnH)/ 256(8位PWM模式)

2013-09-18 10:26:20 a602411570 阅读数 1010
  • 《计算机体系结构 硬件篇2》之 计算机通信

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    4193 人正在学习 去看看 张先凤
STC12C5410AD单片机波特率计算工具STC12C5410AD单片机波特率计算工具点击打开链接
2015-06-02 21:28:33 qq_23674297 阅读数 1005
  • 《计算机体系结构 硬件篇2》之 计算机通信

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    4193 人正在学习 去看看 张先凤


单片机——简单计算器
       
         最近喜欢看单片机,用C写了个简单的计算器,LCD作为
显示。在proteus上仿真和开发板上都可以运行。

         源代码及电路图: http://pan.baidu.com/s/1c0pmG0o


图片


图片
 


/*
  一个简单的整数计算器。

  从4*4矩阵键盘接收 0~9 组成的数字,做加减乘除运算,
  并将输入的键值和运算结果显示在LCD上。运算有效位好像只有6位。
*/

#include <reg51.h>   // 51系列单片机头文件
#include <math.h>
#include "LCD.h"       //  引入 自己编写的 LCD 文件

#define uchar unsigned char
#define uint unsigned int 

#define KEY P1  //   键盘 接口
#define LED P0  //   7段数码管用于显示 按下键盘的键值

sbit BEEP = P3^7; //  蜂鸣
uchar code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00}; //  0~f
uchar  fuhao = '=', k = 0, KeyNO;    //  fuhao  用于 记录 最近 使用的 运算符
unsigned long  num, a[12], temp1 = 0, temp2 = 0;   //  temp1 记录 当前输入的数值  temp2 记录 上次输入的数值

 //===================================================================//

void delay_ms(uint x); //  微秒级延时函数
void Keys_Scan();       //  接收 从键盘输入的 键值
void Beep();     //   响铃函数
void fenjie (unsigned long n);  //  LCD数字显示函数
void LCD_Show();//  LCD键值显示函数


 //================== 调试主函数 ================================//
void main()
{
KEY = 0xf0;
LED = 0xff;  //  数码管 灭

IE=0X81;
TCON=0X01;  //  TCON=0X00;     电平触发时,会接收两次 ??

Init();
W_CMD(0x80+16);

while(1); //  主程序 停留   等待中断
}

//============= 微秒级延时函数 =======================//

void delay_ms(uint x)
{
uchar t;
while(x--)
{
for(t=0;t<120;t++);
}
}

//================== 键值接收函数 ================================//

void Keys_Scan()     //  接收 从键盘输入的 键值
{
KEY = 0xf0;    //  列置0,求行 
if(KEY!=0xf0)    //  若 有键按下
{
delay_ms(10);
if(KEY!=0xf0)  //  确认 是否键按下
{
switch(KEY)   //   求出 所在行 KeyN0按下,松开时显示
{
case 0xe0: KeyNO = 0; break;
case 0xd0: KeyNO = 4; break;
case 0xb0: KeyNO = 8; break;
case 0x70: KeyNO = 12; break;
 

KEY = 0x0f;     //  行置0,求列
switch(KEY)
{
case 0x0e: KeyNO = KeyNO + 0; break;
case 0x0d: KeyNO = KeyNO + 1; break;
case 0x0b: KeyNO = KeyNO + 2; break;
case 0x07: KeyNO = KeyNO + 3;break;
}
while(KEY!=0x0f) ;
}
}
}

//================== 响铃函数 ================================//
void Beep()  //   响铃函数
{
uchar i;
for(i=0;i<100;i++)
{
delay_ms(1);;
BEEP = ~BEEP;
}
BEEP = 1;
}

 //================== LCD数字显示函数 ================================//

void fenjie (unsigned long n) //  接收一个数,求出长度 k , 将其逐位分解,并存放在数组 a【】中  然后输出在 LCD上
{
unsigned long  t = n;
uchar  i = 1;
k = 0;
while(t >= 1)   //  计算 n 的位数  k
{
t = t / 10;
k++;
}

for(i=0;i<k-1;i++)
{
a[i]=0;  

while(n >= pow(10,k-i-1))  
a[i]++;  
n = n - pow(10,k-i-1); 
}
}

a[i]=n;
for(i=0;i<k;i++)
{
num = 48 + a[i];
W_DATA(num);
}
}

//================== LCD键值显示函数 ================================//

void LCD_Show()
{
if(KeyNO < 10)
{
num = 48 + KeyNO;
W_DATA(num);

a[k++] = KeyNO;
if(k==1) 
{
temp1 = a[0];
}
else
{
temp1 = temp1 * 10 + a[k-1];  //  记录 第一个 计算的数字
}
}

else if(KeyNO==10)     //  =
num = 61;
W_DATA(num);

if(fuhao == '=')
{
fenjie(temp1);
}
if(fuhao == '+')
{
temp1 = temp1 + temp2;
fenjie(temp1);
}
if(fuhao == '-')
{
temp1 = temp2 - temp1;
fenjie(temp1);
}
if(fuhao == '*')
{
temp1 = temp1 * temp2;
fenjie(temp1);
}
if(fuhao == '/')
{
temp1 = temp2 / temp1  ;
fenjie(temp1);
}

fuhao = '='; 
}  
   
else if(KeyNO==12)    //  +++++
fuhao = '+';
k = 0;

num = 43;  
W_DATA(num); 
temp2 = temp1;
}  
else if(KeyNO==13)   //  ----- 
fuhao = '-';
k = 0;

num = 45;  
W_DATA(num);
temp2 = temp1;  
}
else if(KeyNO==14)   //  *****
fuhao = '*';
k = 0;

num = 42;  
W_DATA(num); 

temp2 = temp1; 
}
else if(KeyNO==15)  //    ////
fuhao = '/';
k = 0;

num = 47;  
W_DATA(num); 

temp2 = temp1;
}

else if(KeyNO==11)  
{
W_CMD(0x01);   //  清屏
Init();
W_CMD(0x80+16);

temp1 = 0;
k = 0;
fuhao = '=';
}
}



 //=================== 外部中断0 =============================//


void Int0 ()  interrupt 0//  外部中断0  负 跳沿触发
{
Keys_Scan();
LED = DSY_CODE[KeyNO];
Beep();
LCD_Show(); 
KEY = 0xf0;
}
 

2018-05-08 23:16:13 qq_40977332 阅读数 10703
  • 《计算机体系结构 硬件篇2》之 计算机通信

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    4193 人正在学习 去看看 张先凤

基于51单片机的简易计算器制作

51单片机可以实现的功能很多,今天笔者介绍一种使用4*4矩阵键盘和八位共阴数码制作的简易计算器。数码管使用的是CL3641AH。原理图如下:捕获

捕获

S15 S11 S7 S3分别是4,5,6,-
S14 S10 S6 S2分别是7,8,9,*

/*  S16 S12 S8 S4分别是1,2,3,+

​```
S15 S11 S7 S3分别是4,5,6,-
S14 S10 S6 S2分别是7,8,9,*
S13 S9 S5 S1分别是0,CLR,=,/
​```

*/

/* 可以实现两个数运算,每个数至多八位  */

# include<reg52.h>

typedef unsigned char uint8;
typedef unsigned int uint16;

sbit rw=P2^5;
sbit rs=P2^6;
sbit e=P2^7;
sbit led=P3^7;

sbit beep=P2^0;
uint8 key,num;
uint8 fuhao;//定义那个具体的符号是加减还是乘除
uint8 flag; //定义有没有按下符号按键,这个是统称
long a,b,c,d;   //定义运算数据的第一个和第二个及等于的数变量
uint8 k; //定义小数点后面显示的位数
uint8 biao;

uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据

void delay(uint16 i)
{

​```
while(i--);
​```

}
void lcdwrc(uint8 c)
{

​```
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(1000);
e=0;
​```

}
void lcdwrd(uint8 dat)
{

​```
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(1000);
e=0;
rs=0;
​```

}

void lcdinit()
{

​```
delay(1500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
delay(500);
lcdwrc(0x38);
lcdwrc(0x08);
lcdwrc(0x01);
lcdwrc(0x06);
lcdwrc(0x0c);
key=0;
num=0;
flag=0;
fuhao=0;
a=0;
b=0;
c=0;
d=0;
biao=0;
led=0;
​```

}

void keyscan()
{

​```
P1=0xfe;   //定义第一行为零,然后判断哪一列按下
if(P1!=0xfe)
{
    delay(1000);
    if(P1!=0xfe)
    {
        key=P1&0xf0;
        switch(key)
        {
            case 0xe0: num=0;break;   //1
            case 0xd0: num=1;break;   //2
            case 0xb0: num=2;break;   //3
            case 0x70: num=3;break;   //¼Ó
        }
    }
    while(P1!=0xfe);
    if(num==0||num==1||num==2)   //确认第一行的数1,2,3
    {
        if(flag==0)  //没有按下符号建
        {
            //led=1;
            a=a*10+dat1[num];   
        }
        else
        {
            //led=1;
            b=b*10+dat1[num];
        }

    }
    if(num==3)
    {
        //led=0;
        flag=1;
        fuhao=1;//加号
    }
    lcdwrd(0x30+dat1[num]);
}
​```

​```
P1=0xfd;                //令第二行为零,然后判断第几行按下
if(P1!=0xfd)
{
    delay(1000);
    if(P1!=0xfd)
    {
        key=P1&0xf0;
        switch(key)
        {
            case 0xe0: num=4;break;   //4
            case 0xd0: num=5;break;   //5
            case 0xb0: num=6;break;   //6
            case 0x70: num=7;break;   //减-
        }   
    }
    while(P1!=0xfd);
    if(num==4||num==5||num==6)
    {
        if(flag==0)  //没有按下符号建
        {
            //led=1;
            a=a*10+dat1[num];   
        }
        else
        {
            //led=1;
            b=b*10+dat1[num];
        }           
    }
    else
    {
        flag=1;
        fuhao=2;//´代表减号
    }
    lcdwrd(0x30+dat1[num]);
}
​```

​```
P1=0xfb;         //令第三行为零,然后判断第几列按下
if(P1!=0xfb)
{
    delay(1000);
    if(P1!=0xfb)
    {
        key=P1&0xf0;
        switch(key)
        {
            case 0xe0: num=8;break;   //7
            case 0xd0: num=9;break;   //8
            case 0xb0: num=10;break;  //9
            case 0x70: num=11;break;  //乘*
        }   
    }
    while(P1!=0xfb);
    if(num==8||num==9||num==10)
    {
        if(flag==0)  //没有按下符号键
        {
            //led=1;
            a=a*10+dat1[num];   
        }
        else
        {
            //led=1;
            b=b*10+dat1[num];
        }           
    }
    else
    {
        flag=1;
        fuhao=3;//代表乘号
    }
    lcdwrd(0x30+dat1[num]);
}
​```

​```
P1=0xf7;         //另第四行为零,然后判断第几列按下
if(P1!=0xf7)
{
    delay(1000);
    if(P1!=0xf7)
    {
        key=P1&0xf0;
        switch(key)
        {
            case 0xe0: num=12;break;  //0
            case 0xd0: num=13;break;  //清楚rst
            case 0xb0: num=14;break;  //等号=
            case 0x70: num=15;break;  //除/
        }   
    }
    while(P1!=0xf7);
    switch(num)
    {
        case 12: 
                if(flag==0)  //没有按下符号键
                {
                    //led=1;
                    a=a*10+dat1[num];
                    lcdwrd(0x30);   
                }
                else
                {
                    //led=1;
                    b=b*10+dat1[num];
                    lcdwrd(0x30);
                }
                break;

        case 13: 
                lcdwrc(0x01);   //清屏指令      
                a=0;
                b=0;
                flag=0;
                fuhao=0;
                break;

        case 15:

                flag=1;
                fuhao=4;
                lcdwrd(0x2f);//除号/
                break;

        case 14: 
                if(fuhao==1)//加
                {
                    lcdwrc(0x4f+0x80);
                    lcdwrc(0x04);//设置光标左移¯,屏幕不移动
                    c=a+b;
                    while(c!=0)  //一位一位显示
                    {
                        lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
                        c=c/10;//取前面的结果数据   
                    }
                    lcdwrd(0x3d); //显示等于号=
                    a=0;
                    b=0;
                    flag=0;
                    fuhao=0;//全部清除为零
                }
                if(fuhao==2)   //减
                {
                    lcdwrc(0x4f+0x80);
                    lcdwrc(0x04);//设置光标左移,屏幕不移动
                    if(a>b)
                        c=a-b;
                    else
                        c=b-a;

                    while(c!=0)  //一位一位的显示
                    {
                        lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
                        c=c/10;//取前面的结果数据   
                    }
                    if(a<b) lcdwrd(0x2d); //显示减号-
                    lcdwrd(0x3d); //显示等号=
                    a=0;
                    b=0;
                    flag=0;
                    fuhao=0;//全部清除为零
                }

                if(fuhao==3)//乘法        
                {
                    lcdwrc(0x4f+0x80);
                    lcdwrc(0x04);//设置光标左移,屏幕不移动
                    c=a*b;
                    while(c!=0)  //一位一位的显示
                    {
                        lcdwrd(0x30+c%10);//显示结果的位置在0x4f的位置
                        c=c/10;//取前面的结果数据   
                    }
                    lcdwrd(0x3d); //显示等于号=
                    a=0;
                    b=0;
                    flag=0;
                    fuhao=0;//全部清除为零    
                }
                if(fuhao==4)
                {
                    k=0;
                    lcdwrc(0x4f+0x80);
                    lcdwrc(0x04);//设置光标左移,屏幕不移动
                    c=(long)(((float)a/b)*1000);//强制转化为long
                    while(c!=0)  //一位一位的显示
                    {
                        k++;
                        lcdwrd(0x30+c%10);//显示接轨的最后一位在0x4f的位置
                        c=c/10;//取前面的结果数据
                        if(k==3)
                        {
                            lcdwrd(0x2e);
                            k=0;
                        }       
                    }
                    if(a/b<0)     //如果a比b小的话那么除的结果最高位是零
                    {
                        lcdwrd(0x30);   
                    }
                    lcdwrd(0x3d); //显示等号
                    a=0;
                    b=0;
                    flag=0;
                    fuhao=0;//全部清除为零
                }
                break;

    }
}
​```

}



void main()
{

​```
lcdinit();
while(1)
{
    keyscan();  
}
​```

}

51单片机延时计算

阅读数 637

没有更多推荐了,返回首页