LM75A.rar

  • PUDN用户
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 3
    下载次数
  • 2015-08-31 23:53
    上传日期
AVR与LM75A通过IIC通信,使用LCD12864显示温度
LM75A.rar
  • LM75A.txt
    6.9KB
内容介绍
//----------------------LM75.c------------------------------------ #include<avr/io.h rel='nofollow' onclick='return false;'> #include<util/delay.h> #include<util/twi.h> #include <string.h> #include"LM75.h" #include "lcd12864.h" //TWI通用操作 #define Wait() while(!(TWCR & _BV(TWINT)))//等待TWINT置位(START已发出), #define START() {TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);Wait();}//发出START #define STOP() {TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);}//发送STOP #define WriteByte(x) {TWDR =(x);TWCR = _BV(TWINT) | _BV(TWEN);Wait();}//装入数据到TWDR,TWINT清零启动发送数据 #define ACK() (TWCR |= _BV(TWEA))//使能TWI应答 #define NACK() (TWCR &= ~_BV(TWEA))//关闭TWI应答,脱离总线 #define TWI() {TWCR = _BV(TWINT) | _BV(TWEN) ;Wait();}//开启TWI #define TWI1() {TWCR = _BV(TWINT) | _BV(TWEN) ;TWCR |= _BV(TWEA);_delay_us(1);Wait();}//TWI应答 #define TWI2() {TWCR = _BV(TWINT) | _BV(TWEN) ;TWCR &= ~_BV(TWEA);_delay_us(1);Wait();}//TWI离线 void IIC_init(void) { TWBR=1;//LM75低于100khz TWSR |=_BV(TWPS0);// TWCR |= _BV(TWEA)|_BV(TWEN);//使能TWI TWAR=0;//主机读数据(SDA/PC1) } unsigned char LM75_read(short *temp) { unsigned short Th=0,Tl=0;//高低位 START(); //I2C起始信号 SLA+W,主机发送模式 if(TW_STATUS !=TW_START) return 1;//0x08 START已发送 WriteByte(0x92);//发送从机地址,找到从机,写模式 if(TW_STATUS !=TW_MT_SLA_ACK) return 2;//0x18 主机发送模式下接收从机的地址应答ACK信息 WriteByte(0x00);//发送从机寄存器地址,找到从机寄存器 if(TW_STATUS !=TW_MT_DATA_ACK) return 3;//0x28 主机发送模式下接收从机的数据应答ACK信息 START(); if(TW_STATUS !=TW_REP_START) return 4;//0x10,主机重复发送START, WriteByte(0x93);//从从机寄存器0开始读取数据 if(TW_STATUS !=TW_MR_SLA_ACK) return 5;//0X40,主机接收模式下接收到ACK TWI(); Th=TWDR; //主机数据寄存器读取温度高位 TWI(); Tl=TWDR; STOP(); //---------------数据转换--------------- Th<<=3; Tl>>=5; //Put_Char(Th); //Put_Char(Tl); double num; num=(Th+Tl)*0.125; // Put_Char(num); // write_lcd12864_commond(0x01);//lcd清屏 lcd12864_putstring(3,0,"温度:"); lcd12864_putchar(3,3, Th/80+0x30,Th/8%10+0x30);//转ASIC码 lcd12864_putchar(3,4, 0x2e,Tl*10/8+0x30);//十分位 lcd12864_putchar(3,5, (Tl*10%8)*10/8+0x30,((Tl*10%8)*10%8)*10/8+0x30);//百分、千分位 lcd12864_putchar(3,6, 0x60,0x43);//oC // _delay_ms(500); return 0; } //---------------------main.c----------------------------------- #include <avr/io.h rel='nofollow' onclick='return false;'> #include <util/delay.h> #include "lcd12864.h" #include "UART.h" #include "LM75.h" int main() { unsigned short temp=0; DDRA=0XFF;PORTA=0XFF; SREG|=0X80; IIC_init(); init_lcd12864(); Uart_Init(); while(1) { LM75_read(&temp);//num _delay_ms(500); } return 0; } //-----------------LCD12864.c-------------------------- #include <avr/io.h rel='nofollow' onclick='return false;'> #include <util/delay.h> #include "lcd12864.h" #define SET_LCD12864_EN() PORTC |= _BV(PC5)//1 #define CLR_LCD12864_EN() PORTC &= ~_BV(PC5)//0 #define SET_LCD12864_RW() PORTC |= _BV(PC6) #define CLR_LCD12864_RW() PORTC &= ~_BV(PC6) #define SET_LCD12864_RS() PORTC |= _BV(PC7) #define CLR_LCD12864_RS() PORTC &= ~_BV(PC7) static void LCD12864_wait(void); //static void write_lcd12864_commond(unsigned char); static void write_lcd12864_data(unsigned char ); void LCD12864_wait(void) { CLR_LCD12864_RS();//命令 SET_LCD12864_RW();//读 _delay_us(100); SET_LCD12864_EN();//开 _delay_us(100); DDRA &= ~_BV(PA7);//BF清零 while(PINA & _BV(PA7)); //当DB7位BF为1时表示忙,循环检测 DDRA = 0xff; CLR_LCD12864_EN();//关 } void write_lcd12864_commond(unsigned char cmd) { // LCD12864_wait(); DDRC |= _BV(PC5) | _BV(PC6) | _BV(PC7);//数据,读,开 DDRA = 0xff; CLR_LCD12864_RS();//命令 CLR_LCD12864_RW();//写 SET_LCD12864_EN();//开 _delay_us(100); PORTA = cmd;//传送命令 _delay_ms(10); CLR_LCD12864_EN();//关 } void write_lcd12864_data(unsigned char dat) { LCD12864_wait(); DDRC |= _BV(PC5) | _BV(PC6) | _BV(PC7);//数据,读,开 DDRA = 0xff; SET_LCD12864_RS();//数据 CLR_LCD12864_RW();//写 SET_LCD12864_EN();//开 asm("nop"); PORTA = dat;//传送数据 _delay_ms(10); //注意此处的延时1 CLR_LCD12864_EN(); //关 } void lcd12864_putchar(unsigned char x,unsigned char y,unsigned char c1,unsigned char c2) { x &= 0x03; y &=0x07; switch(x) { case 0: y += 0x80; //第0行显示 break; case 1: y += 0x90; //第1行显示 break; case 2: y += 0x88; //第2行显示 break; case 3: y += 0x98; //第3行显示 break; } write_lcd12864_commond(y); write_lcd12864_data(c1); write_lcd12864_data(c2); } void lcd12864_putstring(unsigned char x,unsigned char y,unsigned char *str) { x &= 0x03; y &=0x07; switch(x) { case 0: y += 0x80; //第0行显示 break; case 1: y += 0x90; //第1行显示 break; case 2: y += 0x88; //第2行显示 break; case 3: y += 0x98; //第3行显示 break; } write_lcd12864_commond(y); while (*str) {write_lcd12864_data(*str++);} } void clear_lcd12864(unsigned char x,unsigned char y)//删除行 { x &= 0x03; y &=0x07; switch(x) { case 0: lcd12864_putstring(0,0," "); //第0行显示 break; case 1: lcd12864_putstring(1,0," "); //第1行显示 break; case 2: lcd12864_putstring(2,0," "); //第2行显示 break; case 3: lcd12864_putstring(3,0," "); //第3行显示 break; } } void clear_lcd_point(unsigned char x,unsigned char y)//删除点 { x &= 0x03; y &=0x07; switch(x) { case 0: lcd12864_putstring(0,y," "); //第0行显示 break; case 1: lcd12864_putstring(1,y," "); //第1行显示 break; case 2: lcd12864_putstring(2,y," "); //第2行显示 break; case 3: lcd12864_putstring(3,y," "); //第3行显示 break; } } void init_lcd12864(void) { write_lcd12864_commond(0x30); //8位数据模式 _delay_us(5); write_lcd12864_commond(0x0c); //整体显示、游标关、不反白 _delay_us(5); write_lcd12864_commond(0x01); //清屏 _delay_ms(5); write_lcd12864_commond(0x02); //地址归位 write_lcd12864_commond(0x06); //点设置 _delay_ms(5); write_lcd12864_commond(0x80); //写入第一行 } //--------------lcd12864.h-------------------------------- #ifndef __lcd12864_H__ #define __lcd12864_H__ void init_lcd12864(void); void lcd12864_putchar(unsigned char x,unsigned char y,unsigned char c1,unsigned char c2); //void lcd12864_putchar1(unsigned char x,unsigned char y,unsigned char c); void lcd12864_putstring(unsigned char x,unsigned char y,unsigned char *str); void clear_lcd12864(unsigned char x,unsigned char y); void clear_lcd_point(unsigned char x,unsigned char y); void write_lcd12864_commond(unsigned char cmd); void usart_init(void); unsigned char usart_receive(void); void usart_transmit(unsigned char c); #endif //------------------------LM75.h------------------------------ #ifndef __LM75_H__ #define __LM75_H__ unsigned char LM75_read(short *temp); void IIC_init(void); #endif
评论
    相关推荐
    • lm75a.rar
      LM75A数字接口温度传感器,使用 IIC接口的驱动 程序。结果通过串口回传显示。使用 M16CPU,硬件IIC
    • Proteus7.12.rar
      Proteus7.12完美破解版.rar电路仿真软件很好用可以仿真单片数字模拟电路
    • VHDL 的实例程序,共44个.rar
      经典VHDL 的实例程序,共44个!要下载的尽快
    • USBtoRS232Driver.rar
      USB转串口驱动程序,可以用在笔记本电脑上,方便的通过串口给单片机下载程序!
    • 模糊控制程序.rar
      模糊PID控制程序的源码,是作业,有讲解,
    • 串口编程源代码.rar
      这是本人最近几年所编写的串行通讯的代码集,可以供大家参考学习。
    • DELTA_PLC.rar
      台达PLC Modbus协议通信dll com控件
    • hongwaigooog.rar
      单片机红外遥控最全的资料,包含很多当前电视遥控专用芯片的解码方式,C语言和汇编语言编写的解码范例程序,看完了你就会了!
    • MF500绝密.rar
      非接触式IC卡开发板源程序,包括原理图/PCB图;源程序在KEIL环境下编译,打开压缩包后直接点击PRJ文件,即可编译使用。 这是个保密文件,做Mifare one卡开发人基本上都用过到这个源代码。
    • 20078251299410.rar
      C51实用程序(45个) I/O、定时器、中断、看门狗、计数器、软件AD、VB串口、93c06驱动、24c02系列驱动、7219、20045、软件陷阱、串口中断、码值转换、AVR通讯、IIC、DS1302、DS1820、SPI、1602、12232、12864、T6963、1330、PC键、键盘输入法、智能化、飞机游戏、贪吃蛇、多级菜单实例等