完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/***********************************************************/
//芯片型号; STC11F02E //程序功能: 用一个按键 实现按一下 P1口的流水灯速度调节 // 连续按两下实现P1口的LED以隔一个亮的模式 // 主要针对定时器中断以及外部中断进行练习 /************************************************************/ #include "reg51.h" #define FOSC 18432000L // 选择外部晶振 18.0592MHZ #define MODE 1T // 配置为1T模式 #ifdef MODE 1T //判断是否工作在1T模式 #define tiMS (65536 - FOSC/1000 ) //是的话 按照1T 对初值进行赋值 #else #define TIMS (65536 - FOSC/12/1000) //反之 按照12T对初值进行赋值 #endif sfr AUXR = 0X8E; //辅助寄存器的地址 sfr P1M0 = 0X92; //给出地址 sfr P1M1 = 0X91; sfr P3M0 = 0xb2; sfr P3M1 = 0xb1; ***it P37 = P3^7; unsigned int count =1000 ; // 针对1MS的定时器中断 给的进入1000次 正好是1S unsigned int SPEED =1000; // 速度的调节 unsigned int scan_count = 0; // 作为按键消抖 unsigned int scan_correct = 500; // 作为按键消抖 unsigned int scan_mode=0; //作为按键的模式计数 unsigned int led_mode; //作为按键的模式选择 unsigned int delay_count ; //延时计数 void TIMER1_Config(); void Exint_Config(); void Scan_Config(); void main() //主函数 { P3M0 = 0X00; P3M1 = 0X0F; P1 = 0XFf; P37 = 0; Exint_Config(); TIMER1_Config(); while(1); } void TIMER1_Config() //定时器1初始化函数 { #ifdef MODE 1T //如果是1T AUXR = 0X40; //对辅助函数进行赋值 选择1T模式 #endif TMOD = 0X10; //定时器模式寄存器 选择16位定时器 TH1 TL1 都用 TL1 = TIMS; //赋低八位初值 这个初值很有意思 是65536-FOCS/1000 我们来计算定时时间 (65536 - 65536 + FOSC/1000)*1/fosc = 1MS TH1 = TIMS>>8; //赋高八位初值 TR1 = 1; //定时器T1的控制位 允许计数 ET1 = 1; //定时器T1的溢出中断允许位 允许溢出中断 EA = 1; //开启总中断 count = 0; } void TIMER1()interrupt 3 using 1 //定时器1中断 { scan_mode+=1; TL1 = TIMS; TH1 = TIMS>>8; if(led_mode == 0) //流水灯模式 { if(count-- ==0) { count = SPEED; // 1MS*1000 = 1S if(P1 == 0) P1 = 0XFE; else P1 =P1<<1; } } if(led_mode == 1) //整体翻转模式 { P1 = 0x55; } } void Exint_Config() //外部中断1 P3.3口 { IT1 = 1; // 下降沿触发中断 EX1 = 1; // 外部中断1允许 EA = 1; // 开启总中断 } void exint1()interrupt 2 //外部中断服务函数 { if(scan_mode <=1000 ) //这里用这一个标志来进行对于按键的按下次数的判断 因为scan_mode的变化是在定时器中断的服务函数当中的 这里计数1000 就是进入1000次 正好是1S { for(scan_count=0;scan_count<=scan_correct;scan_count++); // 给一个按键的消抖 led_mode = 1; // 设置为模式1 while(scan_count--); // 按键消抖 } else { led_mode = 0; //既然不是模式1 那么就是模式0 也就是单次激发的模式 scan_mode = 0; //将SCAN_MODE 清零 for(scan_count=0;scan_count<=scan_correct;scan_count++); // 消抖 if(++scan_count>=scan_correct) { P37 =~P37; //该模式下 实现流水灯的调速 if(SPEED>100) SPEED -=100; else SPEED = 100; } while(scan_count--); } } |
|
相关推荐
|
|
给入门者点个赞。
|
|
|
|
|
|
谢谢楼主的分享
|
|
|
|
|
|
1107 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1055 浏览 2 评论
2159 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1253 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1678 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 10:06 , Processed in 0.565981 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号