51单片机程序 1:在单片机的一个引脚输出一个方波,频率为 1Hz-100Hz, 要求用定时器来实现,频率值在数码管上从左到右显示。用两个按键 来调节频率,k1 增加频率,k2 减小频率,引脚自己规定。
时间: 2023-10-04 09:10:31 浏览: 89
这是一个较为简单的51单片机程序,需要用到定时器和外部中断。以下是程序的主要实现步骤:
1. 定义引脚,数码管和按键的端口。
2. 配置定时器,使其以一定频率中断,并在其中修改输出引脚的电平,从而产生方波信号。
3. 配置外部中断,用于检测按键的状态,并修改定时器的中断频率,实现调节频率的功能。
下面是程序的代码实现:
```c
#include <reg51.h> //51单片机头文件
sbit led = P1^0; //输出引脚
sbit key1 = P2^0; //按键1,增加频率
sbit key2 = P2^1; //按键2,减小频率
sbit dula = P2^6; //数码管段选1
sbit wela = P2^7; //数码管位选
unsigned char code duan[16]={0x3f,0x06,0x5b,0x4f, //数码管段码表
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned int freq = 50; //初始频率为50Hz
unsigned int time = 65536 - 11059200/(12*freq); //计算定时器初值
void delay(unsigned int x) //延时函数
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
void display(unsigned char num) //在数码管上显示数字
{
dula = 1;
P0 = duan[num/10];
dula = 0;
dula = 1;
P0 = duan[num%10];
dula = 0;
}
void init_timer() //初始化定时器
{
TMOD |= 0x01; //选择定时器0,模式1
TH0 = time >> 8; //设置初值
TL0 = time & 0xff;
ET0 = 1; //开启定时器中断
EA = 1; //开启总中断
TR0 = 1; //启动定时器
}
void timer_isr() interrupt 1 //定时器中断服务函数
{
static unsigned char flag = 0;
if(flag == 0)
{
led = 1;
flag = 1;
}
else
{
led = 0;
flag = 0;
}
}
void key1_isr() interrupt 0 //按键1中断服务函数
{
delay(5); //消抖
if(key1 == 0)
{
freq++;
if(freq > 100) //频率值上限为100Hz
freq = 100;
time = 65536 - 11059200/(12*freq); //重新计算定时器初值
display(freq); //在数码管上显示频率值
}
}
void key2_isr() interrupt 2 //按键2中断服务函数
{
delay(5); //消抖
if(key2 == 0)
{
freq--;
if(freq < 1) //频率值下限为1Hz
freq = 1;
time = 65536 - 11059200/(12*freq); //重新计算定时器初值
display(freq); //在数码管上显示频率值
}
}
void main()
{
init_timer(); //初始化定时器
IT0 = 1; //设置外部中断0为下降沿触发
EX0 = 1; //开启外部中断0
IT1 = 1; //设置外部中断1为下降沿触发
EX1 = 1; //开启外部中断1
display(freq); //显示初始频率值
while(1);
}
```
需要注意的是,在单片机程序中,由于定时器和外部中断都可能引起中断,因此需要对中断进行优先级处理。在本程序中,定时器中断的优先级最高,按键中断的优先级次之。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)