导航:首页 > 操作系统 > 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相关的资料

热点内容
腾讯云连接不上服务器 浏览:221
不能用来表示算法的是 浏览:859
6轴机器人算法 浏览:890
手机主题照片在哪个文件夹 浏览:294
安卓手机后期用什么软件调色 浏览:628
cad修改快捷键的命令 浏览:242
好钱包app怎么登录不了 浏览:859
树莓派都用python不用c 浏览:757
access文件夹树的构造 浏览:662
安卓多指操作怎么设置 浏览:658
linux树形目录 浏览:727
平方根的简单算法 浏览:898
千牛订单页面信息加密取消 浏览:558
单片机自制红外遥控灯 浏览:719
服务器最小配置怎么弄 浏览:853
ibm服务器硬件如何升级 浏览:923
全球程序员节点赞 浏览:986
php函数传递数组 浏览:632
人工峰群算法的目标函数 浏览:469
如何删加密文档 浏览:105