数字电压表课设报告
- 格式:docx
- 大小:113.58 KB
- 文档页数:8
.专业整理.
.学习帮手.
附录:程序及仿真图
1.程序如下
#in elude
sbit P2_0=P2A0;
sbit ST=P3A6; //
sbit OE=P3A7;
sbit EOC=P3A3; 启动控制端
//输出允许控制端
//转换结束检测
code char CgramData0[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02}; // 年
code char CgramData1[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00}; // 月
code char CgramData2[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}; // 日
code char CgramData3[]={0x00,0x04,0x1f,0x0a,0x04,0x0a,0x11,0x00}; // 刘
code char CgramData4[]={0x00,0x04,0x14,0x14,0x14,0x04,0x0c,0x00}; //
code char CgramData5[]={0x08,0x1e,0x1a,0x16,0x1a,0x16,0x1e,0x00}; // 自
code char CgramData6[]={0x04,0x04,0x1F,0x0E,0x15,0x1F,0x04,0x00}; // 本
un sig ned char Y[6],getdata1=0,i,j; un sig ned int getdata=0;
uchar Voltage[]="Voltage=1.541";
uchar zifu[]="liucha ngyin";
uchar zifu1[]="Number:200501167";
un sig ned int k=0;
un sig ned long V;
un sig ned char coun t=0;
bit biaozhi=0; //定时用
//动态换屏用
void delay10us()〃 延时,增加显示稳定性
{ for(i=0;i<10;i++);
}
void xia nshi() // 显示函数
{
V=getdata*500000/255;
for(i=0;i<6;i++)//LCD 显示数操作
{Y[i]=V%10;
V/=10;
} .专业整理.
.学习帮手.
//LCD1602 显示
Voltage[8]=Y[5]+48;
Voltage[9]='.';
Voltage[10]=Y[4]+48;
Voltage[11]=Y[3]+48;
Voltage[12]=Y[2]+48;
Voltage[13]='\0:
display_str(0x40+0x80,Voltage);
delay10us();
getdata=0;
} void mai n(void)
{
lcd_ini t();
display_str(0x80,zifu); //
P2_0=0; 〃P2_0 —直为低,便于用 P3_6和P3_7控制启动AD和读取数据
OE=1; // 不允许读取数据
TMOD=0x10; // 定时器0选用方式1
TH1=0x3C; //
TL仁 0xB0; //50ms
TR1=1; // 启动T1计时
ET仁 1; // 定时器0中断使能
EA=1; // 开中断
P0=0xf8; //
delay10us(); 选择通道1
ST=1;ST=0;ST=1; // 启动 AD转换 while(1)
{
}
}
void tl(void) in terrupt 3 using 0 // 定时器 1 中断执行部分
{
coun t++;
if(co un t==5)
{
if(biaozhi==0) // 显示:"自本 10504 0501167" 第一行显示字符串
EX1=1; //外部中断1使能
IT1=1; //外部中断1为边沿触发 .专业整理.
.学习帮手.
{
write_cgram(0x40,CgramData5); display_cgram(0x80,0x00);
write_cgram(0x48,CgramData6);
display_cgram(0x81,0x01);
display_str(0x82,"10504 0501167"); // 第一行显示字符串
}
if(biaozhi==1) // 显示:"2008 年 07 月 10 日 文
{
display_str(0x80,"2008");
write_cgram(0x60,CgramData0); display_cgram(0x84,0x04);
display_str(0x85,"07");
write_cgram(0x78,CgramData1); display_cgram(0x87,0x07);
display_str(0x88,"10 ");
write_cgram(0x40,CgramData2);
display_cgram(0x8A,0x00);
write_cgram(0x50,CgramData3);
display_cgram(0x8C,0x02);
write_cgram(0x58,CgramData4);
display_cgram(0x8D,0x03);
}
biaozhi=~biaozhi;
coun t=0;
}
TH1=0x3C; //
TL1=0xB0; //50ms
TR1=1; // 启动T1计时
P1= ~P1;.专业整理.
.学习帮手.
ST=1;ST=0;ST=1;〃 重新启动 AD转换 }
//*************************************
//led 头文件
//*************************************
#in clude
#in clude
#in elude
#defi ne lcd_data P0 // 定义端口
#defi ne uchar un sig ned char
#defi ne uint un sig ned int
sbit RS=P2A1;
sbit RW=P2A2;
sbit E=P2A3;
sbit BF=P0A7;
//***************************************
//延时函数
//***************************************
void delay( uint i)
{ while(i--);
} //***************************************
//写控制字 void in tl(void) in terrupt 2 using 0
{
PO=Oxff;
OE=0;
getdata 仁PO;
OE=1;
getdata+=getdata1;//10
k++;
if(k==10)
{ EX仁 0; //外部中断 1执行部分
//
//
//
// 传输数据使能 得到转换数据 不允许传输数据
次求和取平均值
getdata=getdata/10; //
xia nshi(); //
k=0;
EX仁 1;
}
P0=0xf8;〃 选择通道 // 关闭外部中断1
取平均值
利用LCD显示电压值
允许外部中断1 .专业整理.
.学习帮手.
〃***************************************
void write_struct(uchar temp)
{
E=0; delay(IOO);
〃while(BF==1);
RW=0;
RS=0; lcd_data=temp; delay(3);
E=1;
delay(3);
E=0;
}
〃**************************************
//写数据
〃**************************************
void write_data(uchar temp)
{
delay(100);
〃while(BF==1);
E=0;
RS=1;
RW=0;
lcd_data=temp;
E=1;
delay(3);
E=0;
}
〃***************************************
//lcd 初始化
〃***************************************
void lcd」n it()
**************************************
//向CGRA写入数据
**************************************
void write_cgra m(un sig ned char adress, un sig ned char
*p)
{ {
write_struct(0x38); //
write_struct(0x08); //
write_struct(0x01); //
write_struct(0x06); //
write_struct(OxOc); // } 设置接口 DB宽度(8位)和LCM显示行数(2行)
执行清屏操作
设置光标为加1模式
设置光标为移位模式
//*
//*