完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1ETxlko5AsaqQvoNRZndiDA?pwd=8888
部分代码展示
include<reg51.h>
#include<stdio.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SDA1=128;//串行数据输入,对应595的14脚SER
sbit SCL1=129;//移位寄存器时钟输入,对应595的11脚SCK
sbit SCL2=130;//存储寄存器时钟输入,对应595的12脚RCK
sbit SDA2=131;//串行数据输入,对应595的14脚SER
sbit SCL3=132;//移位寄存器时钟输入,对应595的11脚SCK
sbit SCL4=133;//存储寄存器时钟输入,对应595的12脚RCK
sbit Alert1 = P2^7; //蜂鸣器超限报警
sbit Alert2 = P2^6; //LED超限报警
sbit CLK=P2^0;
sbit DO=P2^1;
sbit DI=P2^1;
sbit CS=P2^2;
sbit CLR=P3^0;
sbit GATE=P3^1;
sbit K1=P3^7;
uint num=0;
uint c=0;
float d=0;
uchar e=1,f=1;
unsigned long int aaa=0,bbb=0;
//以下是LCD1602驱动程序
void delay1000(uint aaaaaa)
{
uint bbbbbb,cccccc;
for(bbbbbb=aaaaaa;bbbbbb>0;bbbbbb--)
for(cccccc=110;cccccc>0;cccccc--);
}
void in(uchar dddddd)
{
uchar eeeeee;
for(eeeeee=0;eeeeee<8;eeeeee++) //循环8次,刚好移完8位
{
dddddd<<=1;
SCL1=CY;
SDA1=1; //先将移位寄存器控制引脚置为低
_nop_();
_nop_();
SDA1=0;
}
}
void out()
{
SCL2=0; //先将存储寄存器引脚置为低
_nop_();
SCL2=1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
_nop_();
SCL2=0;
}
void in1(uchar ffffff)
{
uchar gggggg;
for(gggggg=0;gggggg<8;gggggg++) //循环8次,刚好移完8位
{
ffffff<<=1;
SCL3=CY;
SDA2=1; //先将移位寄存器控制引脚置为低
_nop_();
_nop_();
SDA2=0;
}
}
void out1()
{
SCL4=0; //先将存储寄存器引脚置为低
_nop_();
SCL4=1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
_nop_();
SCL4=0;
}
void write_com(uchar hhhhhh)
{
in(248);//再传段码
out();
delay1000(2);//延迟时间2ms以内
in1(hhhhhh); //再传段码
out1();
delay1000(2); //延迟时间2ms以内
in(252);//再传段码
out();
delay1000(2);//延迟时间2ms以内
in(248);//再传段码
out();
delay1000(2);//延迟时间2ms以内
}
void write_date(uchar iiiiii)
{
in(249);//再传段码
out();
delay1000(2);//延迟时间2ms以内
in1(iiiiii); //再传段码
out1();
delay1000(2); //延迟时间2ms以内
in(253);//再传段码
out();
delay1000(2);//延迟时间2ms以内
in(249);//再传段码
out();
delay1000(2);//延迟时间2ms以内
}
//LCD1602液晶初始化子函数
void LCD_init()
{
write_com(56);
write_com(12);
write_com(6);
write_com(128);
write_com(1);
}
void LCD_sfj1(uchar x,uchar y)
{
if(y==0)
write_com(0x80|x);
if(y==1)
write_com(0x80|(x-0x40));
}
void LCD_print(uchar *p)
{
while(*p!='\0')
{
write_date(*p);
p++;
}
}
void delay1(uchar x)//ms延时子函数
{
uchar i;
for(i=0;i<x;i++); //延时,脉冲一位持续的时间
}
uchar start(bit temp) //把模拟电压值转换成8位二进制数并返回,dat为通道选择。