200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > tlc549串行ad转换实验c语言程序 单片机+TLC549 AD采样LCD12864显示的仿真与程序源码...

tlc549串行ad转换实验c语言程序 单片机+TLC549 AD采样LCD12864显示的仿真与程序源码...

时间:2019-09-03 16:06:31

相关推荐

tlc549串行ad转换实验c语言程序 单片机+TLC549 AD采样LCD12864显示的仿真与程序源码...

#include

#include //sprintf函数包含库

#include

#include //strcpy函数包含库

#define uchar unsigned char

#define uintunsigned int

#define LCD_dataP0//数据口

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

//LCD型号:TS12864A-3(带汉字库) 控制器ST7920

sbit LCD_RS = P2^0; //寄存器选择输入

sbit LCD_RW = P2^1; //液晶读/写控制

sbit LCD_EN = P2^2; //液晶使能控制

sbit LCD_PSB= P2^3; //串/并方式控制

//TLC549端口定义

sbit DIO=P3^5; //数据线

sbit CS=P3^6; //片选

sbit CLK=P3^4; //io口时钟

//proteus的带字库LCD12864不支持数字、英文符号和英文标点

//显示字符:◎①②③④⑤⑥⑦⑧⑨⊙Ⅴ

uchar code dis1[]="电压值:";

uchar code zf[]="◎①②③④⑤⑥⑦⑧⑨⊙Ⅴ";

uchar a[14]; //直接给数组a赋值,会出现V.34V,就是第一个字符被吞并,没实物测试,不知道原因,希望有硬件的帮忙测试下^_^

void bitchange(uchar c[]) //字符转换函数

{

uchar i,m=0,n=0,b[14];

for(i=0;c[i]!='\0';i++,n+=2)

{

if(c[i]!='.')

{

m=c[i]-48;

b[n]=zf[m*2];

b[n+1]=zf[m*2+1];

}

else

{

b[n]=zf[20];

b[n+1]=zf[21];

}

}

b[n]=zf[22];

b[n+1]=zf[23];

b[n+2]='\0';

strcpy(c,b);

}

void delay(int ms) //延时函数

{

while(ms--)

{

uchar i;

for(i=0;i<250;i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

bit lcd_busy() //检查LCD忙状态,lcd_busy为1时,忙,等待;lcd-busy为0时,闲,可写指令与数据。

{

bit result;

LCD_RS=0;

LCD_RW=1;

LCD_EN=1;

delayNOP();

result=(bit)(P0&0x80); //强制取最高位P0.7的状态

LCD_EN=0;

return(result);

}

void lcd_wcmd(uchar cmd) //写指令数据到LCD,RS=L,RW=L,E=高脉冲,D0-D7=指令码。

{

while(lcd_busy());

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

_nop_();

_nop_();

P0=cmd;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

}

void lcd_wdat(uchar dat) //写显示数据到LCD,RS=H,RW=L,E=高脉冲,D0-D7=数据。

{

while(lcd_busy());

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P0=dat;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

}

void lcd_pos(uchar X,uchar Y) //设定显示位置

{

ucharpos;

if (X==0)

{X=0x80;}

else if (X==1)

{X=0x90;}

else if (X==2)

{X=0x88;}

else if (X==3)

{X=0x98;}

pos=X+Y ;

lcd_wcmd(pos); //显示地址

}

void lcd_init() //LCD初始化设定

{

LCD_PSB=1; //并口方式

lcd_wcmd(0x30); //基本指令操作

delay(5);

lcd_wcmd(0x0C); //显示开,关光标

delay(5);

lcd_wcmd(0x01); //清除LCD的显示内容

delay(5);

}

uint TLC549_AD() //TLC549处理

{

uchar i;

uint data_ad=0;

CS=1; //初始化,启动

CLK=0;

DIO=1;

CS=0;

_nop_();

for(i=0;i<8;i++) //读取采集数据,读取的是上一次采集数据

{

CLK=1;

if(DIO)data_ad|=0x01;

CLK=0;

data_ad<<=1;

}

CS=1;

data_ad=data_ad*(500/256)+0.5; //0.5V进行四舍五入补偿

return(data_ad);

}

void main()

{

uchar i;

float AD_convert;

uchar AD1=35;

delay(10); //延时

lcd_init(); //初始化LCD

while(1)

{

AD_convert=TLC549_AD()/100.0;

sprintf(a, "%.2f", AD_convert); //将转换结果转换成字符

i=0;

lcd_pos(1,0);//设置显示位置为第一行的第1个字符

while(dis1[i] != '\0')

{ //显示“电压值:”

lcd_wdat(dis1[i]);

i++;

}

i=0;

lcd_pos(2,3);//设置显示位置为第二行的第3个字符

bitchange(a);

while(a[i] != '\0')

{ //显示采集的电压值

lcd_wdat(a[i]);

i++;

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。