完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
51单片机如何同时执行不同的功能
我们来举个栗子,想要单片机在执行流水灯的时候同时执行心形流水灯(或者数码管),单单考虑利用C语言的逻辑来是很难达到的,因为代码是从第一行按顺序执行到最后一行,所以,按照C语言逻辑,只能运行完流水灯,再到心形流水灯,不能够达到同时运作的效果,所以,我们需要用到单片机内部提供的定时器功能,让定时器产生的中断一起工作,这样就可以达到同时执行流水灯,和心形流水灯同时运作的效果。 #include typedef unsigned int uint;//重新定义数据类型的名字 typedef unsigned char uchar; uchar code led[17] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//心形流水灯 //uchar code led1[17] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//测试代码 void T0_init()//定时器T0初始化 { TMOD=0x01; //初始化定时器值 TH0=(65536-50000)/256; TL0=(65536-50000)%256; //打开中断 EA=1; TR0=1; ET0=1; } //软件延时xms void delay_ms(uint ms) { uchar i; while(ms--) for(i=115;i>0;i--); } //闪烁灯 void shansuodeng_led() { P0=0xaa; P2=0xaa; delay_ms(500); P0=0x55; P2=0x55; delay_ms(500); } //心形流水灯 void liushuideng() { uchar i; for (i=0;i<8;i++) { P2=0xff; P0=~led; //取反因为我的数组状态与实际不符,用取反来补 delay_ms(100); } for (i=0;i<8;i++) { P0=0xff; P2=~led; delay_ms(100); } } //主函数 void main() { T0_init(); //函数调用,定时器初始化 while(1) { liushuideng(); shansuodeng_led(); } } //T0中断服务函数 void T0_ISR()interrupt 1 { uchar j,i; //重装初值 TH0=(65536-50000)/256; TL0=(65536-50000)%256; i++; if(i==10) //计时0.5s { i=0; P1=~led[j++]; //P1流水灯 if(j==8) j=0; } } } |
|
|
|
只有小组成员才能发言,加入小组>>
2316 浏览 0 评论
842浏览 2评论
484浏览 1评论
1360浏览 0评论
246浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-22 02:15 , Processed in 1.268921 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号