導航:首頁 > 操作系統 > 51單片機計數1602

51單片機計數1602

發布時間:2022-07-13 14:37:39

A. 用51單片機中1602做一個4位顯示的秒錶

#defineLCD1602_FLAG
#defineLCD1602_PORTP0
#include<reg51.h>
#include<stddef.h>
#defineucharunsignedchar

sbitlcd1602_rs=P2^0;
sbitlcd1602_e=P2^2;
sbitlcd1602_rw=P2^1;
sbitlcd1602_busy=P0^7;

ucharstr[]="StopWatch";
uchartime,disdat[4];
uchardat,sec,key;

voiddelay(uchara)
{
uchari;
while(a--)for(i=0;i<120;i++);
}

/*
************************************
*函數名稱:lcd1602_CheckBusy()
*函數功能:狀態查詢
************************************
*/

voidlcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}

/*
***************************************
*函數名稱:lcd1602_WriteCmd()
*函數功能:寫命令
*入口參數:命令字
*出口參數:無
***************************************
*/

voidlcd1602_WriteCmd(constucharcmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}

/*
*******************************************
*函數名稱:lcd1602_WriteData()
*函數功能:寫數據
*入口參數:c--待寫數據
*出口參數:無
*********************************************
*/

voidlcd1602_WriteData(constucharc)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}

/*
***********************************************
*函數名稱:lcd1602_Init()
*函數功能:初始化LCD
*入口參數:無
*出口參數:無
***********************************************
*/

voidlcd1602_Init()
{
lcd1602_WriteCmd(0x38); //顯示模式為8位2行5*7點陣
lcd1602_WriteCmd(0x0c);//displayenable,flagenable,flashenable,
lcd1602_WriteCmd(0x06);//flagmovetoright,screendon'tmove
lcd1602_WriteCmd(0x01);//clearscreen
}

/*
************************************************
*函數名稱:lcd1602_Display()
*函數功能:字元顯示
*入口參數:ptr--字元或字元串指針
*出口參數:無
*說明:用戶可通過以下方式來調用:
*1)lcd1602_Display("Hello,world!");
*2)INT8U存儲類型txt[]="要顯示的字元串";
*或者INT8U存儲類型txt[]={'t','x','t',..,''};
*INT8U*ptr;
*ptr=&txt;
*lcd1602_Display(ptr);
*或lcd1602_Display(txt);
*或lcd1602_Display(&txt);
************************************************
*/

voidlcd1602_Display(constuchar*ptr,ucharline)
{
uchardatai=0;
uchar*dataq;

q=ptr;
switch(line)
{
case0:
lcd1602_WriteCmd(0x80);
while(q!=NULL&&(*q!='')&&i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
case1:
lcd1602_WriteCmd(0xc0);
while(q!=NULL&&(*q!='')&&i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
}
}

voiddischg()
{
disdat[3]=dat+0x30;
disdat[2]='.';
disdat[1]=sec%10+0x30;
disdat[0]=sec/10+0x30;
lcd1602_Display(disdat,1);
}
voidext0()interrupt0
{
key++;
key%=3;
}
voidt0isr()interrupt1 //秒計時
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==2)
{
time=0;
dat++;
if(dat>=10)
{
dat=0;
sec++;
if(sec>59)sec=0;
}
dischg();
}
}

main()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=0;
ET0=1;
EX0=1;
IT0=1;
EA=1;
time=0;
dischg();
lcd1602_Init();
lcd1602_Display(str,0);
lcd1602_Display(disdat,1);
while(1)
{
switch(key)
{
case0:TR0=0;break;
case1:TR0=1;break;
case2:sec=0;dat=0;dischg();break;
}
}
}

B. 51單片機ds18b20小數顯示1602

發出存在脈沖。
51單片機ds18b20小數顯示1602是因為出現了發出存在脈沖導致的。
1602液晶模塊高精度4位小數顯示,溫度解析度0.0625℃,液晶模塊第一行顯示的是DS18B20的64位激光序列號,液晶模塊第二行顯示的是實際溫度。

C. 求對外來低電平個數計數並顯示的1602的51單片機程序

先定義一下LCD的使能埠一些設置
例如:
sbit LCD_RS = P2^6; //復位端
sbit LCD_RW = P2^5; //寫數據端
sbit LCD_EP = P2^7; //使能端
添加讀寫以及初始化LCD的代碼
/****************側忙函數************************/
BOOL lcd_bz()
{
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80); //檢測P0最高位是否為1
LCD_EP = 0;
return result;//返回側忙結果
}

/****************寫命令函數************************/
lcd_wcmd(BYTE cmd)
{ // 寫入指令數據到LCD
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P0 = cmd; //將8位指令通過P0口傳給1602
_nop_();
_nop_(); //用於產生一個脈沖寬度
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}

lcd_pos(BYTE pos)
{ //設定顯示位置
lcd_wcmd(pos | 0x80);
}

/****************寫數據函數************************/
lcd_wdat(BYTE dat)
{ //寫入字元顯示數據到LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat; //將8位數據通過P0口傳給1602
_nop_();
_nop_(); //用於產生一個脈沖寬度
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}

lcd_init()
{ //LCD初始化設定
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay(1);
lcd_wcmd(0x0c); //顯示開,關游標
delay(1);
lcd_wcmd(0x06); //移動游標
delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(1);
}

