• 单片机实验的小记录~~PWM


    一、源程序:

    #include
    #define uchar unsigned char
    #define uint unsigned int
    uchar T_H_N = 50;
    uchar T_H_N0 = 50;
    uchar T_N = 100;
    uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

    //定义引脚
    sbit IN1 = P3^5;
    sbit IN2 = P3^4;
    sbit ENA = P3^3;
    sbit K1 = P1^0;
    sbit K2 = P1^1;
    sbit K3 = P1^2;
    sbit n = P2^2;
    sbit e = P2^3;

    //delay function.
    void delay(uint y) //数据类型一致,且此处数据类型要足够大。如:此处为char,延时只能在char范围内。uchar范围0~255.
    {
    uint x;
    for(x = y;x>0;x--);
    }


    //key scan
    void Key_Scan()
    {
    if(K1 == 0)
    {
    delay(20);

    while(!K1);

    T_H_N++;

    if(T_H_N >=99)
    {
    T_H_N =99;
    }

    }
    if(K2 == 0)
    {
    delay(20);
    while(!K2);
    T_H_N--;
    if(T_H_N <= 1)
    {
    T_H_N = 1;
    }
    } if(K3 == 0)
    {
    delay(15);
    while(!K3);
    IN1=~IN1;
    IN2=~IN2;

    }

    }
    //display.
    void display()
    {
    n = 0;//第一位数码管显示“n”。
    P0 = 0x37;
    delay(5);
    n = 1;

    P0 = 0x48;
    e = 0;//第二位数码管显示“=”。
    delay(5);
    e = 1;
    }
    //motor initial.
    void motor_init()
    {
    ENA = 1;
    IN1 = 1;
    IN2 = 0;
    }

    //Timer initial.
    void Timer0_init()
    {
    TMOD = 0x11; //定时器工作方式3.
    TH0 = (65535-5000)/256; //装载初值。
    TL0 = (65535-5000)%6;
    EA = 1; //开总中断。
    ET0 = 1; //开溢出计时。
    TR0 = 1; //启动计时器0.

    }
    void main()
    {
    uchar ge,shi,bai;

    Timer0_init();
    motor_init();
    while(1)
    {
    ge = T_H_N; //ge
    shi = T_H_N/10; //shi
    bai = T_H_N/100; //bai

    delay(5);
    P2 = 0x7f;
    P0 = table[ge];
    delay(5);
    P2 = 0xff;

    delay(5);
    P2 = 0xbf;
    P0 = table[shi];
    delay(5);
    P2 = 0xff;

    delay(5);
    P2 = 0xdf;
    P0 = table[bai];
    delay(5);
    P2 = 0xff;

    display();
    Key_Scan();
    }
    }

    //中断计时改变占空比。
    void Timer0() interrupt 1
    {
    TR0 = 0;
    TH0=(65536-50)/256;
    TL0=(65536-50)%6;
    T_H_N0--;
    if(0 == T_H_N0)
    {
    ENA = 0;
    T_H_N0 = 1;
    }

    T_N--;
    if(0 == T_N)
    {
    ENA = 1;
    T_N = 100;
    T_H_N0 = T_H_N;
    // z = 0;
    }

    }

    二、心得体会

    一、 通过这实验,了解并掌握了PWM法控制电机转速。对电路设计以 及软件编程有了更深入的了解。尤其对中断、中断计时/计数有了新的体验和体会。

    二、 在这个实验中主要遇到三个问题:

    1、对电路原理理解不够,编程时无从下手,不知如何实现目标。解决方案是仔细阅读文档,一步一步理解并实现要求功能。

    2、编程中不细心导致出现很多差错,耽误很多时间:

    (1)延时调用数据类型形参用的是uchar,实参却用大于255的数,导致调用出现随机数。

    (2)在while语句中,忘了加“;”导致进入死循环,在按键查询过程中出错,并且花了很长时间才找到错误所在。

    (3)在对每一位数码管赋值时,没有进行清零,导致数码显示错误。

    3、仍未能使用寄存器对数码管操作,浪费P2引脚。

    总而言之,虽然不细心导致错误很多,但是也因此学会如何简单调试程序,寻找出错误所在。以后编程一定要细心,不再重复犯错,设计也应更加合理。

     

    以上是单片机实验报告一部分,因为在这次实验中自己暴露了很多问题,也由此学会一点调试程序,里面许多错误反应我当前编程水平。在此贴上,以此警醒自己,同时也留个纪念。希望我能继续努力,不断进步,再回首时希望自己不再菜鸟。加油!!!

     

     

  • 相关阅读:
    java开发异常类型汇总
    dm642在线写EPROM.txt
    [Codecademy] HTML&CSS 第一课:HTML Basic
    bram和dram差别
    Advanced Fruits HDU杭电1503【LCS的保存】
    add Admob with Cocos2d-x on iOS
    一种基于Qt的可伸缩的全异步C/S架构server实现(五) 单层无中心集群
    【SSH2框架(理论篇)】--SSH2 Vs 经典三层
    CSS BFC学习笔记
    【智能家居篇】wifi网络结构(上)
  • 原文地址:https://www.cnblogs.com/Ting-Lam/p/4085278.html
Copyright © 2020-2023  润新知