我用51单片机来调试一个液晶显示的程序,为什么液晶显示不出来 1602的液晶,下面是撑血帮我看下,谢谢了

作者&投稿:大叔航 (若有异议请与网页底部的电邮联系)
你好!我的51单片机接1602液晶显示器,为什么程序下进去液晶显示器不显示?~

楼主给你点意见:
1、你的硬件连接有问题,单片机的各模块是否能正常工作?
2、你找的程序是否正确完整?烧录是否异常?
3、你找的程序是否和你自己连接的硬件匹配?

什么都不贴出来,这种问题难!还是自己检查下,也能真正的学点东西

你好,我前段时间使用了HC-SR04超声波测距仪来测距离,用51单片机控制,LCD1602显示距离,精确到0.01cm,最大可测400cm。
我把我的程序给你,能做个测距和显示的参考。
若我们使用的是同一型号的超声波测距仪,可以回复我一起讨论。
希望我的回答能帮助到你。

1、write_com(0x80+17);write_com(0xc0+17);中的【17】改成【0】试试。
2、P0口需全部上拉电阻。有吗?
3、对比度调节电压VL,直接接地试试?
4、初始化时,多写数次write_com(0x38);
5、断点放在write_com(0x18);执行之前,看看显示情况。0x18干嘛的?

本解码程序适用于NEC的upd6121及其兼容芯片的解码,支持大多数遥控器 实验板采用11.0592MHZ晶振
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
sbit IR=P3^2; //将IR位定义为P3.2引脚
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
sbit BEEP = P3^6; //蜂鸣器控制端口P36
unsigned char flag;
unsigned char code string[ ]= ;
unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度
/*****************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}

/*********************************************************/
void beep() //蜂鸣器响一声函数
{
unsigned char i;
for (i=0;i<100;i++)
{
delay1ms();
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(250); //延时
}

/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x0C); //显示模式设置:显示开,有光标,光标闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
/************************************************************
函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
bit DeCode(void)
{

unsigned char i,j;
unsigned char temp; //储存解码出的数据
for(i=0;i<4;i++) //连续读取4个用户码和键数据码
{
for(j=0;j<8;j++) //每个码有8位数字
{
temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是高位数据
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==0) //如果是低电平就等待
; //低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平宽度
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==1) //如果是高电平就等待
;
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存高电平宽度
if((LowTime<370)||(LowTime>640))
return 0; //如果低电平长度不在合理范围,则认为出错,停止解码
if((HighTime>420)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次
temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0
if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1
}
a[i]=temp; //将解码出的字节值储存在a[i]
}
if(a[2]=~a[3]) //验证键数据码和其反码是否相等,一般情况下不必验证用户码
return 1; //解码正确,返回1
}

/*------------------二进制码转换为压缩型BCD码,并显示---------------*/

void two_2_bcd(unsigned char date)
{

unsigned char temp;
temp=date;
date&=0xf0;
date>>=4; //右移四位得到高四位码
date&=0x0f; //与0x0f想与确保高四位为0
if(date<=0x09)
{
WriteData(0x30+date); //lcd显示键值高四位
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
date=temp;
date&=0x0f;
if(date<=0x09)
{
WriteData(0x30+date); //lcd显示低四位值
}
else
{
date=date-0x09;
WriteData(0x40+date);
}
WriteData(0x48); //显示字符'H'
}
/************************************************************
函数功能:1602LCD显示
*************************************************************/
void Disp(void)
{
WriteAddress(0x40); // 设置显示位置为第一行的第1个字
two_2_bcd(a[0]);
WriteData(0x20);
two_2_bcd(a[1]);
WriteData(0x20);
two_2_bcd(a[2]);
WriteData(0x20);
two_2_bcd(a[3]);

}
/************************************************************
函数功能:主函数
*************************************************************/
void main()
{
unsigned char i;
LcdInitiate(); //调用LCD初始化函数
delay(10);
WriteInstruction(0x01);//清显示:清屏幕指令
WriteAddress(0x00); // 设置显示位置为第一行的第1个字
i = 0;
while(string[i] != '\0') //'\0'是数组结束标志
{ // 显示字符
WriteData(string[i]);
i++;
}
EA=1; //开启总中断
EX0=1; //开外中断0
ET0=1; //定时器T0中断允许
IT0=1; //外中断的下降沿触发
TMOD=0x01; //使用定时器T0的模式1
TR0=0; //定时器T0关闭
while(1); //等待红外信号产生的中断

}
/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0
{
EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==0); //如果是低电平就等待,给引导码低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平时间
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==1); //如果是高电平就等待,给引导码高电平计时
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存引导码的高电平长度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
{
//如果是引导码,就开始解码,否则放弃,引导码的低电平计时
//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
if(DeCode()==1) // 执行遥控解码功能
{

Disp();//调用1602LCD显示函数
beep();//蜂鸣器响一声 提示解码成功
}
}
EX0=1; //开启外中断EX0
}

