📄 5382.c
字号:
#include <avr/io.h>
#include <OwnTwi.h>
#define fosc 4000000 //晶振4HZ
#define baud 9600 //波特率
uchar i;
void Wait(void)
{
unsigned int us;
for(us=0;us<2;us++);
}
/* 微秒级延时程序 */
void delay_us(int time)
{
do
{
time--;
}
while (time>1);
}
/* 毫秒级延时程序 */
void delay_ms(unsigned int time)
{
while(time!=0)
{
delay_us(30);
time--;
}
}
uchar Device_Write(uchar slv_addw,uchar Wdata)
{
delay_ms(10);
Start();//I2C启动
Wait();
if(TestAck()!=START) return 1;//ACK
Write8Bit(slv_addw);//写I2C从器件地址和写方式
Wait();
if(TestAck()!=MT_SLA_ACK) return 1;//ACK
Write8Bit(Wdata);//写DATA
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK
delay_ms(10);//延时等Device 写完
return 0;
}
uchar TMP100_Write(uchar slv_addw,uchar sub_suba,uchar Wdata)
{
delay_ms(10);
Start();//I2C启动
Wait();
if(TestAck()!=START) return 1;//ACK
Write8Bit(slv_addw);//写I2C从器件地址和写方式
Wait();
if(TestAck()!=MT_SLA_ACK) return 1;//ACK
Write8Bit(sub_suba);//写地址
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK
Write8Bit(Wdata);//写DATA
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK
delay_ms(10);//延时等Device 写完
return 0;
}
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0xff; //输出口
PORTC = 0xFF; //m103 output only
DDRC = 0xFF; //输出口
PORTD = 0xF;
DDRD = 0xF0;//输出口
}
//init TWI:
void init_twi(void)
{
//DDRC = 0x0; //输出口
//PORTC = 0xFF; //m103 output only
TWCR=0x0; //disable twi
TWBR=52; //TWBR=((F_CPU/(fSCL*(4^TWPS))-16)/2 = (12000000/100000-16)/2=52
TWSR=00; //预分频澹:即4^TWPS=1
TWAR=0; //set slave address
TWCR=0x04;//enable twi
}
//字符输入函数
unsigned char getchar(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}
//字符输出函数
void putchar(unsigned char c)
{
while (!(UCSRA&(1<<UDRE)));
UDR=c;
}
//不含回车换行的字符串输出函数
void putstr(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
}
//字符串输出函数
int puts(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
putchar(0x0a);//回车换行
putchar(0x0d);
return 1;
}
//UART初始化
void uart_init(void)
{
UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;//设置波特率寄存器,以获得波特率为9600
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位(无校验)
}
void delay(unsigned char n)
{
static unsigned int j;
for(i=0;i<n;i++)
for(j=0;j<10000;j++);
}
void DecodeBCD(unsigned int temp)
{
unsigned char num_bit[3];
for(i=0;i<3;i++)
{
num_bit[2-i]=temp%10;
temp=temp/10;
}
/**********将转换结果发送到串行口***********/
putchar(48+num_bit[0]);
putchar(48+num_bit[1]);
putchar(48+num_bit[2]);
}
void Display_Voltage(uchar data)
{
float voltage;
uchar int_digit;
voltage=(0.9*3.3*data)/255;
int_digit=(uchar)voltage;
voltage-=int_digit;
//
DecodeBCD(int_digit);
putchar('.');
DecodeBCD(voltage*1000);
}
// RS232通信及显示结果main函数 //
int main(void)
{
uchar BufferArry[2];
uint temperature;
uchar DAC_Result;
port_init();
uart_init();
init_twi();
DAC_Result=0x0;
puts("Pls Input char 'a' to Add digit to Convert:");
//putchar(0x0d); putchar(0x0a);//回车换行
while(1)
{
if(getchar()=='a'){
putchar(0x0d); putchar(0x0a);//回车换行
DAC_Result+=10;
if(DAC_Result>255) DAC_Result=0;
puts("The Digit to Convert Is:"); DecodeBCD(DAC_Result);
putchar(0x0d); putchar(0x0a);//回车换行
ACK_flagr=Device_Write(DEVICE_ADD_WRITE,DAC_Result);//
puts("Convertion Result Is:"); Display_Voltage(DAC_Result);
putchar(0x0d); putchar(0x0a);//回车换行
puts("You Can check Right or Error!");
putchar(0x0d); putchar(0x0a);//回车换行
}
else{
putchar(0x0d); putchar(0x0a);//回车换行
ACK_flagr=Device_Write(DEVICE_ADD_WRITE,DAC_Result);//
putchar(0x0d); putchar(0x0a);//回车换行
puts("The Digit to Convert Is:"); DecodeBCD(DAC_Result);
putchar(0x0d); putchar(0x0a);//回车换行
puts("Convertion Result Is:"); Display_Voltage(DAC_Result);
putchar(0x0d); putchar(0x0a);//回车换行
puts("You Can check Right or Error!");
putchar(0x0d); putchar(0x0a);//回车换行
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -