历史上的今天
返回首页

历史上的今天

今天是:2025年01月23日(星期四)

正在发生

2020年01月23日 | 单片机驱动带编码器直流电机 源程序

2020-01-23 来源:51hei

#include

//单片机头文件,储存一些殊寄存器的地址声明

#include        

//intrins头文件储存51编程中需要使用到空指令_nop_()、字符循环移位指令_crol_等

#include

//stdio : "standard input & output"(标准输入输出),C/C++头文件,把多个编译单元(.c或者.cpp文件)公用的内容,单独放在一个文件里减少整体代码尺寸


#define usint unsigned short int        //符号短整型

#define uchar unsigned char                        //无符号字符型

#define uint unsigned int                          //无符号整型

#define VALID        0                                        //0

#define INVALID        1                                        //1

#define LCD_data P0                            //LCD数据端口P0


sbit LCD_RS = P2^7;                        //LCD命令和数据控制位,1:写数据位,0:写命令

sbit LCD_RW = P2^6;                        //LCD读写控制位

sbit LCD_EN = P2^5;                        //LCD使能位


sbit IN1 = P2^0;                        //电机

sbit IN2 = P2^1;

sbit ENA = P2^3;


uchar code title2[] = {"电机转速:"};

uchar code ascii[] = 

{0x31,0x32,0x33,0x41,0x34,0x35,0x36,0x42,0x37,0x38,0x39,0x43,0x2A,0x30,0x23,0x44};   //数字和常用字符的ascii码

uint n = 0;                                        //T0定时中断响应次数

uint n_pwm = 0;                                //用于调节pwm占空比

uint c = 0;                                        //外部计数中断响应次数

uint flag_T0 = 0;                        //定时器T0溢出flag

uchar th = 0;                                //脉冲计数计算时的临时变量高位

uchar tl = 0;                                //……………………………………………低位

uint num_pulse;                                //脉冲个数

void delay_1ms(uint z){     //延时函数1ms  

        uint x,y; 

        for(x = z; x > 0; x--) 

                for(y = 920; y > 0; y--); 

}

void write_cmd(uchar cmd){  //LCD写命令函数 

        LCD_RS = 0; 

        LCD_RW = 0; 

        LCD_EN = 0; 

        P0 = cmd; 

        delay_1ms(6); 

        LCD_EN = 1; 

        delay_1ms(6); 

        LCD_EN = 0; 

}

