新聞中心
51單片機(jī)C語(yǔ)言中delay函數(shù)是怎么定義和使用的?
定義一個(gè)延時(shí)xms毫秒的延時(shí)函數(shù)
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)南票,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18982081108
void delay(unsigned int xms) // xms代表需要延時(shí)的毫秒數(shù)
{
unsigned int x,y;
for(x=xms;x》0;x--)
for(y=110;y》0;y--);
}
使用:
void Delay10us(uchar Ms)
{
uchar data i;
for(;Ms》0;Ms--)
for(i=26;i》0;i--);
}
i=[(延時(shí)值-1.75)*12/Ms-15]/4
擴(kuò)展資料
1、在C51中進(jìn)行精確的延時(shí)子程序設(shè)計(jì)時(shí),盡量不要或少在延時(shí)子程序中定義局部變量,所有的延時(shí)子程序中變量通過(guò)有參函數(shù)傳遞。
2、在延時(shí)子程序設(shè)計(jì)時(shí),采用do…while,結(jié)構(gòu)做循環(huán)體要比f(wàn)or結(jié)構(gòu)做循環(huán)體好。
3、在延時(shí)子程序設(shè)計(jì)時(shí),要進(jìn)行循環(huán)體嵌套時(shí),采用先內(nèi)循環(huán),再減減比先減減,再內(nèi)循環(huán)要好。
c51定時(shí)計(jì)數(shù)C語(yǔ)言代碼
#includereg51.h
#includeINTRINS.h
#define?u16?unsigned?int
#define?u8?unsigned?char
/*********************************************************/
u8?ds[3];?//數(shù)碼管顯示緩存
//共陽(yáng)
code?u8?w[]={0x01,0x02,0x04,0x08}; //位碼
code?u8?d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//斷碼
void?dispaly(){//顯示函數(shù)
static?u8?a;
if(++a=3)a=0;
P0=0xff;
P2=w[a];
P0=d[ds[a]];
}
/****************************************/
void?init() //初始化函數(shù)
{???TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
}
u16?count=0; //計(jì)數(shù)
u16?V=0;//速度
u16?js;//計(jì)時(shí)
u8?mc=P1^1;//脈沖引腳
u8?tt=0xff;
void?smmc(){
tt=1;
if(mc)tt|=0x01;
if((tt0x03)==0x02){//下降沿脈沖
if(count65535)count++;
}
}
/***********************************/
void?main()//主函數(shù)
{
init();//系統(tǒng)初始化
TR0=1;?//定時(shí)器開(kāi)始計(jì)時(shí)
while(1){
ds[0]=V/100%10;?//計(jì)數(shù)送到數(shù)碼管顯示緩存中
ds[1]=V/10%10;
ds[2]=V%10;
smmc();
if(js=10000){//10s
js=0;
V=4*count/10+2;//計(jì)算速度
count=0;
}
}
}
/****************************/
void?timer0()?interrupt?1//1ms定時(shí)器
{???
TH0=(65536-1000)/256;//重載初值
TL0=(65536-1000)%256;
dispaly();//顯示
js++;
}
基于51單片機(jī)的999倒計(jì)時(shí)C語(yǔ)言程序。
/*************************************
要求是能進(jìn)行9999秒倒計(jì)時(shí)
用C語(yǔ)言實(shí)現(xiàn)
*************************************/
#includeat89X51.h
#define uchar unsigned char
#define uint unsigned int
uchar num_qian,num_bai,num_shi,num_ge;//定義千位,百位,十位,個(gè)位。
uint time;//要顯示的時(shí)間0~9999
uint tcnt;//計(jì)時(shí)單元
//*****************//
//以下是端口定義
//*****************//
sbit key_qian=P1^0;//按鍵"千加1"
sbit key_bai =P1^2;//按鍵"百加1"
sbit key_shi =P1^4;//按鍵"十加1"
sbit key_ge =P1^6;//按鍵"個(gè)加1"
sbit laba =P3^1;//喇叭
void delay(unsigned int z)//1毫秒延時(shí)子函數(shù)
{
unsigned int x,y;
for(x=z;x0;x--)
for(y=110;y0;y--);
}
//*****************//
//以下是七段數(shù)碼管驅(qū)動(dòng)程序
//*****************//
/**************************************************
** 功能描述: 中斷接受字符串驅(qū)動(dòng)程序
**占用引腳資源 P30
**占用系統(tǒng)資源 串口中斷;中斷向量4
***************************************************/
#define DUAN P0
#define WEI P2
unsigned char code dispcode[]=
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
}; //共陰段碼表
//0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,NULL,-
uchar code dispbitcode[]=
{0xef,0xdf,0xbf,0x7f}; //共陰位碼表
uchar dispbuf[4],dispcount;//開(kāi)辟四個(gè)顯示緩沖區(qū)
void ledinit()/***初始化子函數(shù),定時(shí)器0刷新顯示內(nèi)容***/
{
TMOD|=0x01; // 定時(shí)器0方式1
TH0=(65536-5000)/256; //定時(shí)器16位模式
TL0=(65536-5000)%256; //溢出時(shí)間:5ms
TR0=1; //開(kāi)啟定時(shí)器0
ET0=1; //使能定時(shí)器0
EA=1; //系統(tǒng)使能
}
void leddisp()//固定顯示某些數(shù)字
{
dispbuf[0]=time/1000;
dispbuf[1]=time%1000/100;
dispbuf[2]=time%100/10;
dispbuf[3]=time%10;
}
void keytest()//按鍵檢測(cè)程序
{
if(!key_qian)//如果千位按鍵
{
delay(5);//5毫秒延時(shí)去抖
if(!key_qian)//如果千位按鍵的確按下了
{
num_qian++;//千位數(shù)字加一
while(!key_qian);//等待按鍵松開(kāi)
}
time+=num_qian*1000;//千位數(shù)字加1
}
if(!key_bai)//如果百位按鍵
{
delay(5);//5毫秒延時(shí)去抖
if(!key_bai)//如果百位按鍵的確按下了
{
num_bai++;//百位數(shù)字加一
while(!key_bai);//等待按鍵松開(kāi)
}
time+=num_bai*100;//百位數(shù)字加1
}
if(!key_shi)//如果十位按鍵
{
delay(5);//5毫秒延時(shí)去抖
if(!key_shi)//如果十位按鍵的確按下了
{
num_shi++;//千位數(shù)字加一
while(!key_shi);//等待按鍵松開(kāi)
}
time+=num_shi*10;//十位數(shù)字加1
}
if(!key_ge)//如果千位按鍵
{
delay(5);//5毫秒延時(shí)去抖
if(!key_ge)//如果個(gè)位按鍵的確按下了
{
num_qian++;//千位數(shù)字加一
while(!key_ge);//等待按鍵松開(kāi)
}
time+=num_ge;//個(gè)位數(shù)字加1
}
}
void main()//主程序
{
ledinit();//數(shù)碼管中斷初始化,定時(shí)器0刷新顯示內(nèi)容
while(1)//大循環(huán)
{
if((!key_qian)||(!key_bai)||(!key_shi)||(!key_ge))//如果四個(gè)按鍵中的任何一個(gè)被按下
keytest();//執(zhí)行按鍵檢測(cè)程序
leddisp();//不斷的刷新顯示內(nèi)容
}
}
//*************************************************
//以下是定時(shí)器0刷新數(shù)碼管顯示內(nèi)容驅(qū)動(dòng)程序
//*************************************************
/**************************************************
** 功能描述: 七段數(shù)碼管驅(qū)動(dòng)程序
**占用引腳資源: 數(shù)碼管段選,數(shù)碼管位選
**占用系統(tǒng)資源T0
***************************************************/
void t0(void) interrupt 1 //using 0
{
TH0=(65536-5000)/256; //5ms中斷
TL0=(65536-5000)%256; //16位定時(shí)器模式
WEI=0xff;//關(guān)位選
DUAN=dispcode[dispbuf[dispcount]]; //段選
WEI=dispbitcode[dispcount]; //開(kāi)位選
dispcount++;
if(dispcount==5)
dispcount=0;
tcnt++; //計(jì)數(shù)個(gè)數(shù)加一
if(tcnt==5*200)//滿(mǎn)足1S了
{
tcnt=0;//計(jì)數(shù)個(gè)數(shù)歸零
time--;//時(shí)間減一
if(time==0)//時(shí)間
while(1);
}
if(time10)//時(shí)間小于10
laba=~laba;//聲音報(bào)警
}
這是9999秒倒計(jì)時(shí)的
文章題目:51c語(yǔ)言計(jì)時(shí)函數(shù) c語(yǔ)音計(jì)時(shí)器
標(biāo)題路徑:http://www.dlmjj.cn/article/doigjce.html