for(k=0;k<114;k++);
}
voidmain(void)
{
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-46080)/256; //定时器T0的高8位设置初值,延时50msTL0=(65536-46080)%256; //定时器T0的低8位设置初值 ,延时50msEA=1; //开总中断
ET0=1; //定时器T0中断允许
while
(1)
{
if(S1==0) //如果按键S1按下
{
delayms(20); //延时20ms消抖if(S1==0) //如果按键S1确实按下
{
while(!
S1);//等待按键抬起q=0; //中断次数清零
flag=1; //延时变量为1,代表定时1秒的情况
LED=0xff; //LED全部关闭
TR0=1; //启动定时器T0
}
} //1Hz频率闪烁
if(S2==0) //如果按键S2按下
{
delayms(20); //延时20ms消抖if(S2==0) //如果按键S2确实按下
{
while(!
S2);//等待按键抬起q=0; //中断次数清零
flag=2; //延时变量为2,代表定时0.3秒的情况LED=0x55; //1357奇数位LED关闭,2468偶数位LED点亮TR0=1; //启动定时器T0
}
} //0.3秒间隔闪烁
if(S3==0) //如果按键S3按下
{
delayms(20); //延时20ms消抖if(S3==0) //如果按键S3确实按下
{
while(!
S3);//等待按键抬起q=0; //中断次数清零
flag=3; //延时变量为3,代表定时0.2秒的情况LED=0x0f; //低4位LED关闭,高4位位LED点亮TR0=1; //启动定时器T0
}
} //0.2秒高低4位间隔闪烁
if(S4==0) //如果按键S3按下
{
delayms(20); //延时20ms消抖if(S4==0) //如果按键S4确实按下
{
while(!
S4);//等待按键抬起q=0; //中断次数清零
flag=4; //延时变量为4,代表定时关闭的情况TR0=0; //关闭定时器
LED=0xff; //LED全部关闭
}
} //全灭
}
}
/******************************************************************
函数功能:
定时器T0的中断服务函数入口参数:
n
出口参数:
无
*******************************************************************/
voidTime0(void)interrupt1using1//定时器T0的中断编号为1,使用第1组工作寄存器
{
if(flag==1) //延时变量为1,代表定时1秒的情况
{
q++; //累计次数
if(q==10)//如果中断次数计满10次即500毫秒
{
LED=~LED; //8只LED小灯以1HZ频率闪烁
q=0; //中断次数清零
}
}
if(flag==2) //延时变量为2,代表定时0.3秒的情况
{
q++; //累计次数
if(q==6) //如果计满6次即0.3秒
{
LED=~LED; //8只LED小灯以0.3秒间隔闪烁
q=0; //中断次数清零
}
}
if(flag==3) //延时变量为3,代表定时0.2秒的情况
{
q++; //累计次数
if(q==4)//如果计满4次即0.2秒
{
LED=~LED;//8只LED小灯以0.2秒间隔高低4位闪烁q=0;//中断次数清零
}
}
TH0=(65536-46080)/256; //定时器T0的高8位设置初值,延时50msTL0=(65536-46080)%256; //定时器T0的低8位设置初值,延时50ms
}
仿真截图
试题3.22 计数器软件开发
一、任务
在下列开发板硬件(原理图见pdf文档)基础上,编写完整程序实现如下模拟计数器功能,开发板4个按键从左至右分别为S1-S4,开发板上电复位后显示0,利用S3、S4做外部中断输入(要求用外部中断实现),按下S3显示数据加1,按下S4数据显示减1,当计数小于0时,显示0并蜂鸣器发“嘟”声提示,当数据大于9时,显示9并蜂鸣器发“嘟”声提示。
功能分析
根据开发板硬件电路,P0口为数码管段选操作端口,P2口为数码管位选操作端口,
P1.0引脚连接蜂鸣器,P3.2引脚连接按键S3,P3.3引脚连接按键S4。
开通P2端口初始化数码管使其上电显示“0”,并设置计数变量初值为0,初始化外部中断
INT0和INT1,设置外部中断为负边沿触发,也就是当外部中断P3.2和P3.3引脚为下降沿时触发中断。
当按键S3按下,Count加1并在数码上显示,但Count值大于9
时,Sound发出提示音。
同理当按键S4按下,Count减1并在数码上显示,但Count
值小于0时,Sound发出提示音。
软件流程图
开始
初始化
N
判断按键是否
按下?
Y
N
判断是否
count>9
判断是否
count<0
N
Y
Y
count=0,声音提示
count=9,声音提示
Count--
count++
S4按下执行中断INT1
S3按下执行中断INT0
程序代码
/******************************************************************
编写完整程序实现如下模拟计数器功能,开发板4个按键从左至右分别为S1-S4,开发板上电复位后显示0,利用S3、S4做外部中断输入(要求用外部中断实现),按下S3显示数据加1,按下S4数据显示减1,当计数小于0时,显示0并蜂鸣器发"嘟"声提示,当数据大于9时,显示9并蜂鸣器发"嘟"声提示。
******************************************************************/#include
sbitbuz=P1^0;//buz接蜂鸣器
sbitwei=P2^0;//数码管位选通位
sbitS3=P3^2;sbitS4=P3^3;
unsignedchari;//定义全局变量iunsignedcharflag;//蜂鸣器鸣叫标志位
unsignedcharcodetab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极0~9的段码
//延时函数,入口参数为n,没有出口参数voiddelayms(unsignedintn)
{
unsignedintj,k;for(j=0;jfor(k=0;k<114;k++);
}
//主函数main()
{
EA=1;//打开总中端EX0=1;//打开外部中断0
EX1=1;//打开外部中断1
IT0=1;//设置外部中断0触发方式为边沿触发IT1=1;//设置外部中断1触发方式为边沿触发while
(1)
{
wei=0;//选通7段数码管第1位P0=tab[i];//让数码管显示0~9if(flag)
{
flag=0;//清蜂鸣器鸣叫标志位buz=0;//蜂鸣器鸣叫delayms(500);//延时500毫秒buz=1;//蜂鸣器关闭
}
}
}
voidint0()interrupt0//外部中断0
{
delayms(20);//延时消抖if(S3==0)//按键确认按下
{
while(!
S3); //等待按键松开if(i<9)//判断i是否小于9
i++;//i自加
else//i不小于9
{
i=9;//给i直接赋值9flag=1; //蜂鸣器鸣叫
}
}
}
voidint1()interrupt2//外部中断1
{
delayms(20);//延时消抖if(S4==0)//按键确认按下
{
while(!
S4); //等待按键松开if(i>0)//判断i是否大于0
i--;//i自减
else//i不大于0
{
i=0;//给i直接赋值0flag=1; //蜂鸣器鸣叫
}
}
}
仿真截图
试题3.23 按键控制组合灯软件开发
一、任务
在下列开发板硬件(原理图见pdf文档)基础上,编写完整程序实现如下功能,4个按键分别控制2个灯,4个按键从左至右分别称为S1-S4,单片机引脚1、2所接灯分别为LED1、LED2,按下S1控制LED1亮灭变化(当前灭则点亮,当前亮则变灭),S2控制LED2亮灭变化,S3开所有灯,S4关闭所有灯。
功能分析
根据开发板硬件电路,P1口为8位LED端口,LED1接P10,LED2接P11,P3端口低四位为独立按键S1、S2、S3和S4。
循环扫描P3口的低四位,判断按键是否按下,当确认S1按键被按下后执行LED1亮灭变化(当前灭则点亮,当前亮则变灭);同理当确认S2按键被按下后执行LED2亮灭变化(当前灭则点亮,当前亮则变灭);当确认S3按键被按下后开启LED1、LED2;当确认S3按键被按下后关闭LED1、LED2。
软件流程图
开始
初始化
N
判断按键
是否按下?
Y
按键1
按键2
按键3
按键4
LED1取反
LED2取反
LED1、2全
LED1、2全
程序代码
/************************************************************************
编写完整程序实现如下功能,4个按键分别控制2个灯,4个按键从左至右分别称为S1-S4
,单片机引脚1、2所接灯分别为LED1、LED2,按下S1控制LED1亮灭变化(当前灭则点亮,
当前亮则变灭),S2控制LED2亮灭变化,S3开所有灯,S4关闭所有灯。
*************************************************************************/#include
sbits1=P3^0;//按键S1位sbits2=P3^1;//按键S2位sbits3=P3^2;//按键S3位sbits4=P3^3;//按键S4位sbitLED1=P1^0;//LED1位sbitLED2=P1^1;//LED2位
/****************************************************************
函数功能:
n毫秒延时函数入口参数:
n
出口参数:
无
****************************************************************/
voiddelayms(unsignedintn)
{
unsignedintj,k;for(j=0;jfor(k=0;k<114;k++);
}
/****************************************************************
函数功能:
主函数
****************************************************************/main()
{
while
(1)//死循环
{
if(s1==0)//判断按键S1是否被按下
{
delayms(20);//延时20毫秒if(s1==0)//判断按键S1是否被按下
{
while(!
s1); //等待按键松开LED1=!
LED1; //LED1灯取反
}
}
elseif(s2==0)//判断按键S2是否被按下
{
delayms(20);//延时20毫秒
if(s2==0)//判断按键S2是否被按下
{
while(!
s2); //等待按键松开LED2=!
LED2;//LED2灯取反
}
}
elseif(s3==0)//判断按键S3是否被按下
{
delayms(20);//延时20毫秒if(s3==0)//判断按键S3是否被按下
{
while(!
s3); //等待按键松开LED1=0;//点亮LED1LED2=0;//点亮LED2
}
}
elseif(s4==0)//判断按键S3是否被按下
{
delayms(20);//延时20毫秒if(s4==0)//判断按键S3是否被按下
{
while(!
s4); //等待按键松开LED1=1;//熄灭LED1LED2=1;//熄灭LED2
}
}
}
}
仿真截图
试题3.24 频率计软件开发
一、任务
在下列开发板硬件(原理图见pdf文档)基础上,编写程序,使频率计在上电后,具有:
能测试1-100HZ的低频信号;并把结果显示在数码管上。
误差小于1HZ。
功能分析
根据开发板硬件电路,P0口为数码管段选操作端口,P2口为数码管位选操作端口,使用3位数码管显示当前输入脉冲的频率。
将T0工作于定时工作方式的模式1,T1工作于计数工作方式的模式2,T0用于定时50毫秒,每20次定时次数到即为
1秒,定时1秒到,读取T1的计数结果,即为输入脉冲在1秒内的脉冲个数,也即频率。
输入脉冲应接T1的外部脉冲输入端即P3.5。
初始化定时器
软件流程图
开始
T0定时1秒
到?
N
Y
TL1清零,中断次数清零
数码管显示T1计数值也即频率
启动定时器
程序代码
/***********************************************************************
技能抽查第四题:
编写程序,使频率计在上电后,具有:
能测试1-100HZ的低频信号;并把结果显示在数码管上。
误差小于1HZ。
晶振频率:
11.0592MHz
*************************************************************************/
#include //包含单片机寄存器的头文件sbitpulse=P3^5;//脉冲输入从T1/P3.5送入unsignedcharq;//记录中断次数,定时1sunsignedintcnt; //脉冲次数暂存
unsignedchartable[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf};//共阳极数码管0~9、-的段码表
/****************************************************************
函数功能:
n毫秒延时函数入口参数:
n
出口参数:
无
****************************************************************/voiddelayms(unsignedintn)
{
unsignedintj,k;for(j=0;jfor(k=0;k<114;k++);
}
/****************************************************************
函数功能:
显示子函数入口参数:
cnt
出口参数:
无
****************************************************************/voiddisplay(unsignedintcnt)
{
P2=table[cnt/100];
P0=0x7f;
delayms
(1);P0=0xff;
P2=table[cnt/10%10];
P0=0xbf;
delayms
(1);P0=0xff;
P2=table[cnt%10];