求一个51单片机中断程序的程序:一个中断函数能调整方波的周期还要求以恒加速

学校的课程设计,总结一下。
1.高低电平的改变不适合在主函数的while循环中,因为要有数码管动态显示的延时和其它逻辑处理,时间太长会不能及时改变高低电平值。
2.中断的执行时间一定是不能超过定时时间的,不然就会中断没处理完又来了下一个中断,造成频率出错。
3.假设100us中断一次,中断程序执行时间40us,则当前中断执行完毕距下一个中断到来还有70us,这剩下的时间就执行主函数的while循环了,因此设计中断时要给主函数留时间。
4.假设原来的延时函数设置延时1ms,而现在延时函数要被100us中断一次,每次中断执行40us,则延时时间变成了 1*(1+40/100)=1.4ms,另外除了延时函数其他语句也会被中断,因此定时时间越短,也就是说中断的越频繁,则越要将原来延时变短,不然会造成数码管闪烁、按键要长按等等。
一种方法是在中断中轮流将高低电平持续时间的定时值赋给定时器,这种方法在频率高时误差很大,经测试发现是重装计数值使频率不准。
因此后来采用固定定时为50us的定时器方式2(自动重装方式),每进中断将计数值加一,然后和设定的值比较来输出高低电平,这种方式的5k频率很准,只要保证中断程序执行时间不要超过50us即可。
对于11.0592M晶振,中断程序中C语言写上不到10行就超过20us了,所以我设置为50us定时中断,如这样设置的话再另每次中断中将引脚状态取反,可以得到最高10k的方波。而如果是产生5k的方波,则可以设置25、50、75的占空比。如25%占空比,就是50us高电平,150us低电平。
如果定时时间设置的更小,而中断程序里只有一句将引脚取反的命令,50k的方波就是极限了。
1 #include &reg52.h&
3 typedef unsigned char uint8;
5 sbit wave=P1^2;
//波形输出
6 sbit du=P1^0;
//段选锁存器
7 sbit we=P1^1;
//位选锁存器
9 #define FNUM 5
//频率数目
10 #define DNUM 3
//占空比数目
12 //共阴段码表
13 uint8 code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
15 unsigned dnum,
18 uint8 key_scan(void);
19 void display(uint8 num[]);
20 void delayms(unsigned ms);
22 void main(void)
uint8 fsel=4,dsel=2;
//默认选择
unsigned long freq[FNUM]={1,10,100,1000,5000};
uint8 duty[DNUM]={25,50,75};
uint8 num[4]={0};
TMOD=0x02;
TH0=TL0=256-46;
fnum=1000000/50/freq[fsel-1];
dnum=1000000/50/freq[fsel-1]*duty[dsel-1]/100;
switch(key_scan())
//分别是频率减、加,占空比减、加,确定键
if(fsel--==1)
fsel=FNUM;
if(fsel++==FNUM)
if(dsel--==1)
dsel=DNUM;
if(dsel++==DNUM)
fnum=1000000/50/freq[fsel-1];
dnum=1000000/50/freq[fsel-1]*duty[dsel-1]/100;
//无键按下
//数码管显示选择的频率、占空比
display(num);
80 //翻转法扫描矩阵键盘,返回按键值
81 uint8 key_scan(void)
uint8 key,i,ret=0xff;
//无键按下返回0xff
if(P2!=0xf0)
delayms(10);
if(P2!=0xf0)
while(P2!=0x0f)
for(i=0;(key&&i)&0x01;i++)
for(i=4;(key&&i)&0x01;i++)
ret+=(7-i)*4;
107 //数码管动态显示
108 void display(uint8 num[])
for(i=0;i&4;i++)
P0=table[num[i]];
P0=~(1&&i);
delayms(1);
127 void timer0(void) interrupt 1
if(count==fnum)//频率计数值
else if(count==dnum)//占空比计数值
141 void delayms(unsigned ms)
uint8 i=11;
//将延时调小
while(ms--)
while(i--)
/forum.php?mod=redirect&goto=findpost&ptid=393340&pid=2552279&fromuid=1189318
阅读(...) 评论()时间: 15:14 来源:转载 编辑:lucy
求高手 用51单片机输出产生方波的程序网友说:#include&reg52.h&
sbit PWM=P1^0;//定义输出脚
void main()
TMOD=0x01;
//定时器0工作方式1
TH0=()/256;
//12M晶振10MS计时常数
TL0=()%256;
//开总中断
//开定时器0中断
//启动定时器0
//中断函数,启动后每10MS进入一次中断
void T0_time(void) interrupt 1
TH0=()/256;
//12M晶振10MS计时常数
TL0=()%256;
if(PWM)PWM=0;
//输出脚取反
else PWM=...51单片机晶振频率12MHz,编程实现P1.0输出频率为2KHz,占空比为50%的方波,使用定时器网友说:#include&reg51.h&#define uchar unsigned charsbit p10=P1^0;void t0isr() interrupt 3{num++;if(num&=100)
}}main(){TMOD=0x20;TH1=6;TL1=6;TR1=1;ET1=1;EA=1;while(1);}从单片机P1.0口送出一个方波信号,信号频率为200Hz―20KHz,选20个点频即可,占空比10%―90%可调,步进10%。外部设置4个按键,对信号的频率和占空比进行调整。要求是汇编语言网友说:开单片机啦,有机会交流交流,不过我都用的C语言,想着有机会了学学汇编。用定时器0使单片机p1.0口用C语言生成周期为1秒的方波的代码哪里出问题了?仿真的时候一直都是输出低电平。网友说:#include &reg52.h&
#define uint unsigned int
#define uchar unsigned char
sbit D1=P1^0;
void main()
TMOD=0X01;//选择定时器0为工作方式1
TH0=()/256;
TL0=()%256;/*给定时器赋初值*/
EA=1;//总中断开
ET0=1;//定时器0中断开
TR0=1;//启动定时器0
if(tt==20)
void dingshi0() interrupt 1
TH0=()/256;
TL0=()%256;/*给定时器赋初值*/
}AT89c51定时器在P1.0端子输出频率为25HZ占空比为75%方波信号的单片机程序怎么写哇网友说:我这是周期50HZ的,不同的单片机时钟不同,可以自己算。
#include&reg51.h&
#define V_TH0
//调节
V_TH0 和V_TL0的值即调节周期
#define V_TL0
#define V_TMOD 0X01
sbit P1_0 = P1^0;
/************************主函数********************/
unchar ZKB1;
//调节
//ZKB1=11;
/*占空比初始值设定8
1ms 32*/
//ZKB2=18;
/*占空比初始值设1.5y定*/
init_sys();
...单片机输出占空比可变的方波网友说:ORG 0000HAJMP MAINMAIN:MOV R7,#0FFHMOV R6,#0FFHMOV R5,#0MOV R6,#0SETB P1.0LCALL DELAYCLR P1.0LCALL DELAY1JNB P2.0,ZJJNB P2.1,JXLJMP MAINZJ: DEC R6; 增加INC R4LJMP MAINJX: INC R6; 减小DEC R4LJMP MAINDELAY:D1: DJNZ R7,D1DJNZ R6,DELAYRETDELAY1:D2:DJNZ R5,D2DJNZ R4,DELAYRET高电平时间为(R7*2+3)*R6;低电平时间为(R5*2+3)*R4;P2.0是低电平时增加占空比p2.1是低点平时减小占空比P1.0口是pwm信号输出 &&#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
uchar t0=0xff,t1=0,
void delay()
for(i=254;i&0;i--);
void delay0()
TMOD=0x01;
TH0=...设计通过单片机I/O口输出占空比为1:2的方波程序,画出单片机外围电路,并描述编程思路。急求网友说:单片机外围电路就不要画了吧。现在的单片机很多已经简单得没几个元件了。
甚至就一个单片机芯片就能跑了。
有PWM的,可以使用PWM输出1.2的方波。
没有的,使用时间中断,甚至使用延时函数,都可以输出1:2的方波的。
你只要在适当的时间,把I/O口的电平取反就成。很简单。51单片机两个io口同时输出两个占空比不同的方波?以下程序希望给点灵感。网友说:用一个定时器,再设定两个计数单元,定时器的定时时间是一个对与占空比比较好算的值,当做基准时间,中断里面只要对计数单元计数,即每产生一次中断计数值加1,然后判断计数值,再分别对两个口取反就行。51单片机,在p1.0口输出占空比一定(但不为1/2)的脉冲网友说:本程序晶振为12MHZ,占空比为1:3,脉冲周期为60ms,低电平为20ms,高电平为40ms
BIT WSTA.0占空比标志位
ORG 000BH定时器0中断入口地址
MOV R0,#20H ;20H-7FH清零
MOV R7,#60H
M01: MOV @R0,A
DJNZ R7,M01
MOV TMOD,#01H方式1定时
MOV TH0,#0E0H定时20ms
MOV TL0,#60H
SETB EA打开定时器总中断
SETB ET0打开定时器0中断
SETB TR0打开定时器0
...基于单片机设计一个波形发生器,可产生方波、三角波、正弦波,且波形幅度、周期可调。网友说:1、推荐采用AVR单片机,理由:速度快,价格低,外围电路简单,为了调试方便,建议采用带JTAG仿真口的单片机,如Atmeg162。
2、最小系统只要接上电源,如果对频率准确要求较高,外接一个晶体整荡器(16MHz),为了实现你的设计,还需要RC滤波器,运算放大器,按键,LED指示灯等。
3、建议不用数模转换,方波直接由定时器产生,三角波由方波经积分器产生,正弦波采用PWM输出加低通滤波器实现。
4、方波调幅通过调节其后放大器增益实现,采用数字电位计或模拟电位计,三角波幅值调节通过调节方波幅值实现。正弦波调幅通过改变PWM调制比实现。
5、建议采用双电源(运放比较好用,也好选型),单片机输出波形经低通滤波器滤波后,再经过电容耦合,采用运算放大器放大。
6、编程主要关注定...
你也可以分享到:君,已阅读到文档的结尾了呢~~
豆丁精品文档: 单片机中断程序 单片机中断 单片机外部中断 单片机中断函数 单片机定时中断 单片机中断系统 单片机定时器中断 单片机的中断 msp430单片机 中断 单片机中断类型
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
51单片机中断程序大全
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口【求助帖】 求用51单片机编写一个产生38K方波的程序_51单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:50,690贴子:
【求助帖】 求用51单片机编写一个产生38K方波的程序收藏
【求助帖】 求用51单片机编写一个产生38K方波的程序
晶振频率11.0592M
立创商城,自建6000多平方米现代化元器件仓库,现货库存超50000种.立创商城,原装正品,自营库存,品种齐全,电子元器件一站式采购!
先得到周期 ,然后利用定时半个周期取反一次,即可
登录百度帐号推荐应用51单片机外部中断0实例详解
我的图书馆
51单片机外部中断0实例详解
今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。151单片机的中断源51单片机共有5个中断源,分别为:外部中断0定时器0中断外部中断1定时器1中断串口中断每一个中断都对应一个中断向量,中断向量表如下所示:2什么是中断事件当中断发生时单片机将正在执行的程序暂时放下而去处理中断事件,当中断事件处理完毕后再接着去处理之前的事情,这样可以大大降低单片机的资源,提高执行效率。举个例子说明一下什么是中断:我很喜欢打CS,每天晚上我都会抽时间打CS,但同时厨房里正在烧水,为了不使水烧干,我每隔5分钟就去厨房看一下水有没开,但这就错过了游戏老被别人爆头干掉,我很苦恼,怎么办。于是我在网上买了一个水烧开就会叫的水壶,这样我就不用每隔5分钟去厨房了从而可以专心的打游戏,只有听到水壶吱吱叫的时候,我去把水倒出来就可以了。在这个例子里,打游戏就是主任务,水烧开就是中断,吱吱叫就是中断向量,听到吱吱响我就明白水烧开了,这时我要把打游戏这个主任务暂时放下,转而去处理水烧开了这个中断事件,水倒完后我就又回到了游戏这个主任务中。这样是不是提高了打游戏的效率呢?3中断的硬件实现51单片机的外部中断0引脚接一只按键,该按键通过上拉电阻接到电源,即没有按键发生时单片机检测到的是高电平,当按键按下时单片机检测到的是低电平。单片机的P0.0引脚以灌电流的方式接了一只LED,当按键按下时LED灯点亮,没按键时LED灯熄灭。4中断的软件实现单片机中断函数的写法比较固定,51单片机中断函数的写法如下:void Initd() interrupt 0其中:void:为中断函数的返回类型,中断函数多为空类型;Initd():是中断函数的名称,这个函数名符合C语言函数命名规范就可以,随便起;interrupt:为51单片机中断的关键字,必须这么写(51单片机必须这么写);0:为中断向量,该值详看第一个表格,如果是外部中断1就写2,如果是定时器1中断就写3;中断函数不用在主函数中调用,只要中断事件发生,单片机自己主动会调到中断函数中。该例子的函数如下所示:5仿真实现当按键发生时,LED灯点亮,如下图所示。注意对比两种图中按键的状态。本订阅号致力于单片机、ARM等嵌入式软硬件的设计经验分享,秉承“人人都是电子设计经验的分享者”的理念,成功路上不孤单,我们一起努力。公众号:micropoint8,对于本节内容欢迎大家讨论。
TA的最新馆藏[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 单片机定时器中断程序 的文章

 

随机推荐