在51单片机的一个引脚输出一个方波,频率为1HZ-2KHZ,要求用定时器来实现,频率值在数码管上从到右显示

作者&投稿:姜背 (若有异议请与网页底部的电邮联系)
51单片机一个引脚输出一个方波,频率为1Hz到100zHz,第一次用这个应用,所以没有积分,帮帮忙~

你也不说你具体那里不会,是不会用定时器还是不会显示还是不会按键检测,就直接把题贴出来有什么用吗
2019/6/6更新
今天刚好有空,找了段代码改了一下,做了个仿真,相当于一个demo吧。我也是第一次做这个可能不太完美,给个启发吧


# include # define uchar unsigned char# define uint unsigned intuchar code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳极的段码sbit CS_1 = P2^0;sbit CS_2 = P2^1;sbit S1 = P1^0;uchar freq = 0;void DelayMs(uint x); //延时void scan_s1(); //扫描按键,按一次频率增加1Hzvoid display_num(uchar freq);//显示频率void scan_s1(){if(!S1){DelayMs(10);//延时防抖动if(!S1){while(!S1);//检测到按键改变频率/*我这里只改变显示的数值,实际上改变数值后你还应该根据新的数值改变定时器的预设值,才能真正改变频率*/freq = (freq+1)%100;}}}void display_num(uchar freq){uchar num1,num2;num1 = freq/10;//频率十位num2 = freq%10;//个位CS_1 = 0;//打开位选,显示十位P0 = ~DSY_CODE[num1];DelayMs(10);CS_1 = 1;CS_2 = 0;//打开位选,显示个位P0 = ~DSY_CODE[num2];DelayMs(10);CS_2 = 1;}void DelayMs(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}void main(){uchar i = 0;P0 = 0x00;CS_1 = 1;CS_2 = 1;//初始化while(1){display_num(freq);scan_s1();DelayMs(10);}}

你好!是仿真还是做得实物?

#include<reg52.h>
#include<types.h>
INT8U code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
INT16U i=0; ge, shi, bai, qian, num=0,a,b,cnt;
sbit led =P1^0;
sbit key1=P3^0;//按键加
sbit key2=P3^1;//按键减

