#TI校园故事# 众里寻他千百度

[复制链接]
3132|5
 楼主| zoujiachi 发表于 2012-10-30 10:42 | 显示全部楼层 |阅读模式
大一的我,迷茫,堕落,每天的生活就是打游戏,睡觉,吃饭肚子饿的不行了才会去吃,每次拖着疲惫的身子从网吧走出来,看着外面这个陌生而又熟悉的世界,我不停的问自己,以前那个学习成绩优异,争强好胜的我去了哪里?为什么我会变成现在这样,没有目标,没有理想,每天除了用游戏来麻痹自己,似乎没有其他的办法,于是,我只能一直这样堕落下去。
直到大二的某一天,我看见了隔壁寝室有一个人在玩弄一个长得很奇怪的东西,像电路板,但又和我以前印象中的很不一样,上面还有什么灯在闪啊闪的。后来我才知道,原来那就是单片机。
也就是从那天开始,不知道从哪里来的力量,促使我有一种想要去了解,去学习的渴望,这种感觉甚至超过了我想要玩游戏的冲动。在同学的介绍下,我买了款51单片机的学习板,利用寒假的时间,每天在家看视频,然后自己动手完成一个一个的小例程,还记得当我点亮第一个流水灯的时候,那种兴奋的心情,我一下就明白了,原来这就是我一直在找的感觉。
从那之后,我不再迷茫了,我已经清楚的知道我自己想要什么。于是我开始努力学习,利用课余的时间学习单片机的相关知识,成绩从刚刚转来新专业的第80名,到现在的年纪第5,这之间的辛酸和一个个寂寞的夜晚,也许只有我自己才知道。
从那之后,凡是有关电子的相关竞赛我都积极参加,从国防科大举办的电子设计大赛,到后来的TI杯电子设计大赛。
也就是这个暑假,让我第一次了解了TI,虽然之前用过很多的芯片都是TI的,但是对TI从来也没有一个比较全面的了解,包括他的企业文化,MCU的种类以及其他一些模拟器件等等。
当我拿到Launchpad的板子时,我那个爱不释手,感觉她实在是太美了,这是一种艺术,是科技所带来的无穷魅力。于是整个暑假,我和同学都泡在学校的实验室里。
记得刚开始的时候,看着长达700多页的全英文版的User’s Guide头脑发晕,完全没有看下去的冲动,然后上网找视频,找教程,可是看了一些视频后,发现自己还是什么都不懂,然后又很失望,最后终于下定决心,就算再难,就算是一个一个单词的查,我也要要把User’s Guide研究透彻。现在想来,当初那个决定是多么的明智。
其实很多事情,当你跨出了第一步,你就成功了一半。
从刚开始连BIT0都不知道是什么意思,然后去头文件里使劲的找,自己的想,到后来了解了寄存器的基本操作方法,然后一步一步的,理解越来越深,对User’s Guide的大体框架也越来越熟悉,于是我开始慢慢有了感觉,这种感觉是很奇妙的,你感觉自己一下子成为了巨人,呵呵。
经历了刚开始的痛苦与挣扎后,后面的就是康庄大道了,我逐个逐个模块的学习,从模块的原理图,基本功能,到寄存器映射地址,位操作,一步一步的学习,然后再在Launchpad上实战演练一下,当你自己操作成功了一个模块后,OK,这个模块你就掌握了,这才发现原来学习单片机是件这么简单的事。
在掌握了Msp430的基本操作后,老师给我们布置了一些题目,什么可控波形发生器,数字滤波器,温度自动控制,可调增益放大器等,在实践中,让我对单片机以及一些模拟器件的选型和参数上有了很大的收获,在此也要感谢TI为广大的电子爱好者们提供免费的芯片样品,并且发货速度也很快,我和同学经常在实验室里开玩笑说,“TI就是有战略眼光,把握住了我们这一代,也就是把握住了未来市场!”
现在,我一直在朝着我梦想的方向前进,我现在正在学习ARM11,Corten-M3,M4等这些嵌入式的微处理器,学得越多,才发现自己还远远的不够,但是我现在很充实,不再像以前那样每天打游戏,那样迷茫,而是每天不断的学习,不断的参加各种大赛来提高自己。
我现在更加坚定了我的人生目标,那就是成为一名卓越的电子工程师,成为像乔布斯一样,用科技改变世界的人,并一直朝着那个方向大步前行。
我要感谢TI,你就像是我的领路人,带我一路欣赏电子世界沿途灿烂的风景,最后带我找到了我人生的理想彼岸。此刻我想到一句话,“梦里寻他千百度,蓦然回首,那人却在灯火阑珊处。”这句话送给我的引路人TI公司,送给我那一直埋藏在角落,却最终让我收获的理想!