下面的程序我已通过测试,我所用的1602是还几年前买的,可能跟现在卖的在初始化的子程序内有点区别,但是调准延时程序的延时时间很重要,延时时间短了,也不能正常初始化,也就显示不正确了。下面的功能是演示,将1602的字库内容全都轮流的显示一遍边又一遍。
The program below I have passed through the test, I used the 1602 display was bought at few years ago . Probably it had a little bit difference with now selling the 1602.But i knewn the difference place is in the initialing subroutines. So you shoul focuse the delay program, the delay time is very important, delay time short, also cannot normal initialization, also display incorrectly. The following function is demo, it will display all the content of 1602 again and again.
//=============================
//#include "STC11F.h"
#include<reg51.h>
// ==================================================================
//定义数据结构的简易写法
#define u8 unsigned char
sbit rs = P3^4;
sbit r_w = P3^6;
sbit e = P3^3;
idata u8 disp_buff[24];

u8 su_0=0x30;
u8 su_1=0x31;
u8 su_2=0x32;
u8 su_3=0x33;
u8 su_4=0x34;
u8 su_5=0x35;
u8 su_6=0x36;
u8 su_7=0x37;
u8 su_8=0x38;
u8 su_9=0x39;
u8 CHA=0x41;
u8 CHB=0x42;
u8 CHC=0x43;
u8 CHD=0x44;
u8 CHE=0x45;
u8 CHF=0x46;
u8 CHG=0x47;
u8 CHH=0x48;
u8 CHI=0x49;
u8 CHJ=0x4A;
u8 CHK=0x4B;
u8 CHL=0x4C;
u8 CHM=0x4D;
u8 CHN=0x4E;
u8 CHO=0x4F;
u8 CHP=0x50;
u8 CHQ=0x51;
u8 CHR=0x52;
u8 CHS=0x53;
u8 CHT=0x54;
u8 CHU=0x55;
u8 CHV=0x56;
u8 CHW=0x57;
u8 CHX=0x58;
u8 CHY=0x59;
u8 CHZ=0x5A;
u8 ch_a=0x61;
u8 ch_b=0x62;
u8 ch_c=0x63;
u8 ch_d=0x64;
u8 ch_e=0x65;
u8 ch_f=0x66;
u8 ch_g=0x67;
u8 ch_h=0x68;
u8 ch_i=0x69;
u8 ch_j=0x6a;
u8 ch_k=0x6b;
u8 ch_l=0x6c;
u8 ch_m=0x6d;
u8 ch_n=0x6e;
u8 ch_o=0x6f;
u8 ch_p=0x70;
u8 ch_q=0x71;
u8 ch_r=0x72;
u8 ch_s=0x73;
u8 ch_t=0x74;
u8 ch_u=0x75;
u8 ch_v=0x76;
u8 ch_w=0x77;
u8 ch_x=0x78;
u8 ch_y=0x79;
u8 ch_z=0x7a;
u8 blank=0x20;
u8 point=0x2e;

//Here the MCU is STC1F32XE(1T MCU. If you used to be normal MCU,
//you should have changed the delay software. if not to change it,
//It is not work well ) WITH 22.1184MHZ.
//The dalay software as follow:

void delay1us()
{
u8 i=3; //when Fosc=22.1184M 1T=0.045 here will delay 1.08us

while(--i);
}

void D20us() // 22.1184 MHz
{ u8 i;
for(i=20;i>0;i--) //20US
delay1us();
}

void D250us(u8 Delay) // 22.1184 MHz
{ u8 i;
for(;Delay>0;Delay--)
{ for(i=250;i>0;i--) //250US
delay1us();
}
}

void d1ms(u8 Delay) // Delay 1 mS Fm = 22.1184 MHz
{ u8 i;
for(;Delay>0;Delay--)
{ for(i=50;i>0;i--) //50*20US=1000US=1MS
D20us();
}
}

//---------------------------------
u8 bf_and_ac () /*read busy and adrss counter*/
{
u8 x;
r_w=0;
rs=0;
e=0;
d1ms(10); //the delay time have tried OK!
r_w=1;
e=1;
d1ms(10);
x=P1;
e=0;
r_w=0;
return(0);
}

//-------------------------

void w_code(u8 order) // write cmd
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
e=1;
P1=order;
e=0;
r_w=0;
}

//----------------------------------------------
void w_data(u8 su) // write data
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
rs=1;
e=1;
P1=su;
e=0;
r_w=0;
}
//----------------------------
u8 r_data()
{
u8 x;
x=bf_and_ac();
while((x&0x80)==0x80)
{
x=bf_and_ac();
}
r_w=0;
rs=1;
e=1;
x=P1;
e=0;
r_w=0;
return(x);
}

void w_ram(u8 adrss,u8 su,u8 length) //set position;data;data length
{
u8 i;
w_code(adrss);
for(i=0;i<length;i++)
w_data(su);
}

void DisplayOneChar(u8 x,u8 y,u8 su)
{
x=x&0x0f;
y=y&0x01;
if(y)x=x|0x40;
x|=0x80;
w_code(x);
w_data(su);

}

void DispLstChar(u8 x,u8 y,u8 slength,u8 *su)
{
u8 ListLength;
ListLength=0;
x=x&0x0f;
y=y&0x01;
while(ListLength<slength)
{
DisplayOneChar(x,y,su[ListLength]);
ListLength++;
x++;
}

}

void init()
{
w_code(0x38);
d1ms(10);//dSP1ms(1);
w_code(0x01);
d1ms(10);//dSP1ms(1);
w_code(0x06);
d1ms(10);//dSP1ms(1);
w_code(0x0e);
}

