完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
` Elecfans论坛高手问答第1期 朱兆琪在线解答单片机C语言编程 本期高手问答(6月30日-7月6日)我们请来了 @zzq宁静致远 为大家解答关于单片机C语言编程方面的问题。 @zzq宁静致远 朱兆琪,我相信大家不陌生。目前深圳市馒头科技有限公司总经理,在论坛连载多个技术贴,从C语言到STM32到蓝牙4.0,引起大家的强烈反响,熟知嵌入式开发。著有《嵌入式Linux开发实用教程》一书,关于朱兆琪,点此了解更多 Elecfans高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。 下面欢迎大家就单片机C语言编程方面问题向 @zzq宁静致远 提问,请直接在回帖中提问。 为了鼓励大家踊跃提问,特准备两本《嵌入式Linux开发实用教程》作为幸运奖品,届时将有 @zzq宁静致远 从所有提问者中抽取赠予此书。
|
|
相关推荐
68个回答
|
|
|
|
|
|
|
|
|
朱总今天早上坐飞机去拉萨旅游了,一个星期后才回来。我帮他回答你的问题。 单片机的C语言和标准的C语言有什么区别?就像广东人讲的普通话跟标准的普通话有什么区别一样,广东人讲的普通话会带有地方特色,有地方口音。但是大体上跟标准普通话没有大的差别。单片机的C语言主要目的是用来开发单片机,它在标准C语言的基础上,会增加若干条专用指令,也会减少标准C语言部分原有的指令功能,它是专门为某个单片机定制的C语言。比如C51的编译器,就多增加了一条操作硬件IO口的指令 ***it xx = P1^0;另外,不同厂家的单片机,它们的C语言编译器所支持的C语言也会有略微的差别,但是差别不大。比如C51定义的常量是用code关键字,而PIC单片机各系列的编译器PICC,PIC18,C30等则用const关键字来定义常量。 |
|
|
|
|
|
朱总今天早上坐飞机去拉萨旅游了,一个星期后才回来。我帮他回答你的问题。 (1)const和code这两个关键字的意义是一样的。只是在51单片机里面定义常量用code,而在pic,stm32等单片机里面,定义常量用const。名字虽然不一样,但是用法完全一样。 (2)我们平时定义的数据,如果前面带了code或者const,那么编译就会把他分配到ROM区,放到ROM区的数据只能读,不能改写,掉电后重新上电数据不丢失。如果不带code或者const的 数据,那么编译就会把他分配到RAM区,RAM区的数据可以读,也可以改写,掉电后重新上电数据会丢失。 (3)存在ROM区的内容有凡是带code或者const关键字的常量。以及我们写的if,for,whle等指令程序。 (4)存在RAM区的内容有凡是没有带code或者const关键字的全局变量和局部变量。 (5)RAM区的容量比ROM区的容量小很多。比如常用的51单片机,RAM区只有256个字节左右,而ROM区却有8K字节那么多。所以一般不用更改的数据前面都带code或者const关键字,都放在ROM区,比如数码管程序中的字模数组都带code或者const关键字。 (6)在单片机中,RAM区是宝贵的稀缺资源,我们要且行且珍惜。 |
|
|
|
|
|
朱总今天早上坐飞机去拉萨旅游了,一个星期后才回来。我帮他回答你的问题。 其实你这个问题不好回答,因为很笼统。分两种情况: (1)大部分的实战系统,单片机驱动步进电机的时候,都不会直接去驱动的,单片机与步进电机之间还会用专门的驱动芯片,单片机只要把一个上升沿或者下降沿的脉冲给驱动芯片,驱动芯片就会自动让步进电机转动一个步距角。 (2)如果是单片机直接经过mos管来驱动步进电机,那么就要写一些驱动程序,这个程序应该不难,网上有很多参考资源,你可以在百度上找找看。 |
|
|
|
|
|
多谢吴老师详细的讲解 受教了 也祝朱老师旅游开心 ![]() |
|
|
|
|
|
谢谢老师的回答。网上都是些汇编语言写的没有找到C写的。汇编语言写的一点都看不懂,没法下手修改,有没有办法转换成C的。比如这个程序: ;****************************************************************** ; 步进电机步进角为 1.8度,一圈 360 度=200步 ; 双四拍工作方式: ; AB-BC-CD-DA ; 单双八拍工作方式: ; A-AB-B-BC-C-CD-D-DA ;-------------------------------------------------------------------- ; A组线圈对应 P1.0 ; B组线圈对应 P1.1 ; C组线圈对应 P1.2 ; D组线圈对应 P1.3 ;-------------------------------------------------------------------- K0 Bit P3.2 K1 BIT P3.3 K2 BIT P3.5 K3 BIT P3.4 ;-------------------------《步进电机2051驱动》------------------------ org 0000H ajmp START org 0030H ;------------------------ -《初始赋值》------------------------------ START: mov P1,#00H mov r0,#01H ;-------------------------《主程序循环》------------------------------ MAIN: *** K3,MAIN3 MAIN1: *** K0,MAIN4 Jb K1,MAIN2 acall FFW jmp MAIN4 MAIN2: acall REV jmp MAIN4 MAIN3: mov P1,#00H MAIN4: JMP MAIN ;-------《电机正转输出一个脉冲后等待时钟信号为高电平时返回》----------- FFW: MOV A,R0 JB K2,FFW1 MOV DPTR,#TABLE_8 JMP FFW2 FFW1: MOV DPTR,#TABLE_4 FFW2: MOVC A,@A+DPTR MOV P1,A INC R0 MOV A,R0 MOVC A,@A+DPTR CJNE A,#0FFH,FFW3 mov R0,#01H FFW3: *** K0,FFW4 jmp FFW3 FFW4: RET ;--------《电机反转输出一个脉冲后等待时钟信号为高电平时返回》---------------- REV: MOV A,R0 JB K2,REV1 MOV DPTR,#TABLE_8 JMP REV2 REV1: MOV DPTR,#TABLE_4 REV2: MOVC A,@A+DPTR MOV P1,A dec R0 MOV A,R0 MOVC A,@A+DPTR CJNE A,#0FFH,REV3 *** k2,REV_4 mov R0,#08H jmp REV3 REV_4: mov R0,#04H REV3: *** K0,REV4 jmp REV3 REV4: RET ;------------------------《单双八拍工作方式》--------------------------------- TABLE_8: DB 0FFH,88H,0CCH,44H,66H,22H,33H,11H,99H,0FFH ;正转表 ;------------------------《双四拍工作方式》----------------------------------- TABLE_4: DB 0FFH,0CCH,66H,33H,99H,0FFH ;正转表 ;------------------------------------------------------------------------------ END 实验效果很好,但有一个问题,当停止时P1口保持原来的状态电机因一直通电而过热。如能改成停止一定时后p1口复位为高电平电机就不通电了,当有控制脉冲到来时电机又运转。 |
|
|
|
|
|
|
|
|
|
|
|
汇编我都忘光了,你等朱总回来后问问他。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
要看高手写的程序。。。 |
|
|
|
|
|
|
|
|
|
|
|
一个逗号就相当于一个空指令,可用NOP的那个空指令代替,延时时间就是芯片执行这些空指令的时间,与芯片指令周期时间有关。空格或回车键分行都是没有任何影响的。。。 |
|
|
|
|
|
那个K0就是那个停止键吧,都跳转到 RET,子程序退出,要做IO口复位的就可以试着在这RET前加上相应的复位指令。。。 就步进电机的控制程序,网上都有C语言的啊。就是不同的给IO控制口输出数据,可以放在主循环里,也可以放在定时器里(推荐这个,你懂得),数据间的延时可以控制转速,但延时不能短,数据变化太快步进电机会“眼花头晕”启动不了。。 http://zhidao.baidu.com/question/583101205.html?oldq=1 |
|
|
|
|
|
谢谢。 k0,k1,k2,k3为4组跳线。实际使用是:P3.2接上位机Clock,P3.3接上位机CW控制正反转,P3.4接上位机EN使能,P3.5用跳线帽设置4拍或8拍。当上位机Clock发一串脉冲电机就转动起来了,脉冲间隔的长短控制电机转速。假设初始P1口是0FFH,当上位机Clock发一个脉冲P1口变成88H,电机转过一个步进角,再发一个脉冲P1口变成0CCH,电机又转过一个步进角。我上面说的那个汇编程序能做到。我的问题是:1)如何能把它转换成C程序,因为汇编难懂。2)当上位机Clock停发脉冲(或脉冲间隔太长)P1口会保持当时的状态,如何实现这个时间长到一定后P1口回到初始的0FFH。比如前面说的再发一个脉冲P1口变成0CCH后电机是一通电的,时间长了电机发烫。 |
|
|
|
|
|
想学单片机,不知道要看哪些知识。
|
|
|
|
|
|
|
|
|
|
|
|
既然程序流程都很清楚了就不用管它什么汇编了,想着用C的方式把功能写出了就好了。。我觉得你这个可以这样 ,1)不知你用的是不是P32为外部中断的单片机,若是就在外部中断里写P1口数据数据,那些使能,正反转,4拍8拍的就分别用一个标志位来判断,通过判断对应的IO口来修改这些标志位,通过判断这些标志位来写相应的功能。。。2)这个可以用定时器,每次脉冲进来就对定时器进行初始化并开始计时,当计时到一定时仍没有新的脉冲进来就对P1口设置一下。。。。。我也不才,希望这对你有所帮助。。。(我不解,为啥非得用上位机的脉冲来驱动电机。上位机修改一些标志位就好了,电机转动直接单片机上写不就可以了)。。。 |
|
|
|
|
|
|
|
|
|
|
|
谈谈我个人的体会。我觉得有点C语言基础就可以开始学单片机了,在学单片机的时候,如果发现哪些不懂,再回过头来翻书找资料看,我当年就是这样走过来的。 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
455 浏览 0 评论
1247 浏览 2 评论
739 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1548 浏览 0 评论
2499 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16899 浏览 31 评论
浏览过的版块 |
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 17:11 , Processed in 1.483796 second(s), Total 79, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
25862