void write_dat(uchar dat){  //LCD写数据函数 

        LCD_RS = 1; 

        LCD_RW = 0; 

        LCD_EN = 0; 

        P0 = dat; 

        delay_1ms(5); 

        LCD_EN = 1; 

        delay_1ms(5); 

        LCD_EN = 0; 

void lcd_pos(uchar X,uchar Y){  //X表示LCD的行数,Y表示LCD的列数 

        uchar pos; 

        if(X == 0){

                X = 0x80;

        } 

        else if(X == 1){

                         X = 0x90;

                 } 

                 else if(X == 2){

                                   X = 0x88;

                          } 

                          else if (X == 3){

                                                X = 0x98;

                                   } 

        pos = X+Y ; 

        write_cmd(pos);    //显示地址 

}

void lcd_init(){          

        uchar i = 0;                                   

        write_cmd(0x30);   //基本指令操作 

        delay_1ms(5); 

        write_cmd(0x0C);   //显示开,关光标

        delay_1ms(5); 

        write_cmd(0x01);   //清除LCD的显示内容

        delay_1ms(5);

        lcd_pos(0,0);       //将LCD光标定位到第一行第一列            

}

void pulse_dispaly(uint fe)                //显示脉冲个数

{

        uchar i = 0;

        uchar f[7];

                for(i = 0; i < 7; i++)

                        f[i] = '0';

                f[0] = ((fe)/100000)                     +0x30;//十万位的数字

                f[1] = ((fe)%100000)/10000                +0x30;//万位的数字

                f[2] = ((fe)%10000)/1000                +0x30;//千位的数字

                f[3] = ((fe)%1000 )/100                 +0x30;//百位的数字

                f[4] = ((fe)%100  )/10                  +0x30;//十位的数字

                f[5] = ((fe)%10   )                     +0x30;//个位的数字

                f[6] = '';

        i = 0;

        lcd_pos(1,5);                            //将光标定位到第2行第6列开始显示

        while(f[i] != ''){

                write_dat(f[i]);

                i++;

        }        

}

void display_text(int pos, uchar *text){        //显示一段字text、pos设置在第几行开头显示

        uchar j;

        lcd_pos(pos,0);

        while(text[j]!=''){

                write_dat(text[j]);

                j++;

        }

        j=0;

}

void INIT(){                                //初始化函数

        TMOD = 0X51;                        //定时器初始化0101_0001                                                

        TH0 = (65536-922)/256;        //定时器初值(1ms),0.001s/(1.085*10^(-6))s=922

        TL0 = (65536-922)%256;

        TH1 = 0X00;        //计数器初值

        TL1 = 0x00;

        ET0 = 1;                //允许中断T0

        ET1 = 1;

        EA = 1;                //总中断开放

        TR0 = 1;                //启动T0

        TR1 = 1;                //启动T1

        IN2 = 0;                //电机初始化

        IN1 = 1;

        ENA = 0;

}

void main(){

        uchar i;

        INIT();

        lcd_init();                                        //LCD初始函数

        display_text(1, title2);        //在第2行开头显示 "电机转速:"

        while(1){

                if (flag_T0 == 1){                //1s

                        /*脉冲计数(电机转速通过脉冲个数的方式输出)*/

推荐阅读

史海拾趣

DESCO公司的发展小趣事

面对数字化浪潮和智能制造的兴起,DESCO公司积极拥抱变革。公司投入大量资金引进先进的自动化设备和智能化生产线,提高生产效率和产品质量。同时,DESCO还加强了数字化营销和客户服务体系建设,提升了客户体验和市场响应速度。这些举措使公司在激烈的市场竞争中保持了领先地位。

EXCELSEMI [ EXCEL SEMICONDUCTOR INC. ]公司的发展小趣事

EXCELSEMI公司自创立之初,就致力于半导体技术的研发与创新。在早期,公司研发团队成功攻克了高性能半导体材料的生产技术难题,这一技术突破为公司后续的产品开发奠定了坚实基础。随着技术的不断进步,EXCELSEMI在半导体芯片设计、制造和封装等领域都取得了显著成果,逐渐在市场中崭露头角。

HM International公司的发展小趣事

为了满足不同客户的需求,EXCELSEMI公司不断扩展产品线。除了传统的半导体芯片产品外,公司还涉足了功率半导体、传感器、智能模块等领域。通过多元化的产品线布局,EXCELSEMI能够为客户提供一站式解决方案,增强了市场竞争力。

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

在1948年,Günter Bals在完成了建筑公司的学徒实习后,决定创立自己的运输公司。他凭借自己的勤奋和才智,很快建立起了一支由14辆卡车组成的运输队伍,并在德国本地开展货运代理业务。这一阶段的创业经历不仅锻炼了Bals的商业头脑,也为他日后在电子行业的发展积累了宝贵的资金和经验。

Corstat Containers公司的发展小趣事

在环保意识日益增强的背景下,Corstat Containers公司积极响应,推出了可回收、可降解的环保电子元件包装盒。这一产品不仅满足了市场对环保产品的需求,还为公司赢得了良好的社会声誉。同时,公司还加大了对环保技术的研发投入,不断推出更加环保、高效的电子产品包装解决方案,进一步巩固了其在电子行业的领先地位。

达晶微(CREATEK)公司的发展小趣事

为了加强研发实力和应用能力,达晶微在上海设立了研发中心和应用中心。这些中心汇聚了来自全球的优秀人才和先进技术,为公司提供了强大的技术支持和创新动力。通过不断研发新产品和拓展新领域,达晶微在电子行业中保持了领先地位。

问答坊 | AI 解惑

用过I.MX31或MC13783的大侠请帮助一下

我现在正在设计I.MX31的板子,遇到一些关于MC13783的问题,因其资料很少,所以不知道怎么使用,有没有用过的能否指点一二,或者我这里I.MX31开发板的资料,有大家也有这款芯片开发板资料的话,我们可以交换一下的.我的邮箱是qu888@sohu.com…

查看全部问答>

Crest Factor Reduction for OFDMA Systems

Introduction Crest factor reduction (CFR) is a technique for reducing the peak-to-average ratio (PAR) of an orthogonal frequency division multiplexing (OFDM) waveform. An OFDM signal is made up in the frequency domain as a set o ...…

查看全部问答>

AD中两个元件相距太近时报错,怎么办?

AD中两个元件相距太近时报错,在哪里可以调节这个这个值啊(允许的最小间距)…

查看全部问答>

锂电池成为真命天子要过5道坎!

目前混合动力汽车主要采用镍氢电池技术,但镍氢电池的一些技 术性能如能量密度、充放电速度等已经接近理论极限值。而锂电池具有能量密度高、容量大、无记忆性等优点,得到汽车厂商和电池厂商的一致认可,目前各国研发 的重点正是锂离子电池。 &n ...…

查看全部问答>

wince下读写注册表的问题??

我想做一个读写注册表的程序,可是现在遇到的问题是用的RegQueryValueEx函数老是不对,一直不能返回error_sucess,往里写的数据用注册表读写工具看也是乱码?往达人指点…

查看全部问答>

pxa270 ce5.0电源管理源码谁有,能给一份来参考下吗?

       目前我正在做pxa270平台,windows ce5.0系统,现在就只是简单的休眠啊,挂起啊之类的,有谁实现稍微复杂点的功能啊,如系统空闲的情况下降低CPU的频率,电压等。有的吗?100分送上…

查看全部问答>

通过以太网bootloader下载程序的方法

     很多芯片出厂的时候在开始地址处放有bootloader。比如在0x0~0x1000处。只不过经过我们烧写一次之后,就把这个位置的bootloader给擦掉了。 先简单说下步骤,然后再说程序该怎么改: 1.先下载以太网的bootloader到0x0处, ...…

查看全部问答>

请教Modbus高手makesoft:实现Modbus协议一定需要超时检测吗?

首先声明,我对Modbus不熟悉,尤其是如何实现它,最近才从网上下载了协议研究了一下,特此向高手请教。搞清楚这些问题,才能有效地在芯片中实现相应的功能,满足大家的需要。此帖的目的是继续另一帖的讨论:建议STM32的芯片加上串口超时功能, ...…

查看全部问答>

lm3s的i2c控制器与lwip回调函数冲突

大家好,我是使用i2c控制器中断,总线接了一个时钟芯片   正常情况下对时钟芯片,使用i2c总线中断方式读写都很正常,   当使用串口对设备工作情况进行查询时,一切正常,查询时有去读时钟的时间   可当使用网口,使用lwip对设 ...…

查看全部问答>

分析PCB设计布通率及设计效率技巧

 来源pcb网   http://www.hampoo.com     引言:PCB布线设计中,对于布通率的的提高有一套完整的方法,在此,我们为大家提供提高PCB设计布通率以及设计效率的有效技巧,不仅能为客户节省项目开发周期,还能最大限度的保证 ...…

查看全部问答>