坛里有玩单片机的吗,帮我看看这个程序的流程图
返回本版】  【发表帖子】  【回复帖子 浏览量  558      回帖数 1
devilywind    等级  

楼主 发表于  2011/12/19 4:35:06    编 辑   


#include <msp430.h>
char str[]="00.0";
long temp;
long IntDeg;
void ADC10_ISR(void);
void ADC10_init(void);
void Init_uart0(void);
void main()
{
WDTCTL=WDTPW+WDTHOLD;
ADC10_init();
 BCSCTL1 = CALBC1_1MHZ;
 DCOCTL = CALDCO_1MHZ;
Init_uart0();
_EINT();
 while(1)
 {
 ADC10CTL0 &#124;= ENC + ADC10SC; // Sampling and conversion start 采样开始,
// _bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled
 __delay_cycles(1000);
 //-----ADC转换完成中断唤醒CPU后才执行以下代码-----
temp = ADC10MEM;//读取AD采样值
IntDeg= temp*4225/1024 - 2777;//转换为摄氏度,并10倍处理
str[0]=IntDeg/100+0X30;
 str[1]=IntDeg%100/10+0X30;
 str[3]=IntDeg%100%10+0X30;
 // IntDeg=-123;//由于难以获得负温,直接给负值以测试LCD显示
}
}
/******************************************************************************************************
 * 名 称:ADC10_init(void)
 * 功 能:初始化ADC10采集内部温度传感器,单次手动采样
* 入口参数:无
* 出口参数:无
* 说 明:直接从CCS的Example中移植过来
* 范 例:无
******************************************************************************************************/
void ADC10_init(void)
{
ADC10CTL0 &= ~ENC; // 关闭AD转换器
ADC10CTL0 = ADC10IE + ADC10ON + REFON + ADC10SHT_3 + SREF_1;//1 允许ADC10中断 1 ADC10开启 ,打开基准源 64个ADC10CLK周期
ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_10;//单通道单次采样模式 ADC10OSC 8分频 ADC10SC位
__delay_cycles(30000);
 ADC10CTL0 &#124;= ENC; //开启AD转换器
}
/******************************************************************************************************
 * 名 称:ADC10_ISR_HOOK
 * 功 能:ADC转换完成后唤醒CPU
 * 入口参数:无
* 出口参数:无
* 说 明:直接从CCS的Example中移植过来
* 范 例:无
******************************************************************************************************/
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR_HOOK(void)
{
_bic_SR_register_on_exit(LPM4_bits);
}
/**********************************************************************************************************
 * 串口初始化
********************************************************************************************************* */
void Init_uart0()
{
 UCA0CTL1&#124;=UCSWRST;
 P1SEL&#124;=BIT1+BIT2; //将P1.1 P1.2设为第二功能
P1SEL2&#124;=BIT1+BIT2;//系统组合
P1DIR &#124;= BIT2; //P1.2 UART_TX
 P1DIR &=~BIT1; //P1.2 UART_RX
 UCA0CTL0&=~UC7BIT;//字符长度为8
 UCA0CTL1&#124;=UCSSEL_2;//选择系统时钟
UCA0BR0=0x68; //波特率为9600
 UCA0BR1=0;
 UCA0MCTL=0X40;//UCA0MCTL=UCBRS0;
 UCA0CTL1&=~UCSWRST;
 IE2&#124;=UCA0RXIE;//开接收使能
}
void Uart0Sends(char *s)
{
 while(*s!=''\0'') //查找字符。
{
UCA0TXBUF=*s;
 while((IFG2&UCA0TXIFG)==0); //查询发送是否结束,寄存器为空置位,满为复位??
IFG2&=~UCA0TXIFG; //清除发送一标志位,多余的语句,发送完毕
s++;
 }
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void usart0_rx(void)
{
 while((IFG2&UCA0RXIFG )==0);//接收一位然后给发送缓存器 再中断再接受 再发送的过程
IFG2&=~UCA0RXIFG ;
 Uart0Sends("班级 姓名 学号 ");
Uart0Sends(str);
 UCA0TXBUF = UCA0RXBUF;
 }



Syd    等级  

2 楼 发表于  2011/12/19 7:22:06    编 辑   


430是个好芯片


1
表情
所有内容均为会员自愿发表,并不代表本站立场.

您输入的密码有误,请重新输入