找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1525|回复: 0
打印 上一主题 下一主题
收起左侧

基于c8051f340设计的AD双单片机通信

[复制链接]
跳转到指定楼层
楼主
附件是c8051f340的代码


单片机源程序如下:
  1. /*************************************************************************************

  2. *******************************************************************************************/
  3. #include <c8051f340.h>   //头文件
  4. #include <intrins.h>//包含_nop_的头文件

  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. unsigned int    delaytime;
  8. unsigned int    beeptime;
  9. int second;

  10. sbit BEEP = P3^0;
  11. sbit SEG1 = P3^1;
  12. sbit SEG2 = P3^2;
  13. sbit SEG3 = P3^3;
  14. sbit SEG4 = P3^4;

  15. bit   stop=0;
  16. uint  speed=10;
  17. uint  counter1,counter2;
  18. uint  count;
  19. uchar disbuf[7];
  20. uchar disbuf1[6];
  21. uchar number,revnumber;

  22. void   display(void );

  23. /*******************************************************************************/
  24. /*******************************************************************************/



  25. void delayMs(uint  ms)      //延时程序  精确
  26.                             //
  27. {
  28.          delaytime=ms;
  29.    while(delaytime>0)  ;
  30.   }   
  31. /*******************************************************************************/
  32. /*******************************************************************************/
  33. void Oscillator_Init()
  34. {
  35.     int i = 0;                       //外部晶振启动
  36.     OSCXCN    = 0x67;
  37.     for (i = 0; i < 3000; i++);      // Wait 1ms for initialization
  38.     while ((OSCXCN & 0x80) == 0);
  39.     CLKMUL    = 0x80;
  40.     for (i = 0; i < 20; i++);        // Wait 5us for initialization
  41.     CLKMUL    |= 0xC1;               // 乘法器的输入为外部晶体
  42.     while ((CLKMUL & 0x20) == 0);    //乘法器启动
  43.     CLKSEL    = 0x03;      //4倍      48M
  44.     OSCICN=0;                       //关闭内部高频振荡器,不用了,省电。
  45. }
  46. /*******************************************************************************/
  47. /*******************************************************************************/
  48. void main()
  49. {
  50.    uchar temp;

  51.    int  ADVAL;
  52.    PCA0MD=0X00;         //禁止看门狗
  53.    XBR1=0X40;           //端口连上引脚
  54.    P0MDIN&=0X3F;        //晶振引脚为模拟输入
  55.    P0SKIP|=0XC0;        //跳过P0。6,P0。7
  56.    Oscillator_Init();   //振荡器初始化
  57.                         //SYSCLK=48M
  58.    P1MDOUT=0XFF;        //推挽输出
  59.    P2MDOUT=0XFF;        //推挽输出
  60.    P3MDOUT=0XFF;        //推挽输出
  61.    
  62.    XBR0|=0X01;         //串口0连到引脚上。P04\Pp05
  63.    TMOD=0X21;           //T0T1都工作在定时模式.T0工作在16位模式,T1工作在8位自动重载方式?
  64.    IE=0X82;            //允许T0中断,T1不中断,允许总中断.

  65.    TH0=0X44;
  66.    TL0=0x80;   //初值
  67.   
  68.    CKCON=0X06;          //T0:  脉冲源频率为48M。//T1:  脉冲源频率为48M/48=1M。
  69.    TH1=256-1000000/2/9600;
  70.    TL1=256-1000000/2/9600;   //可产生2400、4800、9600、19200、38400、56000、57600、115200共九个波特率。
  71.   
  72.          TCON=0X50;          //启动T0、T1
  73.    temp=1;              //初值
  74.    BEEP=0;
  75.    SCON0=0x10;        //串口方式1, 8 位 UART,允许接收,10位数据
  76.    IE|=0X10;
  77.    CKCON&=~0X40;      //T3使用外部时钟/8=1.5M
  78.    TMR3CN=  0x1;        //T3开始作
  79.    TMR3RLL=(65536-1500)%256;     //重载值
  80.    TMR3RLH=(65536-1500)/256;  
  81.    EIE1|=0X80;            //允许T3中断
  82.    TMR3CN|=0x04;        //T3开始作
  83.          
  84.          
  85.          AMX0P=0x0e;    //P45
  86.    AMX0N=0x1f;    //GND
  87.          P4MDIN=0x9f;   //P45?P46?????
  88.          REF0CN=0x0e;   //ADC0用VDD做为基准源, 温度传感器使能,内部模拟偏压发生器使能位 //基准源
  89.    ADC0CF=0X78;    //ADC???3M,48/16,???
  90.    ADC0CN=0X80;    //??ADC0

  91.          
  92.                  
  93.    while(1)             //死循环,单片机的固有编程模式
  94.   
  95.    {
  96.    
  97.     delayMs(1000);
  98.     BEEP=0;
  99.     P1= temp;                          
  100.     temp=_crol_(temp,1);           //改成0.5秒
  101.     if (temp==0x01)
  102.     {BEEP=1;
  103.      beeptime=100;}
  104.                
  105.                  
  106.                  if (AD0BUSY==0)    //????????
  107.      {
  108.             ADVAL= ADC0H*256+ADC0L;
  109.           
  110.                  disbuf1[6]=0x0d;
  111.                  disbuf1[5]=ADVAL%10;
  112.      disbuf1[4]=ADVAL/10%10;
  113.      disbuf1[3]=ADVAL/100%10;
  114.      disbuf1[2]=ADVAL/1000%10;
  115.      disbuf1[1]=ADVAL/10000%10;
  116.                  SBUF0=0xaa;
  117.                  number=1;
  118.      AD0BUSY=1;  
  119.    }

  120. }
  121. }
  122. /*******************************************************************************/
  123. /*******************************************************************************/

  124. void   display(void )            //动态显示程序,每次调用只显示一个数码管

  125. {
  126.    static char count=0;
  127.                      
  128.    if (++count==6)   count=0;

  129.     P2=P2&0X03;                           //使位选全部无效。
  130.    
  131.    SEG1=disbuf[count]&0X01;     //非零即1的关系//输出段码第0位
  132.    SEG2=disbuf[count]&0X02;     //非零即1的关系//输出段码第1位
  133.    SEG3=disbuf[count]&0X04;     //非零即1的关系//输出段码第2位
  134.    SEG4=disbuf[count]&0X08;     //非零即1的关系//输出段码第3位
  135.    P2=P2&0X03|(0x04<<count);              //输出位码。
  136. }


  137. /*******************************************************************************/



  138. void T0_isp(void) interrupt 1     //T0中断,

  139. {  

  140.     TH0=0X44;                      //毫秒中断
  141.           TL0+=0X80;
  142.    
  143. }


  144.   void T1_isp(void) interrupt 3    //T1中断
  145. {
  146.    
  147.    static u8     key;
  148.    static u8     key2;
  149.    static u8     keybuf[5];


  150.    TH1=0X44;
  151.    TL1=0X80;              
  152.           //毫秒中断


  153.     keybuf[0]=keybuf[1];            //àúê·êy?Y
  154.           keybuf[1]=keybuf[2];
  155.           keybuf[2]=keybuf[3];
  156.           keybuf[3]=keybuf[4];
  157.     keybuf[4]=P4;

  158.    if(keybuf[0]==keybuf[1]    &&
  159.             keybuf[0]==keybuf[2]    &&
  160.             keybuf[0]==keybuf[3]    &&
  161.             keybuf[0]==keybuf[4]    )                  //?áμ?á??è?¨μ?êy?Yá?
  162.        
  163.                 {       
  164.                   key2=key;                                  //àúê·êy?Y
  165.             key=keybuf[0];                            //μ±?°êy?Y
  166.                

  167. //调整秒,分,时
  168.     if ((key&0x04)==0 && (key2&0x04)==0x04)  
  169.                        
  170.                      count+=1;
  171.                                                
  172.     if ((key&0x08)==0 && (key2&0x08)==0x08)   
  173.              
  174.                      count+=60;
  175.        
  176.           if ((key&0x10)==0 && (key2&0x10)==0x10)
  177.       
  178.                          count+=3600;   //抖动
  179.           
  180.          
  181.                        
  182.     if ((key&0x80)==0 && (key2&0x80)==0x80)   ;   //
  183.          
  184.          

  185. }

  186.      if (delaytime>0)
  187.               delaytime--;              
  188.      if (!(beeptime--))                     
  189.               BEEP=0;
  190. }







  191. //**********************************************************************************
  192. void T3_isp(void) interrupt 14    //T3中断
  193. {
  194.     TMR3CN&=~0X80;
  195.           if(delaytime>0) delaytime--;
  196.           if(!-- beeptime) BEEP=0;
  197.     display();
  198. }
  199.       
  200. //************************************************************************************

  201.   void time1_isp(void) interrupt 4    //串行接口0中断,发送接收是一个中断向量,两个中断源
  202. {
  203.    static  uchar bufrec[10];
  204.    static uchar  revnumber;
  205.    static  uchar  temporary;

  206.   
  207.          if(TI0==1)
  208.     {
  209.        TI0=0;
  210.              if (number<6)
  211.                 SBUF0=disbuf1[++number];      //变成ASCII码       
  212.      }
  213.          if(RI0==1)
  214.     {
  215.       RI0=0;
  216.       temporary=SBUF0;
  217.             if (temporary==0xaa  )
  218.                revnumber=0;
  219.       else
  220.              {
  221.                bufrec[revnumber++]=temporary;
  222.          if(revnumber==5 && bufrec[4]==0x0d )
  223.                
  224.                       {
  225.                                     disbuf[5]=bufrec[3];
  226.             disbuf[4]=bufrec[2];
  227.             disbuf[3]=bufrec[1];
  228.             disbuf[2]=bufrec[0];
  229.                       }
  230.                                      
  231.     }
  232.    }
  233. }

  234. //************************************************************************************
复制代码

所有资料51hei提供下载:
5 AD双单片机通信.zip (45.6 KB, 下载次数: 21)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表