用C语言怎么在单片机AT89C51上编写一个延时10秒的程序?
单片机汇编语言中要使一个延时程序可以被不同情况下调用而延时不同的时间,可以通过类似于C语言中传递参数的方式来实现,举例如下:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV P0,#5AH ;P0上的LED灯间隔点亮
MOV R7,#50 ;R7是延时传递参数
LCALL DELAY ;调用延时函数
MOV P0,#0A5H ;P0上LED灯另一半点亮
MOV R7,#100 ;延时时间加长
LCALL DELAY
MOV P0,#00H ;LED等全部点亮
MOV R7,#150 ;延时再次加长
LCALL DELAY
MOV P0,#0FFH ;灯灭
MOV R7,#200 ;延时时间再次加长
LCALL DELAY
SJMP MAIN ;循环
DELAY:
MOV R2,#100
DLY:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DLY
DJNZ R7,DELAY ;R7是调用前赋值的传递参数。
RET
END
你买一块单片机开发板对照单片机编程书就能搞定了,花点时间。需求有点模糊,要具体。
1、十秒对于单片机来说是很长很长的时间了,单片机十秒的时间什么事都不能做,只在跑这延时程序,那是什么概念,用中断的话,单片机正常运行其他程序,只是时间到了才过来处理延时以后的程序,效率不知道高了多少 。
2、例程:
//假设晶振12MHZ
#include "reg51.h"
unsigned int YSJS=0;
void main(void)
{
TMOD |= 0X10; //定时器1工作于方式1,16位定时器
TH1 = 0XFF; //定时器1定时时间=500uS
TL1 = 0X06;
ET1 = 1; //使能定时器1中断
EA =1; //开总中断
while(1)
{
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFF; //定时器1定时时间=500us
TL1 = 0X06;
YSJS++;
if(YSJS==20000) //500uS*20000=10000000us=10s
{
P1 = P1 ^ 0X01; //P1.0十秒钟翻转一次
YSJS = 0
}
}
这么长的延时,不用循环延时,没实际意义 。单片机在这10s时间里不能做其它事了。要用定时器中断,定时10s。不是很难的,按常规写法,误差+1.6ms。
#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;
void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
initT0();
while(1)
if(time==200) //中断200次,10s
{
time=0;
LED=~LED; //P1.0上的LED10s亮或灭一次
}
}
void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}
如果细调定时初值(包括重装),TH0 = (65536-49993)/256;
TL0 = (65536-49993256;
误差可以减小到+0.3ms
首先不知兄弟你玩单片机玩了多久,用C语言编程的话极难做到精确地延时10ms,不过误差不会大,我下了两个,借鉴下:
1.
void delay(uint cnt) //简单的延时
{
uint a=0,b;
for(a=0;a<cnt;a++)
for(b=0;b<110;b++);这样的延时大约是cnt 毫秒
2./********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
3.void delay(int a)
{
while(--a);}用12MHZ的话a=10000
参考
http://hi.baidu.com/小雕lns/blog/item/27b4fb5208ec6d0b0df3e373.html
你 用KEIL进行调下就行了
用C语言怎么在单片机AT89C51上编写一个用一个开关控制一个灯亮和灭...
电路有问题啊,电源怎么能直接接到GPIO,这样大电流会损坏IC。P1口好像没有外部中断,那只有轮询了。这个就是按键检测嘛,网上一堆代码,so easy!
请教AT89C51单片机的数字时钟程序带闹钟的功能 用C语言编写
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar dis[]={0x40,0x40,0x40,0x40,0x40,0x40};void timedisplay();void display();void keydisplay();void setdisplay();void display1();void delay(uchar z){ uchar i,j;for(i=125;i>0;i--)for(j=z;j>0;j--);} void ...
单片机间隔点亮一led灯的C语言程序
以下是一个单片机间隔点亮一LED灯的C语言程序,以8051单片机为例:c Copy code include \/\/包含了AT89C51的寄存器定义 void delay(unsigned int xms) \/\/延时函数,xms为要延时的毫秒数 { unsigned int i,j;for(i=xms;i>0;i--)for(j=112;j>0;j--);} void main(){ P1=0x00; \/\/将P1口...
跪求单片机C语言,主芯片为AT89C51,在LCD12864液晶显示中显示“快乐随...
0x06 ) ; \/\/光标右移 v_DelayMs_f( 50 ) ;v_Lcd12864SendCmd_f( 0x0c ) ; \/\/开显示 } void v_Lcd12864SetAddress_f( unsigned char x, y ) \/\/地址转换 { unsigned char byAddress ;switch( y ){ case 0 : byAddress = 0x80 + x ;...
AT89C51编程 如何循环8次停止?用C语言
这是我写的 你修改一下吧 在后面加上灭一次 就可以这台电脑 没有 编译软件 include <reg52.h> \/\/52系列单片机头文件 include <intrins.h>\/\/头文件 使用_crol_(aa,1); 的头 define uint unsigned int \/\/宏定义 define uchar unsigned char void delayms(uint);\/\/声明子函数 sbit beep=P...
用c语言在单片机AT89C51编写音乐程序,求程序,求求你们了
sbit _Speak =P2^3 ;\/\/讯响器控制脚 unsigned char code SONG[] ={ \/\/祝你平安 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,...
用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键...
include<reg51.h> define uchar unsigned char;uchar LED1,LED2;uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar num=0;sec,key;void delay(unsigned int a){ unsigned int i,j;for(i=0;i<a;i++)for(j=0;j<120;j++);} void display(){ LED1...
AT89C51单片机 用定时器1,方式0定时1s的C语言程序怎么写
(这是我同学编的,拿来给你)include <reg51.h> include <intrins.h> unsigned char i;void main(){ TMOD=0x00;TH1=0x3c;TL1=0xb0;EA=1;ET1=1;TR1=1;while(1){ if(i==20){ i=0;\/\/下面写你要处理的的其他程序,你只要了定时1s。} } } void a(void) interrupt 3 { unsigned ...
如何用c语言编程在单片机上做交通信号灯
因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。(1)电路连接图:三、软件程序(C语言) 以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。\/\/***\/\/\/程序名:十字路口交通灯控制\/\/编写人...
求单片机(AT89C51)C程序,实现功能:串口调试软件发送一个数字(0-9...
打开电源打开串口调试程序,将波特率设置为9600,无奇偶校验,晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,在发送框输入字符,在接收框中同样可以看到相同字符,当然数字也是可以的,至于在数码管中显示数字,你自己加几条语句就行了 include<reg51.h> \/\/包含头文件,一般情况不需要...