单片机代码-ad转换电压在1602中显示

上传人:mg****85 文档编号:34048771 上传时间:2018-02-20 格式:DOCX 页数:6 大小:18.47KB
返回 下载 相关 举报
单片机代码-ad转换电压在1602中显示_第1页
第1页 / 共6页
单片机代码-ad转换电压在1602中显示_第2页
第2页 / 共6页
单片机代码-ad转换电压在1602中显示_第3页
第3页 / 共6页
单片机代码-ad转换电压在1602中显示_第4页
第4页 / 共6页
单片机代码-ad转换电压在1602中显示_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《单片机代码-ad转换电压在1602中显示》由会员分享,可在线阅读,更多相关《单片机代码-ad转换电压在1602中显示(6页珍藏版)》请在金锄头文库上搜索。

1、#include#include /为了使用这个头文件中的_nop_()延时函数sbit sda=P20;/SDA 线sbit scl=P21; /SCL 线sbit rst=P24; /关掉时钟芯片输出 sbit hc573_sg_le=P26; /对用于锁存段数据的 573 锁存 LE 端进行定义sbit hc573_bit_le=P27; /对用于锁存位选通数据的 573 锁存 LE 端进行定义sbit lcd_rs=P10; /1602 数据/ 命令选择端,高电平执行数据操作,低电平执行命令操作sbit lcd_rw=P11; /1602 读/ 写控制端 高电平读,低电平写sbit l

2、cd_en=P25; /1602 读写控制使能信号,它为高脉冲信号才可执行读写操作sbit sta7=P07; /1602 忙信号检测位,为 1 则忙,需等待,为 0 表示空闲void delay_ms(unsigned int t) /tms 的延时函数unsigned int a,b;for(a=0;a4.7us)sda=0; /SDA 线拉低,产生开始信号_nop5_();/SDA 线低电平持续 5us, 以符合开始信号定义的要求(4us)void iic_stop() /主机发送停止信号的函数scl=0; /SCL 线拉低,以便让 SDA 线准备变化sda=0; /SDA 线拉低,准备

3、产生停止信号scl=1; /SCL 线拉高_nop5_(); /SDA 线低电平持续 5us,以符合停止信号定义的要求(4us)sda=1; /SDA 线拉高,产生停止信号_nop5_(); /SDA 线的高电平持续 5us, 以符合停止信号定义的要求(4.7us)void iic_ack() /检测从机应答信号的函数unsigned char i;i=255;scl=0; /SCL 线拉低,以便让 SDA 线准备变化sda=1; /SDA 线拉高,准备检测从机的应答信号while(sda=1) /当 SDA 为高电平时,则等待从机的应答将 SDA 拉低if(i0)i-;else return

4、; /如果 i 自减到 0 了,从机还没响应,则不再等待,返回 /这种情况极少发生,一般是从机器件出问题了才会发生scl=1; /从机已经应答,将 SDA 线拉低了_nop5_(); /SDA 线的低电平持续 5us,以符合应答信号定义的要求(4us)scl=0; /SCL 线拉低,以便让从机把 SDA 线释放void send_ack() /主机给从机发送应答信号scl=0; /SCL 线拉低,以便让 SDA 线准备变化sda=0; /SDA 线拉低,即将发送应答信号给从机scl=1; /SCL 线拉高,将应答信号发送过去_nop5_(); /SDA 线的低电平持续 5us,以符合应答信号定

5、义的要求(4us)scl=0; /SCL 线拉低,以便让 SDA 线准备变化sda=1; /释放 SDA 线void iic_send_no_ack() /主机给从机发送非应答信号scl=0; /SCL 线拉低,以便让 SDA 线准备变化sda=1; /SDA 线拉高,即将发送非应答信号给从机scl=1; /SCL 线拉高,将应答信号发送过去_nop5_(); /SDA 线的高电平持续 5us,以符合非应答信号定义的要求(4us)void iic_write(unsigned char dat) /主机向从机写操作函数unsigned char i;for(i=0;i8;i+)scl=0; /

