?? 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 + -