完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛
|
|
|
|
|
|
|
|
|
![]() ![]() {:1:}
|
|
|
|
|
|
|
|
|
顶鸿哥,我是石岩艾美特的,学校也玩单片机,但这里只做硬件,我们的单片机都是单片机代理商写的程序,比如松翰、义隆,我们买他们的单片机,程序他们“免费写”,不知鸿哥有没考虑过这种模式?
|
|
|
|
|
|
|
|
|
这种模式我认为鸿哥不会考虑的,硬件软件分开如果出问题会产生责任推来推去的问题 |
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2013-9-27 09:41 编辑
我目前这个阶段暂时不会考虑这种模式。因为这类家用消费电子程序是很简单的,附加值不是程序,而是单片机芯片本身的价格,而我又不是单片机代理商。经常有人会找我搞这类项目,我第一反应就是直接拒绝。因为这类项目的开发费肯定不会高的。凡是对单片机价格敏感的项目我几乎都不接。而在很多工控,仪器等领域,那么附加值高的才是程序本身,单片机贵10元左右客户根本不介意,所以这类项目你可以选用PIC,AVR,STM32等比较贵的单片机。 |
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2013-9-27 09:49 编辑
我目前这个阶段暂时不会考虑这种模式。这类家用消费电子,程序是很简单的,附加值不是程序本身,而是单片机的价格和出货量,而我又不是单片机的代理商。我经常遇到这类项目,我的第一反应就是直接拒绝,因为这类项目的开发费是不会高的。而在很多工控,仪器等领域,附加值才是程序本身,单片机高10元左右,客户根本不在乎,这个时候你就可以选用PIC,AVR,STM32等单片机。 |
|
|
|
|
|
|
|
|
很不错的建议,谢谢。 |
|
|
|
|
|
|
|
|
我暂时不会考虑这种模式 ,因为我不是代理商,我的核心优势是单片机程序本身 。这类家用消费电子的程序是很简单的,附加值不是程序,而是单片机价格和出货量,开发费是不会高的。我经常遇到这类小家电项目,我的第一反应就是直接拒绝。而在工控仪器等领域,单片机贵10左右,客户根本不在乎,你可以任意选择PIC,AVR,STM32等单片机。 |
|
|
|
|
|
|
|
|
软硬件分离,如果让我搞软件部分的,只要开发费合理我还是会考虑的。但是如果软硬件分离,只 让我搞硬件部分,我是肯定不会考虑的。 dubeixian,你很了解我,肯定看过我不少文章,你现在还在读大学吗?把你的个人的情况在这里跟大家介绍介绍,让大家认识认识。 |
|
|
|
|
|
|
|
|
第五十三节:单片机中的战斗机switch---按键控制跑马灯的启动,停止和暂停
开场白: Switch语句是单片机中的战斗机,是整个程序的灵魂,这句话一点都不夸张。我们只要以Switch语句为支点,再复杂再繁琐的程序都可以轻松地编写出来。 在鸿哥的编程体系中,Switch括号里面的全局变量就是最核心的变量,鸿哥把它定义为步骤变量,后缀统一用_step命名。我们只要根据实际情况灵活控制步骤变量,就可以演绎出无穷的单片机程序。接下来,我将会专门花几个章节来讲switch语句的实战用法。 (1) 功能需求: (a)在运动时,让8个LED灯循环依次点亮,同一时刻只有一个LED灯点亮。 (b)停止按键,相当于复位按键,按下此按键,原来正在运动的跑马灯停止运动。 (c)启动按键,按下此按键,原来停止的跑马灯开始运动。 (d)暂停按键,按下此按键,原来运动的跑马灯暂停,再按一次此键,原来暂停的跑马灯继续运动。 (2) 硬件原理: 利用单片机的8个IO口引脚分别连接到8个LED灯的负极,8个LED的正极分别串接一个510欧的电阻,电阻的另一端都连接到电源VCC上。一般来说,单片机IO口的灌电流比输出的驱动电流要大,所以驱动LED灯的时候,我喜欢用IO口接LED灯的负极,正极经过限流电阻后直接连VCC。 独立按键和有源蜂鸣器的硬件原理请参考本连载文章的第二节。 (3) 源码适合的单片机: PIC16F73,晶振为3.579545MHz。 (4)单片机的C语言源代码讲解: #include #define const_led_on_time 1000 //控制跑马灯速度的数据,当然此数据的大小我没仔细验证过,读者根据实际情况来调整. #define cnt_delay_cnt1 25 //按键去抖动延时阀值 #define cnt_voice_time 60 //蜂鸣器响的声音长短的延时阀值 //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的IO后缀都是_sr #define one_led_dr1 RC0 //控制发光二极管 #define one_led_dr2 RC1 //控制发光二极管 #define one_led_dr3 RC2 //控制发光二极管 #define one_led_dr4 RC3 //控制发光二极管 #define one_led_dr5 RC4 //控制发光二极管 #define one_led_dr6 RC5 //控制发光二极管 #define one_led_dr7 RC6 //控制发光二极管 #define one_led_dr8 RC7 //控制发光二极管 #define beep_dr RB1 //蜂鸣器输出 #define key_sr1 RB6 //独立按键输入 #define key_sr2 RB5 //独立按键输入 #define key_sr3 RB4 //独立按键输入 //补充说明:吴坚鸿程序风格是这样的,按键扫描函数通常放在定时中 //断里,按键服务程序通常放在main函数循环里。有人说不应该把子程序放在中断里,别听他们,信鸿哥无坎坷。 void key_scan(); //按键扫描函数,放在定时中断里 void key_service(); //按键服务函数,放在main函数循环里 void one_led_run(); //跑马灯程序 unsigned long one_led_cnt=0; //延时计数器 unsigned char one_run_step=0; //步骤变量,这就是鸿哥传说中的步骤变量,单片机程序的核心 unsigned char key_lock1=0; //按键自锁标志 unsigned char key_lock2=0; //按键自锁标志 unsigned char key_lock3=0; //按键自锁标志 unsigned int delay_cnt1=0; //延时计数器的变量 unsigned int delay_cnt2=0; //延时计数器的变量 unsigned int delay_cnt3=0; //延时计数器的变量 unsigned int voice_time_cnt; //蜂鸣器响的声音长短的计数延时 unsigned char key_sec=0; //哪个按键被触发 unsigned char start_flag=0; //跑马灯的运动变量,它为1时代表运动,为0时代表停止。 unsigned char pause_flag=0; //跑马灯的暂停变量,它为1时代表不暂停,为0时代表暂停。 main() //主程序 { ADCON0=0x41; //设置AD模式 ADCON1=0x04; //RA0作为AD输入通道,本程序中没有用到AD,不用管它 TRISC=0x00; //LED灯的IO口设置成输出 one_led_dr1=1; //初始化,全部LED灯都灭 one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; TRISB1=0; //蜂鸣器设置成输出 beep_dr=0; //上电初始化蜂鸣器 TRISB6=1; //独立按键设置成输入 TRISB5=1; //独立按键设置成输入 TRISB4=1; //独立按键设置成输入 T1CON=0x24; //定时中断配置 TMR1H=0xFE; TMR1L=0xEF; INTCON=0xC0; TMR1IF=0; TMR1IE=1; PEIE=1; //外围中断允许 GIE=1; //开总中断 TMR1ON=1; //启动定时器中断 while(1) { CLRWDT(); //喂单片机内部自带的看门狗,大家可以不管它 one_led_run(); //跑马灯程序 key_service(); //按键服务 } } void one_led_run() //跑马灯程序 { if(start_flag==1) //处于运动状态 { switch(one_run_step) { case 0: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=0; //第1个LED灯被点亮 one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=1; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 1: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=0; //第2个LED灯被点亮 one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=2; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 2: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=0; //第3个LED灯被点亮 one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=3; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 3: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=0; //第4个LED灯被点亮 one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=4; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 4: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=0; //第5个LED灯被点亮 one_led_dr6=1; one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=5; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 5: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=0; //第6个LED灯被点亮 one_led_dr7=1; one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=6; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 6: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=0; //第7个LED灯被点亮 one_led_dr8=1; one_led_cnt=0; //延时计数器清零 one_run_step=7; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; case 7: if(one_led_cnt>const_led_on_time) //LED灯亮的延时时间 { one_led_dr1=1; one_led_dr2=1; one_led_dr3=1; one_led_dr4=1; one_led_dr5=1; one_led_dr6=1; one_led_dr7=1; one_led_dr8=0; //第8个LED灯被点亮 one_led_cnt=0; //延时计数器清零 one_run_step=0; //这就是鸿哥传说中的怎样灵活控制步骤变量 } break; } } } void key_scan() //按键扫描函数 { if(key_sr1==1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位 { key_lock1=0; //按键自锁标志清零 delay_cnt1=0; //按键去抖动延时计数器清零,此行非常巧妙,仔细品味,回味无穷,在按键去抖动期间,如果低电平掺杂了干扰的高电平,则计数器重新清零计数,极大增强了抗干扰的能力。 } else if(key_lock1==0) //有按键按下,且是第一次被按下 { ++delay_cnt1; //延时计数器 if(delay_cnt1>cnt_delay_cnt1) { delay_cnt1=0; key_lock1=1; //自锁按键置位,避免一直触发 key_sec=1; //触发1号键 } } if(key_sr2==1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位 { key_lock2=0; //按键自锁标志清零 delay_cnt2=0; //按键去抖动延时计数器清零,此行非常巧妙,仔细品味,回味无穷,在按键去抖动期间,如果低电平掺杂了干扰的高电平,则计数器重新清零计数,极大增强了抗干扰的能力。 } else if(key_lock2==0) //有按键按下,且是第一次被按下 { ++delay_cnt2; //延时计数器 if(delay_cnt2>cnt_delay_cnt1) { delay_cnt2=0; key_lock2=1; //自锁按键置位,避免一直触发 key_sec=2; //触发2号键 } } if(key_sr3==1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位 { key_lock3=0; //按键自锁标志清零 delay_cnt3=0; //按键去抖动延时计数器清零,此行非常巧妙,仔细品味,回味无穷,在按键去抖动期间,如果低电平掺杂了干扰的高电平,则计数器重新清零计数,极大增强了抗干扰的能力。 } else if(key_lock3==0) //有按键按下,且是第一次被按下 { ++delay_cnt3; //延时计数器 if(delay_cnt3>cnt_delay_cnt1) { delay_cnt3=0; key_lock3=1; //自锁按键置位,避免一直触发 key_sec=3; //触发3号键 } } } void key_service() //按键服务函数 { switch(key_sec) //按键服务状态切换 { case 1:// 1号键 停止按键 相当于复位按键 if(start_flag==1) //处于运动状态,则停止 { start_flag=0; //停止 pause_flag=0; //暂停 one_run_step=0; //步骤变量复位 one_led_cnt=0; //延时计数器清零 } voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零,避免一直触发 break; case 2:// 2号键 启动按键 if(start_flag==0) //在停止的状态时,则启动 { start_flag=1; //启动 pause_flag=1; //解除暂停标志 } voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零,避免一直触发 break; case 3:// 3号键 暂停按键 if(start_flag==1) //正在运动中 { if(pause_flag==0) { pause_flag=1; } else { pause_flag=0; } } voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 key_sec=0; //相应完按键处理程序之后,把按键选择变量清零,避免一直触发 break; } } void interrupt timer1rbint(void) //中断程序入口 { if(TMR1IE==1&&TMR1IF==1) //定时中断程序 { TMR1IF=0; TMR1ON=0; key_scan(); //按键扫描函数 if(one_led_cnt<0xffffffff) //不要超过最大long类型范围 { if(pause_flag==1) //处于不暂停的状态 { one_led_cnt++; //第1路延时计数器 } } TMR1H=0xFF; TMR1L=0xC8; TMR1ON=1; } } (5)下集预告: 单片机中的战斗机switch---工业自动化设备的运动控制 (未完待续,下节更精彩,不要走开哦!) |
|
|
|
|
|
|
|
|
本帖最后由 dubeixian 于 2013-9-27 12:25 编辑
回鸿哥,我08年毕业了,比你小1岁,一直都是在珠海做上位机软件开发的,今年6月份开始有个想法,就是想转行搞搞硬件和单片机开发,所以对于鸿哥这样大师级的人物我要多多学习。虽然年纪不小了,但也想搞搞自己以前感兴趣的东西呀。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
没,我没有说做硬件,只是觉得和我们公司合作的那些做程序的代理单片机,虽然程序简单,但单片机代理有量利润就大,程序附加值只是一次性的,而如果像这样代理的话其实程序维护不需要多少,一劳永逸,十年前写得程序客户现在还在做这款单片机的话依然还在赚钱。应该算是从做技术到做市场的一种过渡吧。当然我绝对不是要建议鸿哥做这个,我在这公司现在就一打杂的呢呵呵,我只是觉得这种商业模式还不错,应该也挺赚钱,所以大胆提出来。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
很有用,谢谢lz哈哈哈哈
|
|
|
|
|
|
|
|
|
鸿哥好,因为去山西出差好久没来了,自己做的产品终于安装调试完了,这还得多谢鸿哥分享了这么多的经验,帮助那是相当的大啊,呵呵。。今天又要出差了,先把鸿哥更新的程序拷贝下来,慢慢研究。可惜矿上没网络,要不然的天天来看看。呵呵。。。。作为刚入这一行新手的我,向鸿哥致敬!一路追随鸿哥的脚步。
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2382 浏览 1 评论
4241 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2619 浏览 2 评论
3118 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4576 浏览 5 评论
有套STM32与西门子200程序需要代写,有兴趣的工程师与有联系!
2489浏览 1评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6799浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-15 11:46 , Processed in 1.078161 second(s), Total 85, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