void main()
{
char l0,l1,l2;
init();
while(1)
{
disp_buff[0] = CHO;
disp_buff[1] = CHK;
disp_buff[2] = su_4;
disp_buff[3] = su_0;
disp_buff[4] = su_0;
disp_buff[5] = CHC;
disp_buff[6] = blank;
disp_buff[7] = CHS;
disp_buff[8] = CHY;
disp_buff[9] = CHS;
disp_buff[10] = CHT;
disp_buff[11] = CHE;
disp_buff[12] = CHM;
disp_buff[13] = blank;
disp_buff[14] = CHO;
disp_buff[15] = CHK;
DispLstChar(0,0,16,disp_buff);

w_ram(0x80,0XFF,0x01);
w_ram(0x81,0XFF,0x01);
w_ram(0x82,0XFF,0x01);
w_ram(0x83,0XFF,0x01);
w_ram(0x84,0xFF,0x01);
w_ram(0x85,0xFF,0x01);
w_ram(0x86,0xFF,0x01);
w_ram(0x87,0xFF,0x01);
w_ram(0xc0,0XFF,0x01);
w_ram(0xc1,0XFF,0x01);
w_ram(0xc2,0XFF,0x01);
w_ram(0xc3,0XFF,0x01);
w_ram(0xc4,0XFF,0x01);
w_ram(0xc5,0XFF,0x01);
w_ram(0xc6,0XFF,0x01);
w_ram(0xc7,0XFF,0x01);
w_ram(0x88,0XFF,0x01);
w_ram(0x89,0XFF,0x01);
w_ram(0x8A,0XFF,0x01);
w_ram(0x8B,0XFF,0x01);
w_ram(0x8C,0XFF,0x01);
w_ram(0x8D,0XFF,0x01);
w_ram(0x8E,0XFF,0x01);
w_ram(0x8F,0XFF,0x01);
w_ram(0xc8,0XFF,0x01);
w_ram(0xc9,0XFF,0x01);
w_ram(0xcA,0XFF,0x01);
w_ram(0xcB,0XFF,0x01);
w_ram(0xcC,0XFF,0x01);
w_ram(0xcD,0XFF,0x01);
w_ram(0xcE,0XFF,0x01);
w_ram(0xcF,0XFF,0x01);
d1ms(255);
w_ram(0x80,0X20,0x01);
w_ram(0x81,0X20,0x01);
w_ram(0x82,0X20,0x01);
w_ram(0x83,0X20,0x01);
w_ram(0x84,0x20,0x01);
w_ram(0x85,0x20,0x01);
w_ram(0x86,0x20,0x01);
w_ram(0x87,0x20,0x01);
w_ram(0xc0,0X20,0x01);
w_ram(0xc1,0X20,0x01);
w_ram(0xc2,0X20,0x01);
w_ram(0xc3,0X20,0x01);
w_ram(0xc4,0X20,0x01);
w_ram(0xc5,0X20,0x01);
w_ram(0xc6,0X20,0x01);
w_ram(0xc7,0X20,0x01);
w_ram(0x88,0X20,0x01);
w_ram(0x89,0X20,0x01);
w_ram(0x8A,0X20,0x01);
w_ram(0x8B,0X20,0x01);
w_ram(0x8C,0X20,0x01);
w_ram(0x8D,0X20,0x01);
w_ram(0x8E,0X20,0x01);
w_ram(0x8F,0X20,0x01);
w_ram(0xc8,0X20,0x01);
w_ram(0xc9,0X20,0x01);
w_ram(0xcA,0X20,0x01);
w_ram(0xcB,0X20,0x01);
w_ram(0xcC,0X20,0x01);
w_ram(0xcD,0X20,0x01);
w_ram(0xcE,0X20,0x01);
w_ram(0xcF,0X20,0x01);
d1ms(255);
l0=0x20;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x30;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0x40;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x50;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);

l0=0x60;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0x70;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xa0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xb0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xc0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xd0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
d1ms(255);
l0=0xe0;l2=0x80;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}
l0=0xf0;l2=0xc0;
for(l1=0;l1<0x10;l1++)
{
w_ram(l2+l1,l0+l1,0x01);
}

d1ms(255);

}

}

程序没问题,看是不是连线错了.或者液晶坏了

write_com,write_date函数里面没有对wr赋值啊。WR是决定写入还是读出的


51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示_百度...
3、确认代码无误后,进入下一步,就是在这一行代码(箭头所指)的地方,将这四个字删去。4、然后如图所示,四个字已经删去,只要改成数字相应的代码即可。5、这里改成的是代表数字0的代码,如图所示。6、最后写好代码后,将生成的hex文件写进单片机,数码管显示的数字就变成0了。

用51单片机写一个程序:用定时中断T0T1控制4个数码管显示1..._百度知 ...
分内容转自:《51单片机C语言创新教程》温子祺等著。原理:软件设计方面使用动态驱动数码管的方式,即要保证当数码管显示时的效果没有闪烁的现象出现,亮 度一致,没有拖尾现象。由于人眼对频率大于对24Hz以上的光的闪烁不敏感,这是利用了人眼视觉暂留的特点。一般来说,每一个数码管点亮时间为1~2ms...

