標(biāo)題:
51單片機(jī)檢測頻率并輸出到1602
[打印本頁]
作者:
zangqqwwe
時間:
2017-12-22 16:10
標(biāo)題:
51單片機(jī)檢測頻率并輸出到1602
#include<STC11.h>
#define uint unsigned int
#define uchar unsigned char
sbit LCD_RS= P3^6;//定義LCD引腳
sbit LCD_RW= P3^0;
sbit LCD_E= P3^7;
//sbit beep=P2^0;
uchar code DIS[]={"--Sound_waves---"};//NE555 測試;
uchar code dsptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表碼;
uchar i,c[4],a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint s;
/*====================延時子程序====================*/
void delay(uint z)
{
uchar m;
for(;z>0;z--)
for(m=124;m>0;m--);
}
void delay400ms(void)////400ms延時
{ uchar z = 5;
uint m;
while(z--)
{ m=7269;
while(m--);
}
}
/*====================LCD1602子程序====================*/
/*-- 讀狀態(tài) --*/
//讀狀態(tài)子程序;有返回值;返回值類型為CHAR型;
//讀回的狀態(tài)通過RETURN返回;
uchar read_estate(void) //定義有返回值的函數(shù);
{ P1=0Xff; //把LCD端口全置1方便讀取信號;
LCD_RS=0; //RS置0;
LCD_RW=1; //RW置1;
LCD_E=0; //E端置0;
delay(10); //短延時;
LCD_E=1; //E端置1;以鎖存數(shù)據(jù);
while(P1&0x80); //檢測忙,則一直循環(huán);
return(P1); //返回讀取的信號;
}
/*-- 寫數(shù)據(jù) --*/
//寫數(shù)據(jù)子程序;無返回值;輸入變量I;
//I為要寫入LCD中的數(shù)據(jù);
//數(shù)據(jù)類型CHAR形;
void write_data(uchar i) //定義輸入變量值I;
{
read_estate(); //檢測忙信號;
P1=i; //把I中數(shù)據(jù)送到LCD數(shù)據(jù)端;
LCD_RS=1; //RS置1;
LCD_RW=0; //RW置0;
LCD_E=0; //E置0;
delay(10); //短延時;
LCD_E=1; //E置1;以鎖存數(shù)據(jù);
}
/*-- 寫指令 --*/
//寫指令子程序;無返回值;輸入二個變量I和J.
//I為要寫入LCD的指令;J為判斷要不要檢測忙.
//如果J為0則不判斷檢測忙;
//如果J為1則判斷檢測忙;
void write_dictate(uchar i,j) //定義二個變量;
{
if(j)read_estate(); //根據(jù)需要檢測忙;
P1=i; //把要寫入的數(shù)據(jù)送到LCD數(shù)據(jù)端;
LCD_RS=0; //RS置0;
LCD_RW=0; //RW置0;
LCD_E =1; //E端置0;
delay(10); //延時;
LCD_E =0; //E端置1;以鎖存數(shù)據(jù);
}
/*-- LCD初始化 --*/
//LCD初始化程序;主要作用初始化LCD,對LCD進(jìn)行復(fù)位以及設(shè)置;
void initialization(void) //定義函數(shù);
{
delay(50); //延時5MS;
write_dictate(0x38,0); //寫指令38H;不檢測忙;
delay(50); //延時5MS;
write_dictate(0x38,0); //寫指令38H;不檢測忙;
delay(50); //延時5MS;
write_dictate(0x38,0); //寫指令38H;不檢測忙;
delay(50);
write_dictate(0x38,1); //顯示模式設(shè)置;檢測忙;
write_dictate(0x08,1); //關(guān)閉顯示;檢測忙;
write_dictate(0x01,1); //顯示清屏;檢測忙;
write_dictate(0x06,1); //顯示光標(biāo)移動設(shè)置;檢測忙;
write_dictate(0x0C,1); //顯示開及光標(biāo)設(shè)置;檢測忙;
}
/*-- 在指定位置顯示一個字符 --*/
void displayonechar(uchar x, y,ddata)
{
y &= 0x01;
x &= 0x0f; //限制X不能大于15,Y不能大于1
if (y) x+= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
x+= 0x80; //算出指令碼
write_dictate(x,0); //這里不檢測忙信號,發(fā)送地址碼
write_data(ddata);
}
/*-- 在指定位置顯示一串字符 --*/
void displaylistchar(uchar x,y,uchar code *ddata)
{uchar a=0;
y&=0x01;
x&=0xf;
while(ddata[a]>0x20)
{ if(x<=0xff)
{
displayonechar(x, y,ddata[a]);
a++;
x++;
}
}
}
/*====================MAIN主程序====================*/
void main()
{
delay400ms();//延時400MS
initialization();//LCD復(fù)位;
displaylistchar(0,0,DIS);//顯示NE555 測試;
displayonechar(0,1,'F'); //在LCD是顯示F=____Hz
displayonechar(1,1,'=');
displayonechar(8,1,'H');
displayonechar(9,1,'z');
TMOD=0X51; //定義T0為方式一(十六位進(jìn)制),T1為計數(shù)器(16位)
TH0=0X3C; //50 ms
TL0=0XB0;
TH1=0X00; //初始值
TL1=0X00;
TR0=1;
TR1=1;
ET0=1;
ET1=0;
EA=1;
i=0;
/* 顯示 */ // 調(diào)用顯示子程序(顯示位,顯示行,顯示數(shù)據(jù)) 注:顯示行 "0"為第一行,"1為第二行"
while(1)
{
if(s/10000>=1)
{
displayonechar(3,1,dsptab[s/10000]); //萬
displayonechar(4,1,dsptab[s/1000%10]);//千
displayonechar(5,1,dsptab[s/100%10]);//百
displayonechar(6,1,dsptab[s/10%10]); //十
displayonechar(7,1,dsptab[s%10]); //個
}
else if(s/1000>=1)
{
displayonechar(3,1,' ');
displayonechar(4,1,dsptab[s/1000%10]);//千
displayonechar(5,1,dsptab[s/100%10]);//百
displayonechar(6,1,dsptab[s/10%10]); //十
displayonechar(7,1,dsptab[s%10]); //個
}
else if(s/100>=1)
{
displayonechar(2,1,' ');
displayonechar(3,1,' '); //萬
displayonechar(4,1,' '); //千
displayonechar(5,1,dsptab[s/100%10]);//百
displayonechar(6,1,dsptab[s/10%10]); //十
displayonechar(7,1,dsptab[s%10]); //個
}
else if(s/10>=1)
{
displayonechar(2,1,' ');
displayonechar(3,1,' '); //萬
displayonechar(4,1,' '); //千
displayonechar(5,1,' ');//百
displayonechar(6,1,dsptab[s/10%10]); //十
displayonechar(7,1,dsptab[s%10]); //個
}
else
{
displayonechar(2,1,' ');
displayonechar(3,1,' '); //萬
displayonechar(4,1,' '); //千
displayonechar(5,1,' ');//百
displayonechar(6,1,dsptab[s/10%10]); //十
displayonechar(7,1,dsptab[s%10]); //個
}
}
}
/* 中斷 */
void t0()interrupt 1
{
TH0=0X3C;
TL0=0XB0;
i++;
if(i==20) //1 s時間到時
{
s=TH1; //555信號發(fā)生器的輸出口接P3.5(T1) 15腳
s=s<<8;
s=s+TL1;
i=0; //清零
TH1=0X00;
TL1=0X00;
}
}
/*----------------------------------------------------------------*/
/*----------------- 1602液晶數(shù)據(jù)讀取子程序 -----------------------*/
//讀數(shù)據(jù)子程序;有返回值,返回值類型為CHAR型;
/*uchar read_data(void) //定義有返回值的子函數(shù);
{
LCD_DATA=0Xff; //LCD數(shù)據(jù)端口置1;
LCD_RS=1; //RS置1;
LCD_RW=1; //RW置1;
LCD_E=0; //E置0;
delay(10); //短延時;
LCD_E=1; //E置1;以鎖存數(shù)據(jù);
return(LCD_DATA); //返回讀取的值;
}
/*----------------------------------------------------------------*/
復(fù)制代碼
NE555.zip
2017-12-22 16:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
33.96 KB, 下載次數(shù): 83, 下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1