本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
原码如下:
#include<reg51.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define N 5
//uchar code dispbitcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code dispbitcode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uint temp;
uchar getdata;
uchar temp_H;
uchar temp_M;
uchar temp_L;
sbit P17=P1^7;
//sbit ST=P3^0;
//sbit CLK=P3^1;
sbit ST=P0^6;
sbit CLK=P0^7;
sbit EOC=P3^2;
sbit OE=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
void inital()
{
TMOD=0x01;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
ET0=1;
EA=1;
TR0=1;
}
void intr()interrupt 1
{
TH0=(65536-200)/256;
TL0=(65536-200)%256;
CLK=~CLK;
}
void Delay(unsigned int i)
{
unsigned int j;
for(;i>1;i--)
{
for(j=0;j<125;j++);
{;}
}
}
void display()
{
P34=1;
P35=0;
P36=0;
P1=dispbitcode[temp_H];
P17=0;
P34=1;
P35=0;
P36=0;
Delay(10);
P1=0xff;
P1=dispbitcode[temp_M];
P34=0;
P35=1;
P36=0;
Delay(N);
P1=0xff;
P1=dispbitcode[temp_L];
P34=0;
P35=0;
P36=1;
Delay(N);
P1=0xff;
}
//上面的是电表的相关设置;可用的
void init_serialcom( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
//UART为模式1,8位数据,允许接收
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
//定时器1为模式2,8位自动重装
PCON |= 0x80 ;
//SMOD=1;
TH1 = 0xFD ; //Baud:9600 fosc="11".0592MHz
//IE |= 0x90 ; //Enable Serial Interrupt //这句加上就数字表就不显示了,中断会有影响吗???
TR1 = 1 ; // timer 1 run
TI=1;
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF= ch; //加1
while (TI== 0);
TI= 0 ;
}
//将所采集到量化好的数字发到COM口
void send_data_com()
{
int i;
//reset();
//unsigned char TEMP[]={'0','1','2','3','4','5','6','7','8','9','.','\n','V'};
unsigned char TEMP[5];
//temp=getdata*1.0/255*500;
TEMP[0]=temp/100%10+'0';
TEMP[1]=temp/10%10+'0';
TEMP[2]=temp%10+'0';
TEMP[3]=0x0d;// 回车
TEMP[4]=0x0a;// 换行
for(i=0;i<5;i++)
send_char_com(TEMP[i]);
//send_char_com('2');
}
void reset()
{ ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P2;
OE=0;
}
void show()
{
reset();
temp=getdata*1.0/255*500;
temp_H=temp/100;
temp_M=temp/10%10;
temp_L=temp%10;
display();
}
void main()
{
inital();
P2=0xff;
init_serialcom();
while(1)
{
show();
send_data_com();
}
}
作用是将采到电压值转成数字,分别发到COM口和以数码管的形式显示出来,现在数码管这块是OK的,COM这块一直显示的为字母,不知是不是波特率的问题,请大侠们看下 |