51单片机动态显示,程序调试的时候很好没有出错但是在实际的工作中,数码...
速度调一下,也就是延时调一下,实在不行加一个消影的动作,动态扫是这样的,动态不就是利用人眼的视觉特性嘛 ,可是要是动态扫的慢了就会闪,要是扫得太快就会分不清,消影就是加个P1=1;这种全部关断一下,在位切换之前加就好了,你可以试试。

说明串口助手在51单片机调试过程中的用途. C语言的h头文件是干什么用...
我只熟悉7,串口助手是用来调试嵌入式软件的,通常用来接收和发送调试信息,例如单片机运行中在一些定位点打印一些数据出来,以便调试软件。流行的软件有格西烽火(功能比较强,自动化测试比较好)、SSCOM、串口调试助手等。

这是一个51单片机的流水灯的程序,但是在keil里调试不出效果,望答疑,谢 ...
我是实在看不下去了,你把for循环后面加分号就成语句了,他就不会循环8次,i+7 = 8才跳出for循环,所以就这里错误了。include<reg52.h> unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,};void delay() ;main(){ unsigned char i;while(1){ for (i=0;i<...

51单片机C语言编程中,测试某个口的电平。为什么不先设置此口为输入口...
实际上,单片机的IO口是有设置IO工作模式的寄存器的(设置作用),但是单片机默认把IO设置为双向模式了,所以即可作为输出模式也可作为输入模式。你可以根据你的需求设置单片机的IO工作为某种模式。不过通常来说,默认的双向模式已经可以满足使用了。如果要设置IO的工作模式的话,请参照你单片机的手册相关说明...

51单片机中用定时器怎么样控制频率
include<reg52.h> include<intrins.h> define uint unsigned int \/\/宏定义 define uchar unsigned char \/\/宏定义 sbit beep=P2^3;uchar num=0,times=0;uint flag,tt;uint freq[]={4000,400,80,40,20,10,5,4}; \/\/1Hz~1KHz void main() \/\/主函数 { beep=0;TMOD=0x12;\/\/设...

关于51单片机定时器的程序,P1.5连接蜂鸣器(用C语言写)
让蜂鸣器发出两种不同的声调很容易,只要给蜂鸣器的控制信号发送不同频率的脉冲就可以实现了,以下以延时方式来做。#include#defineucharunsignedchar#defineuintunsignedintsbitSPK=P1^0;sbitK1=P1^7;\/\/发声函数voidAlarm(uchart){uchari,j;for(i=0;i<200;i++){SPK=~SPK;for(j=0;j ...

51单片机如何用计数器检测脉冲信号(高低电平),程序怎么做!没有思路...
可以利用51单片机的计数器T0、T1,例如用计数器0的外部计数脉冲输入端T0计数,当计满100个脉冲数量后,触发中断。进入计数服务中断程序。如果有脉冲信号,经过电容微分后,在下降沿会产生一个向下的尖端脉冲,电阻R2是作为一个偏置,当有向下的尖端脉冲来后,反相端的电压会低于同向端的电压。从而比较器...

51单片机中如何用汇编语言编写流水灯
流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:ORG 0000H;复位启动AJMP START;ORG 001BH;T1中断AJMP T1INT;;定义变量===YSJSEQU 30H;延时计数器LEDEQU 31H;LED控制缓冲器 ;主程序===START:MOV LED,#0FEH;初始化数据MOV YSJS,#0;MOV TMOD,#10H;定时器1工作于方式1,16位定时...

环江毛南族自治县18774285193: 用51单片机如何实现液晶显示图片 -
殳厘聚苯: 买那种带驱动的液晶屏(屏的驱动,SD卡的驱动的等),资料也比较全,单片机就能驱动

环江毛南族自治县18774285193: 如何使用单片机来控制一块彩色的液晶显示器,来显示一些东西. -
殳厘聚苯: 建议你找一块ILI9325的彩色TFT显示器,然后找到单片机的驱动程序,上电玩一下,就什么都明白了.

环江毛南族自治县18774285193: 51单片机简单的1062液晶显示程序求助 -
殳厘聚苯: 光看代码你是不能了解它的使用历程的,最好看看使用手册,下面的代码是用1602液晶#include#define uchar unsigned char#define uint unsigned intuchar code table[]="I LIKE MCU!";uchar code table1[]="(uchar com){lcdrs=0;P0=com;delay(5)...

环江毛南族自治县18774285193: 51单片机里用c语言通过控制什么来控制1602液晶显示的开关??? -
殳厘聚苯: 整体显示关:写命令0x08;整体显示开:写命令0x0C;这个只能控制1602液晶的显示,不能控制背光的关闭与开启.要关闭或开启背光,请直接控制背光源.引脚A(有时标成BLA)是背光源正极;引脚K(有时标成BLK)是背光源负极;这两个引脚任意一个接一支三极管就能控制背光的开关了.背光关闭后液晶上还是能看到字,要熄屏不仅要关闭背光,还要关闭液晶的显示.当然你也可以把1602的电源接三极管直接关了,但是这样的话下次打开就要重新初始化1602

环江毛南族自治县18774285193: 老师你好,我是学电子的,遇到一个用51单片机完成的LCD显示问题.希望能得到你的帮助. -
殳厘聚苯: 按一就只显示一,按二就只显示二,这是只能显示一个字符啊,也不叫显示一串字符吗? 其实,很简单,在给LCD1602送字符时,在带上显示的位置坐标参数吧,这个参数,你用一个变量,每送一个字符变量加1,下次,再显示就在下一个位置了,依次显示就行了.注意每一行只能显示16个字符啊,一行显示满了,要么换下一行,要么像字幕一样向左滚动显示. 你这程序发图片,谁能看清楚啊,太累了,就没心看了,谁也不会看的.这么点程序,完全可以发上来的.

环江毛南族自治县18774285193: 51 单片机1602 液晶显示数字 -
殳厘聚苯: 1602显示要转换为ANSI码 如: 1602液晶要显示数字5----- 把0x35送1602的显示RAM(因为数字5的ANSI码是0x35)

环江毛南族自治县18774285193: 利用51单片机、LCD显示器设计一个单片机显示系统,要求在液晶上显示“HELLO,PROTUS”. -
殳厘聚苯: #include<reg52.h> //包含头文件,这个嘛,就不用多说了~~ #define uint unsigned int //预定义一下 #define uchar unsigned char sbit rs=P2^5; //1602的数据/指令选择控制线 sbit rw=P2^6; //1602的读写控制线 sbit en=P2^7; //1602的使能控制线 /*P2...

环江毛南族自治县18774285193: 请问51的单片机能不能让彩色的液晶屏工作? -
殳厘聚苯: 原理上是可以的,比方说有一个很普通的摄像头,然后用单片机将其在彩色的液晶屏上显示出来,无非就是读数据和写数据.但不是随便一个单片机就可以,因为图像传输的数据量比较大,对传输速度有一定要求,同时,彩色的液晶屏和摄像头加起来,需要的IO比较多.建议采用STC的1T高速大管脚容量单片机.

环江毛南族自治县18774285193: 单片机彩色液晶屏的使用方法 -
殳厘聚苯: 彩色液晶分为这样两种 带控制器的 和不带控制器的 不带控制器的 必须向电视那样 一秒刷50次+ 单片机根本承受不了 带控制器的写个命令就行了 但是彩色液晶的控制器没有统一标准 也没有教材 你唯一能做的只有两点 自己看手册 然后 卖你液晶的一般都提供例程(至少网上买的都这样) 其他的就是慢慢调试了~硬件一定要保证通(彩色液晶的线多 硬件自己做经常出毛病)

环江毛南族自治县18774285193: 你好!我的51单片机接1602液晶显示器,为什么程序下进去液晶显示器不显示? -
殳厘聚苯: 楼主给你点意见:1、你的硬件连接有问题,单片机的各模块是否能正常工作?2、你找的程序是否正确完整?烧录是否异常?3、你找的程序是否和你自己连接的硬件匹配?什么都不贴出来,这种问题难!还是自己检查下,也能真正的学点东西

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网