#include "reg52.h" sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^2; sbit key=P2^3; unsigned int TR = 1; unsigned char i,j; void init(void); void write(unsigned char dat); void com(unsigned char co); void delay(unsigned char i); unsigned char line1[]="The second is:"; void main() { init (); TMOD=0x01; TH0=(65536-1000)/256; TL0=(65536-1000)%256; ET0=1; EA=1; TR0=1; EX0=1; IT0=1; com(0x80); for(i=0;i<14;i++) { write(line1[i]); } while(1) { com(0x80|0x40); write(j/100+'0'); write(j/10%10+'0'); write(j%100+'0'); } } void T0_second() interrupt 1 { unsigned char count; TH0=(65536-1000)/256; TL0=(65536-1000)%256; count++; if(count == 1000) { j++; count = 0; } } void INT0_second() interrupt 0 { static unsigned char key_count=0; if(key == 0) { delay(5); if(key == 0) { while( key == 0 ); key_count++; if(key_count == 1) { TR=1; } else if(key_count == 2) { TR=0; } else if(key_count == 3) { j=0; key_count=0; TR=1; } } } } void delay(unsigned char n) { unsigned char i,j; for(i=n;i>0;i--) { for(j=110;j>0;j--); } } void write(unsigned char dat) { RS = 1; RW = 0; EN = 1; P0 = dat; delay(1); EN = 0; } void com(unsigned char cmd) { RS = 0; RW = 0; EN = 0; P0 = cmd ; delay(5); EN = 1; delay(5); EN=0; } void init(void) { com(0x38); com(0x0c); com(0x06); com(0x01); }
时间: 2023-10-23 18:12:52 浏览: 83
这段代码是一个基于8051单片机的LCD显示程序。它使用了reg52.h文件来定义和操作单片机的寄存器。sbit关键字用于定义单片机端口的引脚。
该程序的主要功能是在LCD上显示一个计时器的值,并通过外部中断0来控制计时器的启停和复位。具体的流程如下:
1. 初始化LCD和定时器0。
2. 设置定时器0的计数初值和工作模式。
3. 启用定时器0中断和外部中断0。
4. 在LCD上显示字符串"The second is:"。
5. 进入主循环,不断更新LCD上的计时器值。
定时器0中断函数T0_second()会在定时器0溢出时触发,每1000个溢出会增加j的值,相当于每隔1秒j加1。
外部中断0中断函数INT0_second()用于处理外部中断0触发的事件。当按下按键P2^3时,根据按键的次数执行不同的操作:按下一次启动计时器,再次按下停止计时器,第三次按下复位计时器。
其他函数包括delay()用于延时、write()用于向LCD写数据、com()用于向LCD发送命令、init()用于初始化LCD。
如果你有具体的问题或需要进一步解释,请告诉我。
相关问题
补齐这段C51代码,完成ADC0808的数字电压表虚拟仿真,在LCD1602上显示电压(格式:v=X.XXV,其中“X”对应具体值): #include "reg52.h" #include "intrins.h" typedef unsigned int uint; typedef unsigned char uchar; sbit CLOCK=P3^2; sbit EOC=P3^3; sbit START=P3^4; sbit OE=P3^5; sbit OUT8=P1^0; sbit OUT7=P1^1; sbit OUT6=P1^2; sbit OUT5=P1^3; sbit OUT4=P1^4; sbit OUT3=P1^5; sbit OUT2=P1^6; sbit OUT1=P1^7; sbit D0=P0^0; sbit D1=P0^1; sbit D2=P0^2; sbit D3=P0^3; sbit D4=P0^4; sbit D5=P0^5; sbit D6=P0^6; sbit D7=P0^7; sbit RS=P2^6; sbit RW=P2^5; sbit E=P2^7;
uchar code table[]="0123456789"; // 数码管字符表
void DelayUs2x(uint t)
{
while(t--);
}
void DelayMs(uint t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
void WriteCommand(uchar com)
{
RS=0;
RW=0;
P0=com;
E=1;
_nop_();
_nop_();
_nop_();
E=0;
}
void WriteData(uchar dat)
{
RS=1;
RW=0;
P0=dat;
E=1;
_nop_();
_nop_();
_nop_();
E=0;
}
void InitLcd()
{
WriteCommand(0x38);
DelayMs(5);
WriteCommand(0x38);
DelayMs(5);
WriteCommand(0x38);
DelayMs(5);
WriteCommand(0x38);
WriteCommand(0x08);
WriteCommand(0x01);
WriteCommand(0x06);
WriteCommand(0x0c);
}
uchar ReadADC0808(uchar chn) // 读取ADC0808采集的电压值
{
uchar dat=0;
OE=1;
START=1;
CLOCK=0;
CLOCK=1;
dat|=((D7<<7)|(D6<<6)|(D5<<5)|(D4<<4)|(D3<<3)|(D2<<2)|(D1<<1)|D0);
OE=0;
return dat;
}
void main()
{
uchar value;
float voltage;
InitLcd();
WriteCommand(0x80);
WriteData('v');
WriteData('=');
WriteData(' ');
while(1)
{
value=ReadADC0808(0); // 采集通道0的电压值
voltage=value*5.0/255; // 获取实际电压值
WriteCommand(0x87); // 设置光标位置
WriteData(table[(int)voltage]); // 显示整数部分
WriteData('.'); // 显示小数点
voltage=voltage-(int)voltage; // 获取小数部分
voltage*=100;
WriteData(table[(int)voltage]); // 显示小数部分的整数部分
WriteData(table[(int)(voltage*10)%10]); // 显示小数部分的小数部分
WriteData('V'); // 显示单位
DelayMs(500);
}
}
优化以下代码:#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit CLK = P3^4; sbit ST = P1^0; sbit OE = P1^1; sbit EOC = P1^2; sbit A = P1^3; sbit B = P1^4; sbit C = P1^5; sbit Buzz = P3^2; sbit LED11 = P3^5; sbit LED10 = P3^6;
1. 头文件应该放在程序的最上面。
2. 宏定义中应该加上括号保证优先级。
3. sbit 定义可以放在一起,便于查看和修改。
4. 变量命名应该清晰易懂,便于理解和维护。
以下是优化后的代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK = P3^4;
sbit ST = P1^0;
sbit OE = P1^1;
sbit EOC = P1^2;
sbit A = P1^3;
sbit B = P1^4;
sbit C = P1^5;
sbit Buzz = P3^2;
sbit LED11 = P3^5;
sbit LED10 = P3^6;
void main() {
// TODO: 代码逻辑
}
```
阅读全文