十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
外部中断的常用功能
创新互联是一家专业提供曲阜企业网站建设,专注与成都网站制作、成都网站建设、H5响应式网站、小程序制作等业务。10年已为曲阜众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。
外部中断经常用来记录外部脉冲的个数,也就是当我们使用外部中断1时,如果想记录自身单片机的某个引脚的下降沿个数,只需用杜邦线把这个引脚和P3.3连接即可。
比如P2.3引脚产生这样的电平无规律跳转,则下降沿的个数为茄悉雀5
所以我们就用外部中断1来实现记录K4按键从按下到松手的抖动过程中经历了多少个下降沿,把下降沿的个数显示在数码管上。
2.程序陆睁思路
我们定义一个16位的全局变量pulse用来记录P2.3下降沿的个数,在中断函数中的任务就是简单的pulse自加,因为引脚遇到下降沿就会进入中断函数。
在主函数里就是负责数码管显示即可。
3.代码#include
#include //详见第六章第8讲
u16 pulse=0;
void main()
{
u16 x,PULSE_buf;
IT1 = 颤早1; //下降沿触发模式
EX1 = 1;
EA = 1;
LED_Init();//初始化LED硬件模块
KEY_Init();//初始化按键功能模块
ShowNumber(pulse);
while(1)
{
SEG_Scan();
if(PULSE_buf!=pulse)ShowNumber(pulse);//pulse不再是前一次的值,也就是pulse数值更新了,所以数码管缓存区也要更新pulse的数值以便显示出来
x++;
if(x=50)//隔一段时间过来记录此时的pulse数值
{
x=0;
PULSE_buf=pulse;
}
}
}
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
pulse++;
}
大家多按几次K4,发现按下后松手的一个动作里有时pulse就自加了几次,显示在数码管上的数加了好几下。
随便你输入那一天都能算星期几
#include亩袭time.h
#includestdio.h
#includeconio.h
#includestddef.h
#define BIG 1
#define SMALL 2
void info()
{
textcolor(RED);
gotoxy(37,11);
puts("WEEKDAY");
}
int runyear(int year) /*判断是否为闰年*/
{
return !(year%4)year%100||!(year%400);
}
void main()
{
int year,month,day,yeardata,monthdata;
char *weekday;
time_t lt;
struct tm *ptr;
lt=time(NULL);
do
{
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Year: ");
scanf("%d",year);
}while(year0||year9999);
yeardata=runyear(year);
do
{
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Month:");
scanf("%d",month);
}while(month1||month12);
switch(month) /*大小月,2月*/
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: monthdata=BIG; break;
case 4:
case 6:
case 9:
case 11: monthdata=SMALL; break;
case 2: monthdata=3; break;
}
l1:
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Day:");
scanf("%d",day);
if(monthdata==BIG)/*大月*/
{
if(day1||day31)
goto l1;
}
if(monthdata==SMALL)/*小月*/
{
if(day1||day汪中30)
goto l1;
}
if(yeardata==0monthdata==3)/*平年2月*/困耐山
{
if(day1||day28)
goto l1;
}
if(yeardata==1monthdata==3)/*闰年2月*/
{
if(day1||day29)
goto l1;
}
ptr=localtime(lt);
weekday=asctime(ptr);
ptr-tm_mday=day;
ptr-tm_mon=month;
ptr-tm_year=year;
weekday=asctime(ptr);
clrscr();
gotoxy(13,30);
puts(weekday);
}
#include graphics.h#include conio.h int g_len; // Hilbert 曲线的单位长度 // 递归绘制 Hilbert 曲线void hilbert(LPCTSTR cmd, int level){ static BYTE d = 0; // 方向 static POINT c[4] = {1, 0, 0, -1, -1, 0, 0, 1}; // 方向对应的轴系数 if (level 0) return; // 处理命令字符串 int i = 0; while(cmd[i]) { switch(cmd[i++]) { case '+': d = (d + 1) 3; break; case '-': d = (d - 1) 3; break; case 'X': hilbert("+YF-XFX-FY+", level - 1); break; case 'Y': hilbert("-XF+YFY+FX-", level - 1); break; case 'F': linerel(c[d].x * g_len, c[d].y * g_len); break; } }} //蠢态 主函数void main(){ // 设置绘图环境 initgraph(800, 600); // 设置窗口大小 outtextxy(20, 550, "按 1~8 显示不同级别的 Hilbert 曲线,按 ESC 退出。"); rectangle(143, 23, 657, 537); // 绘制表示范围的矩形框 setorigin(144, 24); // 设置原点坐标 setcolor(RED); // 设置颜色 setfillstyle(BLACK); int level = '5'; // 设置初始级别 do { if (level = '1' level = '8') // 仅处理 1~8 { level -= '0'; // 转换为对应的数字值氏槐 bar(0, 0, 511, 511); // 清空绘图区 g_len = 512 level; // 计算单位长度 moveto(g_len / 2, 512 - g_len / 2); // 设定起点 hilbert("X", level); // 递归绘制 Hilbert 曲线 } } while( (level = getch()) != 27 ); /带核源/ 按 ESC 退出 closegraph();}