添加完之後在main函數中添加初始化LCD的函數
例如
void main(void)
{
BYTE i;
lcd_init();// 初始化LCD
delay(10);
while(1)
{
lcd_wcmd(0x06);//向右移動游標
lcd_pos(0);//設置顯示位置為第一行的第1個字元
i = 0;
tt.XX.number = ??; //這邊問好表示你需要顯示的數據,這樣你應該明白怎麼做了
//將你的數據賦值給number即可,然後讓他顯示dis的數據
while(tt.dis1[ i ] != '\0')
{
lcd_wdat(dis1[ i ]);
i++;
delay(30);//控制兩字之間顯示速度
}
delay(500);//控制兩字之間顯示速度
lcd_wcmd(0x01);//清除LCD的顯示內容

}

}
//程序的定義頭文件下寫這個,主要是省去數據轉換這一環節,讓自己代碼更加快速轉換
typedef union
{
unsigned char dis1[4];
struct
{
int number;
}XX;
}TT;
idata TT tt;

D. 51單片機秒錶實現1602顯示

寫入1602速度並不是很慢,每次數據更新時都要將十位和個位重新寫入LCD
如果不想顯示01前面的0,可加判斷語句,如果十位>0,則顯示十位,否則直接顯示個位
你說1602不能連續寫入,指的是什麼?1602列地址會自動加1,給一個地址可寫多個數據

E. 想做一個基於51單片機按鍵計數用LCD1602顯示的編程0-99

加上這些東西,將顯示語句換成1602_display(i)即可,
當然你可以將其改為只顯示2個數字
sbit rw=P1^4;
sbit rs=P1^3;
sbit lcden=P1^5;
#define db P2

void write_com(uchar com)//液晶屏寫命令

{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(12);
lcden=1;
Delay1ms(12);
lcden=0;
}

void write_date(uchar date)//液晶屏寫數據
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(12);
lcden=1;
Delay1ms(12);
lcden=0;
}
void init2()//液晶屏初始化
{

rw=0;
write_com(0x38);
Delay1ms(12);
write_com(0x0f);
Delay1ms(12);
write_com(0x06);
Delay1ms(12);
write_com(0x01);
Delay1ms(12);
}

void 1602_display(uchar temp) //液晶顯示一個8 位二進制數
{
uchar A1,A2,A3;
A1=temp/100;//分離百位、十位、個位
A2=temp/10%10;
A3=A2t%10;
write_com(0x80);//第1行,第1字
write_date(A1+0x30);
Delay1ms(1);
write_date( A2+0x30);
Delay1ms(1);
write_date(A3+0x30);
Delay1ms(1);
}

F. 如何使用51單片機1602液晶顯示和按鍵實現進制轉換計算器設計

8位AD,最大255; uchar num; num=AD_receive();//把AD採集回來的數據保存 write_com(0x80);//1602從0x80開始顯示數據 write_data(num/100+0x30); //顯示字元百位,後面以此類推 write_data(num%100/10+0x30);//十位數 write_data(num%10+0x30);//個位數 至於1602的驅動程序,網上多得是,找找就有了

G. 有關51單片機1602的問題

有幾個錯誤:

  1. 電容上標注104的並不是說容量是104pF,而是指該電容的電容量是10×10^4pF,也就是100 000pF,相當於100nF。演算法類似於電阻的色環標注,最後一位數字是指數。

  2. 上面第一個圖中,1602液晶屏的第1腳是需要接地的,圖中沒有接地。

  3. 上面第一個圖中,1602液晶屏的16腳應該是接地的,你把背光LED的陰極和陽極都接到電源上了,怎麼可能把LED點亮。

  4. 1602的對比度控制VO引腳盡量不要使用固定電阻來控制,因為當電源電壓有變化或者1602的批次不同,可能會導致VO的電壓不同,這時用固定電阻的話難以消除這種離散的差異。盡量使用電位器來控制VO。

  5. 布線問題,自己想辦法吧,可以考慮換IO口。

H. 51單片機在設置在1602上計時顯示十五秒的時候led閃爍,十五秒後led不斷閃爍,計時不停止

你好:
這個程序功能你要懂兩點
1.LCD1602動態顯示:首先編寫好1602液晶驅動程序,靜態顯示一些提示信息,然後留一個位置進行動態顯示,動態顯示其實也是靜態顯示的一個加速版,每隔很短的時間刷新一次靜態顯示的數據。
2.其次你要會使用定時器,用定時器來對時間進行計時,並將計時的變數顯示到1602液晶上,最後進行if判斷,此變數小於15s時閃爍,大於15s時不斷閃爍(你這個要求我沒看懂,閃爍不斷閃爍?)。
有不懂的可以隨時回復我。
希望我的回答能幫助到你。

閱讀全文

與51單片機計數1602相關的資料

熱點內容
6軸機器人演算法 瀏覽:890
手機主題照片在哪個文件夾 瀏覽:294
安卓手機後期用什麼軟體調色 瀏覽:628
cad修改快捷鍵的命令 瀏覽:242
好錢包app怎麼登錄不了 瀏覽:859
樹莓派都用python不用c 瀏覽:757
access文件夾樹的構造 瀏覽:662
安卓多指操作怎麼設置 瀏覽:658
linux樹形目錄 瀏覽:727
平方根的簡單演算法 瀏覽:898
千牛訂單頁面信息加密取消 瀏覽:558
單片機自製紅外遙控燈 瀏覽:719
伺服器最小配置怎麼弄 瀏覽:853
ibm伺服器硬體如何升級 瀏覽:923
全球程序員節點贊 瀏覽:986
php函數傳遞數組 瀏覽:631
人工峰群演算法的目標函數 瀏覽:468
如何刪加密文檔 瀏覽:105
塗鴉app一鍵執行如何刪除 瀏覽:756
安卓手機如何打開fr3文件 瀏覽:743