6、SCL 线拉低,以便让 SDA 线准备变化sda=(bit)(0x80 /取字节数据的最高位,发送到 SDA 线dat=dat1; /发送的数据都是由高位到低位顺序发送的,所以要将所/需发送的那位移到数据的最高位,以发送到 SDA 线上scl=1; /SCL 线拉高,数据被发送过去unsigned char iic_read() /主机向从机读操作的函数 unsigned char i;unsigned char dat; /定义一个字节变量,用来存储读出的从机数据dat=0; for(i=0;i8;i+)dat=dat1; /将位数据不断地往高位移动,将接收到的位数据转换为字节数据scl=0

7、; /SCL 线拉低,以便让 SDA 线准备变化dat=dat|(unsigned char)sda; /将接收到的位数据强制转换成字节数据,并存到dat 中scl=1; /SCL 线拉高,接收下一位数据return dat; /数据接收完毕,带数据返回void lcd_busy_check(void) /1602 忙信号检测,忙则等待P0=0xff;dolcd_rs=0; /读状态操作,为 0lcd_rw=1; /读操作为 1lcd_en=0;lcd_en=1; /读状态,需为高电平while (sta7=1); /如果为 1 则忙,等待.直到为 0lcd_en=0;void lcd_wri

8、te_cmd(unsigned char cmd) /液晶写命令函数lcd_busy_check(); /每次操作之前都要进行忙信号检测lcd_rs=0; /执行命令操作,为 0lcd_rw=0; /写操作,为 0P0=cmd; /送指令到液晶数据端口 P0,准备执行命令_nop_(); /这是一个延时函数,可延时一个机器周期,它在“intrins.h ”中lcd_en=1; /高电平,指令送入液晶控制器_nop_(); /保持一会儿,使指令可靠地送入液晶控制器lcd_en=0; /低电平,执行命令void lcd_write_data(unsigned char dat) /液晶写数据函数l

9、cd_busy_check(); /每次操作之前都要进行忙信号检测lcd_rs=1; /执行数据操作,为 1lcd_rw=0; /写操作,为 0P0=dat; /送数据到液晶数据端口 P0,准备执行数据操作_nop_();lcd_en=1; /高电平,数据送入液晶液晶数据 RAM_nop_(); /保持一会儿,使显示数据可靠地送入液晶数据 RAMlcd_en=0; /低电平,显示数据void lcd1602_init() /液晶显示初始化操作P0=0x00;hc573_sg_le=0; /关闭 HC573 使数码管不显示hc573_bit_le=0;lcd_en=0; /为 0,为实现高脉冲作

10、准备lcd_write_cmd(0x38); /设置为 5x7 显示lcd_write_cmd(0x0c); / 打开显示- 显示光标-光标闪烁lcd_write_cmd(0x6); /地址加一,光标右移,整屏显示不移动 lcd_write_cmd(0x01); /清屏/*-这个函数的作用是:将读到的 8591 中的数据换算为电压值的个位值,-并转换为对应的 ASCII 码,用以在液晶中显示 */unsigned char data1_convert(unsigned char dat_temp) unsigned char data1;data1=(unsigned char)(float)

11、dat_temp/255)*5); /换算为电压值的个位值data1=data1+48; /转换为对应的 ASCII 码 ,因为 0 对应 ASCII 码的 48,以此类推return data1;/*-这个函数的作用是:将读到的 8591 中的数据换算为电压值的小数点后第一位的值,-并转换为对应的 ASCII 码,用以以在液晶中显示 */unsigned char data0_convert(unsigned char dat_temp)unsigned char data0,data1;data1=(unsigned char)(float)dat_temp/255)*5); /换算为电压

12、值的个位值data0=(unsigned char)(float)dat_temp/255)*5-data1)*10);/换算为为电压值的小-/-数点后第一位的那个值data0=data0+48; return data0; /转换为对应的 ASCII 码void main()unsigned char dat; /用于接收从 8591 中读到的数据lcd1602_init();rst=0; /关闭 DS1302 时钟芯片,避免引起干扰hc573_sg_le=0;hc573_bit_le=0;lcd_write_cmd(0x80);lcd_write_data(C);lcd_write_dat

13、a(H);lcd_write_data(1);lcd_write_data(:);lcd_write_cmd(0x85);lcd_write_data(.);lcd_write_cmd(0x87);lcd_write_data(V); /上面的这些都是为了在 1602 中显示CH1: : Vwhile(1)iic_start();iic_write(0x90); /对 8591 进行写操作iic_ack();iic_write(0x01); /设置为 4 路独立信号输入,并关闭通道自动加 1,只用通道 1iic_ack();iic_start(); /重新开始,为读数据作准备iic_ack();iic_write(0x91); /对 8591 进行读操作iic_ack();dat=iic_read(); /这还只是一个 8 位的数据(需进一步转换为实际电压值)iic_send_no_ack();iic_stop();lcd_write_cmd(0x84); /将要显示的字符显示在此地址处lcd_write_data(data1_convert(dat); /显示电压的整数部分lcd_write_cmd(0x86); /将要显示的字符显示在此地址处lcd_write_data(data0_convert(dat); /显示电压的小数部分

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号