By:中南大学电子信息1003
邹佳池
2012.10.30
 楼主| zoujiachi 发表于 2012-10-30 10:52 | 显示全部楼层

  1. /***************************************************
  2. 最后再附上一个最近做的数控直流电源的源代码,希望大家能一起互相学习:)
  3. ***************************************************/

  4. #include <msp430g2452.h>
  5. /********************************************
  6.   * TLC5615:
  7.    DIN:P1.1   SCLK:P1.2  CS:P1.0
  8.    74LS48
  9.    A:P1.4  B:P1.5  C:P1.6  D:P1.7
  10.    74LS138
  11.    A:P2.0  B:P2.1  C:P2.6
  12.      按键:
  13.    key1:P2.2  key2:P2.3 key3:P2.4 key4:P2.5
  14. *********************************************/

  15. int b[4];
  16. int *pb = &b[0];
  17. int dat = 0;
  18. int time = 0;
  19. int Buff = 0;

  20. //DIN:P1.1        SCLK:P1.2        CS:P1.0
  21. #define DIN_SET                BIT1
  22. #define DIN_CLC           ~BIT1
  23. #define SCLK_SET        BIT2
  24. #define SCLK_CLC   ~BIT2
  25. #define CS_SET            BIT0
  26. #define CS_CLC           ~BIT0

  27. void delay_ms(int tt)
  28. {
  29.         for(tt*=500;tt>0;tt--)
  30.         {
  31.                 _nop();
  32.         }
  33. }

  34. /*******************************
  35.   *                函数名:Clock_Init
  36.   *                功能:初始化时钟
  37.   *                参数:无
  38.   ******************************/
  39. void Clock_Init(void)
  40. {
  41.         DCOCTL |= CALDCO_1MHZ;
  42.         BCSCTL1 |= CALBC1_1MHZ;                //初始化DCO时钟频率为 1MHz
  43. }

  44. /*******************************
  45.   *                函数名:IO_Init
  46.   *                功能:初始化IO口
  47.   *                参数:无
  48.   ******************************/
  49. void IO_Init(void)
  50. {
  51.         P1DIR |= 0xFFF7;        //P1口所有管脚设为输出模式(除了P1.3,因为P1.3外接了上拉电阻作为S2)
  52.         P1OUT &= 0x0000;        //复位IO端口
  53.         P2SEL &= ~BIT6;                //将P2.6设置为通用IO输入
  54.         P2DIR |= BIT0 + BIT1 +BIT6;                //P2口 0,1,6设为输出模式
  55.         P2OUT &= 0x0000;        //复位IO端口
  56.         P2DIR &= 0x00C3;        //P2口2,3,4,5设置为输入模式
  57.         P2REN |= BIT2 + BIT3 + BIT4 + BIT5;        //设置为上拉输入模式
  58.         P2OUT |= BIT2 + BIT3 + BIT4 + BIT5;
  59. }

  60. /*******************************
  61.   *                函数名:Key_Scan
  62.   *                功能:按键扫描
  63.   *                参数:无
  64.   *                返回值:z
  65.   *                z=1:P2.2被按下  “+”
  66.   *                z=2:P2.3被按下  “-”
  67.   *                z=3:P2.4被按下   “操作位选择”
  68.   *                z=4:P2.5被按下   “确认”
  69.   ******************************/
  70. int Key_Scan(void)
  71. {
  72.         int z = 0;
  73.         if(!(P2IN&BIT2))        //P2.2被按下
  74.         {
  75.                 delay_ms(5);        //延时消抖
  76.                 if(!(P2IN&BIT2))//确实被按下
  77.                 {
  78.                         while(!(P2IN&BIT2));        //松手检测
  79.                         z = 1;
  80.                 }
  81.         }
  82.         if(!(P2IN&BIT3))        //P2.3被按下
  83.         {
  84.                 delay_ms(5);        //延时消抖
  85.                 if(!(P2IN&BIT3))//确实被按下
  86.                 {
  87.                         while(!(P2IN&BIT3));        //松手检测
  88.                         z = 2;
  89.                 }
  90.         }
  91.         if(!(P2IN&BIT4))        //P2.4被按下
  92.         {
  93.                 delay_ms(5);        //延时消抖
  94.                 if(!(P2IN&BIT4))//确实被按下
  95.                 {
  96.                         while(!(P2IN&BIT4));        //松手检测
  97.                         z = 3;
  98.                 }
  99.         }
  100.         if(!(P2IN&BIT5))        //P2.5被按下
  101.         {
  102.                 delay_ms(5);        //延时消抖
  103.                 if(!(P2IN&BIT5))//确实被按下
  104.                 {
  105.                         while(!(P2IN&BIT5));        //松手检测
  106.                         z = 4;
  107.                 }
  108.         }
  109.         return z;
  110. }

  111. /**********************************
  112.   *                函数名:Flicker
  113.   *                功能:当设置时闪烁选中位
  114.   *                参数:*pointer:指向所选中位
  115.   *                          array[]:数据参数
  116.   *                返回值:无
  117.   **********************************/
  118. //P2.6为C  闪烁控制位
  119. void Flicker(int *pointer,int array[])
  120. {
  121.         int i;
  122.         int tmp = 0;
  123.         for(i = 0;i<4;i++)
  124.         {
  125.                 if(pointer == &array[0])                //第一位闪烁
  126.                 {
  127.                         if(tmp == 0)
  128.                         {
  129.                                 if(time<15)
  130.                                 {
  131.                                         P2OUT |= BIT6;
  132.                                         time++;
  133.                                 }
  134.                                 else
  135.                                 {
  136.                                         if(time<30)
  137.                                         {
  138.                                                 P2OUT &= ~BIT6;
  139.                                                 time++;
  140.                                         }
  141.                                         else time = 0;
  142.                                 }
  143.                         }
  144.                         else
  145.                         {
  146.                                 P2OUT &= ~BIT6;                //若不是闪烁位  则拉低138 C 是数码管段选选通
  147.                         }
  148.                         if(tmp%2)                                //控制段选输出
  149.                         {
  150.                                 P2OUT |= BIT0;                //138 A
  151.                         }
  152.                         else
  153.                         {
  154.                                 P2OUT &= ~BIT0;
  155.                         }
  156.                         if(tmp/2)
  157.                         {
  158.                                 P2OUT |= BIT1;                //138 B
  159.                         }
  160.                         else
  161.                         {
  162.                                 P2OUT &= ~BIT1;
  163.                         }
  164.                         tmp++;
  165.                         if(tmp>3)tmp = 0;
  166.                 }

  167.                 else if(pointer == &array[1])
  168.                 {
  169.                         if(tmp == 1)
  170.                         {
  171.                                 if(time<15)
  172.                                 {
  173.                                         P2OUT |= BIT6;
  174.                                         time++;
  175.                                 }
  176.                                 else
  177.                                 {
  178.                                         if(time<30)
  179.                                         {
  180.                                                 P2OUT &= ~BIT6;
  181.                                                 time++;
  182.                                         }
  183.                                         else time = 0;
  184.                                 }
  185.                         }
  186.                         else
  187.                         {
  188.                                 P2OUT &= ~BIT6;
  189.                         }
  190.                         if(tmp%2)
  191.                         {
  192.                                 P2OUT |= BIT0;
  193.                         }
  194.                         else
  195.                         {
  196.                                 P2OUT &= ~BIT0;
  197.                         }
  198.                         if(tmp/2)
  199.                         {
  200.                                 P2OUT |= BIT1;
  201.                         }
  202.                         else
  203.                         {
  204.                                 P2OUT &= ~BIT1;
  205.                         }
  206.                         tmp++;
  207.                         if(tmp>3)tmp = 0;
  208.                 }

  209.                 else if(pointer == &array[2])
  210.                 {
  211.                         if(tmp == 2)
  212.                         {
  213.                                 if(time<15)
  214.                                 {
  215.                                         P2OUT |= BIT6;
  216.                                         time++;
  217.                                 }
  218.                                 else
  219.                                 {
  220.                                         if(time<30)
  221.                                         {
  222.                                                 P2OUT &= ~BIT6;
  223.                                                 time++;
  224.                                         }
  225.                                         else time = 0;
  226.                                 }
  227.                         }
  228.                         else
  229.                         {
  230.                                 P2OUT &= ~BIT6;
  231.                         }
  232.                         if(tmp%2)
  233.                         {
  234.                                 P2OUT |= BIT0;
  235.                         }
  236.                         else
  237.                         {
  238.                                 P2OUT &= ~BIT0;
  239.                         }
  240.                         if(tmp/2)
  241.                         {
  242.                                 P2OUT |= BIT1;
  243.                         }
  244.                         else
  245.                         {
  246.                                 P2OUT &= ~BIT1;
  247.                         }
  248.                         tmp++;
  249.                         if(tmp>3)tmp = 0;
  250.                 }

  251.                 else if(pointer == &array[3])
  252.                 {
  253.                         if(tmp == 3)
  254.                         {
  255.                                 if(time<15)
  256.                                 {
  257.                                         P2OUT |= BIT6;
  258.                                         time++;
  259.                                 }
  260.                                 else
  261.                                 {
  262.                                         if(time<30)
  263.                                         {
  264.                                                 P2OUT &= ~BIT6;
  265.                                                 time++;
  266.                                         }
  267.                                         else time = 0;
  268.                                 }
  269.                         }
  270.                         else
  271.                         {
  272.                                 P2OUT &= ~BIT6;
  273.                         }
  274.                         if(tmp%2)                                    //控制数码管段选,闪烁
  275.                         {
  276.                                 P2OUT |= BIT0;
  277.                         }
  278.                         else
  279.                         {
  280.                                 P2OUT &= ~BIT0;
  281.                         }
  282.                         if(tmp/2)
  283.                         {
  284.                                 P2OUT |= BIT1;
  285.                         }
  286.                         else
  287.                         {
  288.                                 P2OUT &= ~BIT1;
  289.                         }
  290.                         tmp++;
  291.                         if(tmp>3)tmp = 0;
  292.                 }

  293.                 if(b[i]&BIT3)                //将array[i]转化为二进制输出,经BCD译码,送数码管显示
  294.                 {
  295.                         P1OUT |= BIT7;
  296.                 }
  297.                 else
  298.                 {
  299.                         P1OUT &= ~BIT7;
  300.                 }
  301.                 if(b[i]&BIT2)
  302.                 {
  303.                         P1OUT |= BIT6;
  304.                 }
  305.                 else
  306.                 {
  307.                         P1OUT &= ~BIT6;
  308.                 }
  309.                 if(b[i]&BIT1)
  310.                 {
  311.                         P1OUT |= BIT5;
  312.                 }
  313.                 else
  314.                 {
  315.                         P1OUT &= ~BIT5;
  316.                 }
  317.                 if(b[i]&BIT0)
  318.                 {
  319.                         P1OUT |= BIT4;
  320.                 }
  321.                 else
  322.                 {
  323.                         P1OUT &= ~BIT4;
  324.                 }
  325.                 delay_ms(1);
  326.         }
  327. }

  328. /**************************************
  329.   *                 函数名:Set
  330.   *                 功能:根据按键的值来执行相应的设置
  331.   *                 参数:        keynum:按键的返回值
  332.   *                 返回值:返回电压值 供DIsp函数显示
  333. ***************************************/
  334. int Set(int keynum)
  335. {
  336.         b[0] = dat/1000;
  337.         b[1] = dat%1000/100;
  338.         b[2] = dat%100/10;
  339.         b[3] = dat%10;
  340.         if(keynum)                //有键按下
  341.         {
  342.                 unsigned char flag = 1;
  343.                 while(flag)
  344.                 {
  345.                         switch(keynum)
  346.                         {
  347.                                 case 1:
  348.                                 {
  349.                                         (*pb)++;
  350.                                         if(*pb>9)*pb = 0;
  351.                                 }break;
  352.                                 case 2:
  353.                                 {
  354.                                         (*pb)--;
  355.                                         if(*pb<0)*pb = 9;
  356.                                 }break;
  357.                                 case 3:
  358.                                 {
  359.                                         pb++;
  360.                                         if(pb>&b[3])pb = &b[0];
  361.                                 }break;
  362.                                 case 4:
  363.                                 {
  364.                                         flag = 0;        //若按下确认键 跳出循环
  365.                                 }break;
  366.                                 default:
  367.                                         break;
  368.                         }
  369.                         keynum = 0;
  370.                         keynum = Key_Scan();
  371.                         Flicker(pb,b);
  372.                 }
  373.         }
  374.         dat = b[0]*1000+b[1]*100+b[2]*10+b[3];
  375. }

  376. /****************************************
  377.   *                函数名:LED_Disp
  378.   *                功能:显示设定输出电压值
  379.   *                参数:dat:输入的电压设定参数
  380.   *                        若 dat = 512;表示设定输出为 5.12V
  381.   *                返回值:
  382.   *                     将设定的温度换算成DA的数据,输入DA
  383.   ****************************************/
  384. int LED_Disp(int dat)
  385. {
  386.         int a[4],tmp = 0;
  387.         int i;
  388.         a[0] = dat/1000;
  389.         a[1] = dat%1000/100;
  390.         a[2] = dat%100/10;
  391.         a[3] = dat%10;

  392.         for(i = 0;i<4;i++)
  393.         {
  394.                 if(tmp%2)                                   //控制数码管段选
  395.                 {
  396.                         P2OUT |= BIT0;
  397.                 }
  398.                 else
  399.                 {
  400.                         P2OUT &= ~BIT0;
  401.                 }
  402.                 if(tmp/2)
  403.                 {
  404.                         P2OUT |= BIT1;
  405.                 }
  406.                 else
  407.                 {
  408.                         P2OUT &= ~BIT1;
  409.                 }
  410.                 tmp++;
  411.                 if(tmp>3)tmp = 0;

  412.                 if(a[i]&BIT3)                //将a[i]转化为二进制输出,经BCD译码,送数码管显示
  413.                 {
  414.                         P1OUT |= BIT7;
  415.                 }
  416.                 else
  417.                 {
  418.                         P1OUT &= ~BIT7;
  419.                 }
  420.                 if(a[i]&BIT2)
  421.                 {
  422.                         P1OUT |= BIT6;
  423.                 }
  424.                 else
  425.                 {
  426.                         P1OUT &= ~BIT6;
  427.                 }
  428.                 if(a[i]&BIT1)
  429.                 {
  430.                         P1OUT |= BIT5;
  431.                 }
  432.                 else
  433.                 {
  434.                         P1OUT &= ~BIT5;
  435.                 }
  436.                 if(a[i]&BIT0)
  437.                 {
  438.                         P1OUT |= BIT4;
  439.                 }
  440.                 else
  441.                 {
  442.                         P1OUT &= ~BIT4;
  443.                 }
  444.                 delay_ms(2);
  445.         }
  446.         Buff = (float)dat/1000*1024;                //将输入的数字温度值转化为送给DA的数据值
  447.         if(Buff > 1023) Buff = 1023;
  448.         return Buff;
  449. }

  450. /*******************************
  451.   *                函数名:Send_Data
  452.   *                功能:写入10位数据
  453.   *                参数:dat:10位数据
  454.   ******************************/
  455. void Send_Data(int dat)
  456. {
  457.         int i,tmp = 0x0200;
  458.         P1OUT &= CS_CLC;                        //使能
  459.         for(i = 0;i<10;i++)
  460.         {
  461.                 if(dat&tmp)
  462.                 {
  463.                         P1OUT |= DIN_SET;
  464.                 }
  465.                 else
  466.                 {
  467.                         P1OUT &= DIN_CLC;
  468.                 }
  469.                 tmp>>=1;
  470.                 P1OUT |= SCLK_SET;                //将数据写入
  471.                 P1OUT &= SCLK_CLC;
  472.         }
  473.         P1OUT |= DIN_SET;                        //写入两个填充位
  474.         P1OUT |= SCLK_SET;
  475.         P1OUT &= SCLK_CLC;
  476.         P1OUT |= DIN_SET;
  477.         P1OUT |= SCLK_SET;
  478.         P1OUT &= SCLK_CLC;

  479.         P1OUT |= CS_SET;                        //挂起
  480. }


  481. void main(void)
  482. {
  483.         int tmp = 0,D = 0;
  484.         WDTCTL = WDTPW + WDTHOLD;        //关闭看门狗
  485.         Clock_Init();
  486.         IO_Init();
  487.         int i = 0;
  488.         P2OUT &= ~BIT6;

  489.         for(;;)
  490.         {
  491.                 tmp = Set(Key_Scan());
  492.                 LED_Disp(tmp);
  493.                 Send_Data(LED_Disp(tmp));
  494.         }
  495.        
  496. }
 楼主| zoujiachi 发表于 2012-10-31 21:52 | 显示全部楼层
本帖最后由 zoujiachi 于 2012-10-31 21:54 编辑

file:///F:/DCIM/Camera/IMG_20121031_133555.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| zoujiachi 发表于 2012-10-31 21:52 | 显示全部楼层
本帖最后由 zoujiachi 于 2012-10-31 21:57 编辑

F:/DCIM/Camera/IMG_20121031_133555.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
huli_2012 发表于 2012-10-31 21:58 | 显示全部楼层
楼主不错,有前途,建议毕业去军工单位研究先进武器,为早日收复钓鱼钓做准备
 楼主| zoujiachi 发表于 2012-11-4 19:35 | 显示全部楼层
5# huli_2012
多谢了,我会努力的  :lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部