文件:main.c
用途:
注意:内部8M晶振
************************************************/
#include <iom128v.h>
unsigned char LED_table[]={0xFF,0x00,0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF,0x00,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0x00,0xFF,0x7E,0xBD,0xDB,0xE7,0xFF,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0x00};
用途:延时函数
注意:系统时钟8M
************************************************/
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void main(void)
{
unsigned char i=0;
PORTA = 0xFF;
DDRA = 0xFF;
DDRE=0XFF;
PORTE=0XFF;
while(1)
{
if(i==36) i=0;
PORTA = LED_table[i++];
delay_nms(80);
}
}
‘贰’ 请问单片机中的delay()的单位时间是什么
单片机中的delay()的单位时间不是系统提供的,而是用户自己编制的。
如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。
如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。
最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
(2)ms8单片机扩展阅读
单片机C语言程序中延时函数delay的原理是:仅仅执行一些,没有实质性影响的所谓“无意义指令”,比如做比大小啊,做某个int的自加运算啊之类的。
单片机的有些程序需要调用延时程序,合理的安排循环次数以及空操作的个数方法:用汇编的话就根据你的当前晶振频率去推算你的指令周期,然后结合需要延迟的时间。
编写延迟程序,用C的话还是要看最后生成的汇编码是什么样的了。最简单的方法就是写好程序以后再编译器里软仿真看时间。
单片机C语言延时需注意的问题:
标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。
在keil C51中,直接调用库函数:
#include // 声明了void _nop_(void);
_nop_(); // 产生一条NOP指令
作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。
‘叁’ 对于8M单片机,0.5ms约可以执行多少条指令
如果是MCS-51单片机,8M晶册贺振的话,机器周期为1.5us,0.5ms等于50us
1、如果执行单周期指令,那么可以执行33条
2、如果执行双周期指令的话,那么和森可以执行16条。
3、如果执行4周期的话唤姿亩,那么可以执行8条。
‘肆’ 单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)
单片机流水灯C语言程序的源代码如下:
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8个流水灯反向逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp>>=1;
}
void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
(4)ms8单片机扩展阅读
51单片机流水灯的源代码如下
#include<reg51.h>
#include<intrins.h>
voiddelay(inta)
{
inti;
while(a--)for(i=0;i<110;i++);
}
main()
{
inti;
while(1)
{
P0=0xfe;
for(i=0;i<8;i++)
{
P0=_crol_(P0,1);
delay(500);
}
}
}
‘伍’ 在单片机中如何用8个发光管演示出8位二进制数字自减过程(用c语言)
#include"reg51.h"
voiddelay(unsignedintms)
{
unsignedchari;
while(ms--)for(i=110;i--;i>0);
}
//-------------------------
voidmain()
{
unsignedcharabc=0;
while(1){
P1=abc;//在P1口外接8个LED,低电平发光.
abc++;//加,负逻辑将显示为自减.
delay(500);//延时,供观察现象.
}}
=============================================
要求由最高位P0^0作为二进制的最高位。
这个新要求,可以在焊接LED器件的时候进行调整。
更改一下程序,也不难,如下:
#include"reg51.h"
unsignedcharbdataabc=0,bbb;
sbita0=abc^0;
sbita1=abc^1;
sbita2=abc^2;
sbita3=abc^3;
sbita4=abc^4;
sbita5=abc^5;
sbita6=abc^6;
sbita7=abc^7;
sbitb0=bbb^0;
sbitb1=bbb^1;
sbitb2=bbb^2;
sbitb3=bbb^3;
sbitb4=bbb^4;
sbitb5=bbb^5;
sbitb6=bbb^6;
sbitb7=bbb^7;
voiddelay(unsignedintms)
{
unsignedchari;
while(ms--)for(i=110;i--;i>0);
}
voidmain()
{
while(1){
b0=a7;
b1=a6;
b2=a5;
b3=a4;
b4=a3;
b5=a2;
b6=a1;
b7=a0;
P1=bbb;
//P1=abc;//在P1口外接8个LED,低电平发光.
abc++;//加,负逻辑将显示为自减.
delay(500);//延时,供观察现象.
}}
‘陆’ 单片机程序 8个发光二极管间隔500ms由上至下,再由下至上,再重复一次,然后全部熄灭再以800ms间隔全部闪
循环7次,使如耐P1口分别为0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe也就是LED循环由高到低流水灯芹稿显示渣首春。