kissmey
获得 0 次赞
帮助过0人
采用c8051f040进行串口通讯,通过max3072,现在的问题是能够接收,但发送就死在while(TI0==0)这句了。 麻烦大家帮忙找下原因。 应该是个简单的程序,怎么就总是死在while了? #include "c8051F040.h" #define uchar unsigned char #define uint unsigned int void port_init(); void os_init(); void uart_init(); void time_init(); uchar g; uchar flag = 0;//接收数据标志 sbit RD0 = P7^7;//使能 void main() { WDTCN = 0xDE; // 关闭看门狗 地址是OxFF WDTCN = 0xAD; //防止意外产生的禁止操作 os_init(); //系统时钟初始化 port_init(); //端口初始化 time_init(); uart_init(); SFRPAGE = CONFIG_PAGE; //0x0F EA = 1; //开总中断,开串行中断 ES0 = 1; while(1) { if(flag==1) { RD0 = 1; TI0= 0; SBUF0=g; while(TI0==0); TI0= 0; flag=-0; } } } void port_init() { SFRPAGE = CONFIG_PAGE; XBR0 = 0x04; XBR1 = 0x00; XBR2 = 0x44; P0MDOUT = 0x01;//TX0-high,TX0-p0.0 P7MDOUT = 0xFF; RD0 = 0; } void os_init() { unsigned short i = 0; SFRPAGE = CONFIG_PAGE; //me Ox84=0x0F代表读或修改的时候所使用的SFR页 OSCXCN = 0x77; //即01110111,0:晶体振荡器未稳定;111:晶体振荡器二分频方式 //0:读;111:10Mhz~30Mh, 外部22.1184M晶振,系统时钟不分频 for (i = 0; i < 3000; i++); //等待外部晶振稳定,等待至少1ms while ((OSCXCN & 0x80) == 0); //第7位代表内部振荡器使能 CLKSEL = 0x01; //源自外部震荡器 } void time_init() { SFRPAGE = TIMER01_PAGE;//0x00 TMOD = 0x20; //TIMER1 MODE2 CKCON = 0X01; //时钟控制寄存器0x8E,[NET]//ckcon^01=0x01,sysclk*1/4; ckcon^01=0x00,sysclk*1/12; // ckcon^01=0x02,sysclk*1/48; //ckcon^01=0x03,extra clk *1/8;ckcon=0x08,sysclk,(这个未证实); TH1 = 0xEE; //见[c8051f040 datasheet]p259 T0方式2原理 //图,SMOD0=1,方式1波特率为:1/16*T1CLK/(256-TH1) TR1 = 1; //启动TIMER1 } void uart_init() { SFRPAGE = UART0_PAGE; //0x01, SSTA0 = 0x10; //Timer1溢出产生uart0波特率,SMOD=1 SCON0 = 0x50; //允许uart0,8位UART } void UART0_Interrupt (void) interrupt 4 //串口0接收 { if (RI0==1){ RI0 = 0; // Clear interrupt flag g = SBUF0; // Read a character from UART flag = 1; } }
输入电压vin与参考电压相比,运放应该是一个比较器,绝大多数情况下输入电压都比参考电压低,因此运放 输出为负。最终的输出vout需要稳定在一个值,它和输入电压的关系是vout升高,vin升高。vout降,vin降。通过调节Vref也可以调节vout. 问题是这个正反馈电路是什么作用?三极管是否长期工作在截止状态下? 整个电路是如何实现通过比较来控制vout的呢?