/******延时函数*******/
void delay(INT16U z)
{
INT16U x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******定时器T0初始化*******/
void Time_Int()
{
TMOD=0x01;
TH0 =0xfe;//0.5ms
TL0 =0x33;
EA =1;
ET0 =1;
TR0 =1;
}
/**********键盘扫描**********/
void keyscan()
{
if(key1==0)
{
delay(10);
if(key1==0)
num++;
while(!key1);
}
if(key2==0)
{
delay(10);
if(key2==0)
num--;
while(!key2);
}
a=5000/num;
b=a*2;
if(num>2000)
num=2000;
if(num<1)
num=1;
}
main()
{
Time_Int();
led =0;
while(1)
{
keyscan();
qian=num/1000;
bai =num%1000/100;
shi =num%1000%100/10;
ge =num%1000%100%10;

}
}
void time0() interrupt 1
{
TH0 =0xff;//0.1ms
TL0 =0xa3;
P0=0X00;
cnt++;
if(cnt<=a)
{
led=1;
}
else if((cnt>a)&&(cnt<=b))
{
led=0;
}
else if(cnt>b)
{
cnt=0;
}
i++;
if(i>4)
i=1;
switch(i)
{
case 1:P2=0X00;P0=table[qian];break;
case 2:P2=0X01;P0=table[ bai];break;
case 3:P2=0X02;P0=table[ shi];break;
case 4:P2=0X03;P0=table[ ge ];break;
default:break;
}
}

频率为1HZ-2KHZ,一下一下加,太慢了吧
下面的是我把以前自己写的拼凑了一个程序,也没有运行,你自己试一下,再有显示程序没写,就是那个display()函数,我是用P1.0和P1.1接了两个按键,
P2.0输出波形....这种程序要自己写,很简单的,如果这个都不想写,以后的程序就没办法了...
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbit aa=P2^0;
uint bb;
void delay(uchar k)
{
uchar i,m;
for(i=0;i<110;i++)
for(m=0;m<k;m++);
}
void timer0() interrupt 1
{
TH0=bb/256;
TL0=bb%256;
aa=~aa;
}
void main()
{
while(1)
{
if(P1!=0xff)
{
delay(10);
if(P1!=0xff)
{
switch(P1)
{
case 0xfe:bb++;break;
case 0xfd:bb--;break;
}
while(P1!=0xff)
display(num);
num=bb;
display(num);
}
else
display(num);
}
else
display(num);
}
}

你这个问题不全面,谁知道你的数码管的电路时怎么接的?下面是从P1.0一脚上产生1HZ的方波,数码管没有电路写不了,记得采用了给分啊,写这么多字,怪累的
#include <reg51.h>
sbit fb=P1^0;
void InitTimer0(void);
void main(void)
{
InitTimer0();
while(1);
{
// 这里写你的数码管显示程序,写完把斜杠删掉//
}
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0FC;
TL0 = 0x18;
fb=~fb;
}

分少,要是分多点给你写。

单片机:设计一个能检测开关状态的电路,要求开关闭合时输出0电平,开关...
答:用 51 单片机的引脚 P1.0,接到开关,开关另一端接地。单片机的输出端设为 P1.7。程序如下:ORG 0000H MOV C, P1.0 MOV P1.7, C SJMP 0000H END

C51问题,怎么样在一个程序给P0,P1口一同输出。
答:通过锁存的方式锁存地址信号,输出时比如使用XBYTE[temp]=0的语句,将temp变量内容以地址信号的方式在一条语句中同时送到P0(低8位地址)和P2(高8位地址)。此时其实是输出地址,不是输出数据了。这种方法没什么实用价值,属于钻牛角尖,只是如果能理解就说明对51单片机了解的比较深了。

51单片机晶振频率为12MHz,利用中断在P1.1口输出50HZ的方波,C语言,哪...
答:include <reg51.h>sbit port=P1^1;void Timer0Init(void)//10毫秒@12.000MHz{TMOD &= 0xF0;//设置定时器模式TMOD |= 0x01;//设置定时器模式TL0 = 0xF0;//设置定时初值TH0 = 0xD8;//设置定时初值TF0 = 0;//清除TF0标志TR0 = 1;//定时器0开始计时}void main(){ Timer0Init()...

自己搭51单片机最小系统的一个I/O口输出的是5V(用万用测过),接到其他...
答:这说明你自己搭的最小系统板子的电源焊接有问题,查一下,单片机的电源引脚,是什么型号的单片机,是40脚的吗,那40脚就是电源引脚VCC,看一下这个VCC脚接什么上了,没有直接接到电源上。细心一点查。

...时钟类引脚、并行输入、输出引脚、控制引脚,共多少个引脚啊?_百 ...
答:8051单片机 40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。⒈ 电源:(1) VCC - 芯片电源,接+5V;(2)VSS - 接地端;⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。⒊ 控制线:控制线共有4根,(1) ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ① ALE功能:用来锁存P0口...

51单片机的引脚结构和功能
答:3、控制引脚(1根)RST/VPP(Pin1):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。4、可编程输入/输出引脚(15根)P1口: 8位准双向I/O口线,P1.0~P1.7 ,共8根 P3口: 8位准双向I/O口线,P3.0~P3.5、P3.7,共7根 聪明的你一定会发现:标准51单片机有32根可编程I...

51单片机引脚ALE的具体作用?怎么控制地址锁存器的?
答:在ALE为低电平期间P0口上的信息为指令或数据信息,以实现低位地址与数据的分离。值的注意的是,在访问片外数据存储器时,人会缺少一个ALE脉冲。当不访问外部存储器时,该信号也以晶振频率的六分之一固定输出正脉冲信号,可以作为外部的定时脉冲使用。如果想禁止ALE的输出可在SFR(特殊功能寄存器)8EH...

51单片机读取引脚的数据时,要先将IO口输出设置为高电平。为什么?_百度...
答:是的, 51单片机作输入时就直接让他输出高电平,看看外设有没有将其拉低。这是因为51的高电平输出电流很小,随便一个低电平就能将其拉低的缘故,但低电平不能被拉高。

51单片机p1=Oxfe是什么意思,是让p1口输出低电平吗
答:P1口有8个引脚,8位二进制数对应8个引脚的状态,高电平为1,低电平为0 Oxfe 化成二进制是 1111 1110 即P1.0引脚输出低电平,其余7个为高电平

给51单片机下程序接哪几个引脚
答:1. 对于STC芯片,程序下载是通过串口进行的,具体连接到51单片机的P3.0和P3.1引脚。2. 对于AT芯片,使用ISP下载方式,连接到单片机的P1.5、P1.6、P1.7引脚以及复位引脚。3. 当使用USB下载器时,连接过程简化。下载器的VCC引脚连接到单片机的VCC,下载器的GND引脚连接到单片机的GND,下载器的RXD...