C8051F同时实现AD和串口收发的程序

C8051F同时实现AD和串口收发的程序
 
  1. //---------------------------------------------------------------------
  2. #include <C8051F020.h>
  3. #include "stdio.h"
  4. sfr16 TMR3RL = 0x92; //定时器3重装载寄存器
  5. sfr16 TMR3 = 0x94; //定时器3计数器
  6. sfr16 DP     =0x82;
  7. sfr16 ADC0   =0xbe;
  8. sfr16 ADC0GT =0xc4;
  9. sfr16 ADCOLT =0xc6;
  10. sfr16 RCAP2  =0xca;
  11. sfr16 T2     =0xcc;
  12. sfr16 RCAP4  =0xe4;
  13. sfr16 T4     =0xf4;
  14. sfr16 DAC0   =0xd2;
  15. sfr16 DAC1   =0xd5;
  16. #define uchar unsigned char
  17. #define uint unsigned int
  18. //----------------------------------------------------------------------
  19. //参数设置区
  20. //----------------------------------------------------------------------
  21. #define BAUDRATE 9600 //波特率bps
  22. #define SYSCLK 11059200 //外部晶振,修改也要修改OSCXCN
  23. #define SMODVAL 0 //SMOD的值,修改请也修改PCONVAL
  24. #define PCONVAL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1
  25. #define TXVAL (256-SYSCLK*(SMODVAL+1)/BAUDRATE/384) //定时器初值
  26. #define MAX_LEN 1//每次接收/发送字符串的长度
  27. #define SAMPLERATE0 5000
  28. #define NUM_SAMPLES 1
  29. #define TURE        1
  30. #define FALSE       0
  31. //---------------------------------------------------------------------
  32. //全局变量
  33. //---------------------------------------------------------------------
  34. sbit LED = P1^6; //LED '1'亮 '0'灭
  35. bit readFlag = 0; //读标志
  36. uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较
  37. uchar idATa trdATa[MAX_LEN]; //要接收/发送的字符串
  38. xdATa unsigned samples[NUM_SAMPLES];
  39. bit ADC0_DONE;
  40.  
  41. //----------------------------------------------------------------------
  42. //子函数声明
  43. //----------------------------------------------------------------------
  44. void SYSCLK_Init(void); //系统时钟初始化
  45. void PORT_Init(void); //端口初始化
  46. void UART0_Init(void); //串口UART0初始化
  47. void Send_Char(uchar ch); //发送单个字符
  48. void Send_String(uchar * str, uint len); //发送一个字符串
  49. void UART0_ISR(); //串口中断服务程序,接收字符
  50. void Timer3_Init(uint counts); //定时器3初始化
  51. void Timer3_ISR(void); //定时器3中断服务程序
  52. void ADC0_Init (void);
  53. //----------------------------------------------------------------------
  54. //主函数
  55. //----------------------------------------------------------------------
  56. void main(void)
  57. {unsigned short i;
  58. floAT temp,k;
  59. WDTCN = 0xde; //禁止看门狗
  60. WDTCN = 0xad;
  61. P6&=0x02;
  62. here:
  63. i=0;
  64. SYSCLK_Init(); //时钟初始化
  65. PORT_Init(); //端口初始化
  66. UART0_Init(); //串口初始化
  67. Timer3_Init(SYSCLK/12/10); //定时器初始化
  68. EA = 1; //开全局中断
  69. ADC0_Init();
  70. AD0INT=0;
  71. AD0BUSY=1;
  72. while(AD0INT==0);
  73. temp=ADC0;
  74. k=(temp*2.4)/4096;
  75. printf("\n");
  76. printf("voltage%f",k);
  77. printf("\n");
  78. i=0;
  79. while(1)
  80.  
  81. {
  82.  
  83.    {if(readFlag) //已经读取
  84.     {
  85.       readFlag = 0; //清零
  86.       Send_String(trdATa,MAX_LEN); //发送字符串
  87.      i++;
  88. if(i==10000){goto here;}
  89. }
  90.  
  91. }
  92. }}
  93. //----------------------------------------------------------------------
  94. //子函数具体实现
  95. //----------------------------------------------------------------------
  96. //系统时钟初始化
  97. void SYSCLK_Init(void)
  98. {
  99. uint i;
  100. OSCXCN = 0x67; //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111
  101. for(i=0;i<256;i++); //等待>1ms
  102. while(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定
  103. OSCICN = 0x88; //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000
  104. }
  105. //端口初始化
  106. void PORT_Init(void)
  107. {
  108. XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100
  109. XBR1 = 0x00;
  110. XBR2 = 0x40; //交*开关使能
  111. P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011
  112. P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口 0100,0000
  113. }
  114. //串口初始化
  115.  
  116. void UART0_Init(void)
  117. {
  118.    SCON0=0x50;
  119.    TMOD=0x20;
  120.    TH1=-(SYSCLK/BAUDRATE/16);
  121.    TR1=1;
  122.    CKCON|=0x10;
  123.    PCON|=0x80;
  124.    TI0=1;
  125.    TR0 = 1;
  126.    ES0 =1; //UART0中断开启   ADC时候要屏蔽   
  127.    TR1 = 1; //启动定时器T1
  128.   }
  129. //定时器初始化
  130. void Timer3_Init(uint counts)
  131. {
  132. TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基
  133. TMR3RL = -counts; //初始化重装载值
  134. TMR3 = 0xffff; //设置为立即重装载
  135. EIE2 |= 0x01; //T3中断开启
  136. TMR3CN |= 0x04; //启动T3
  137. }
  138. //发送单个字符
  139. void Send_Char(uchar ch)
  140. {
  141. SBUF0 = ch; //送入缓冲区1
  142. while(TI0 == 0); //等待发送完毕
  143. TI0 = 0; //软件清零
  144. }
  145. //发送字符串,调用Send_Char() len字符串长度
  146. void Send_String(uchar * str,uint len)
  147. {
  148. uint k = 0;
  149. do
  150. {
  151. Send_Char(*(str + k));
  152. k++;
  153. } while(k < len);
  154. }
  155. //定时器3中断服务程序
  156. void Timer3_ISR(void) interrupt 14 using 0
  157. {
  158. TMR3CN &= ~(0x80); //清TF3
  159. LED = ~LED;
  160. }
  161. //UART0中断服务程序. 接收字符
  162. void UART0_ISR(void) interrupt 4 using 1
  163. {
  164. uchar rxch;
  165. if(RI0) //中断标志 RI0=1 数据完整接收
  166. {
  167. RI0 = 0; //软件清零
  168. rxch = SBUF0; //读缓冲
  169. if(readCounts>=MAX_LEN)
  170. {
  171. readCounts = 0;
  172. readFlag = 1;
  173. }
  174. trdATa[readCounts] = rxch; //存入数组,供发送
  175. readCounts++;
  176. }
  177. }
  178.    
  179. //ADC0_Init
  180. //配置ADC0使用定时器3溢出作为转换启动信号,转换信号结束时候产生中断,使用左对齐输出方式
  181. //允许ADC0,但保持ADC0转换结束中断为禁止状态
  182. void ADC0_Init(void)
  183. {
  184.    ADC0CN=0x04;  //定时器 3 溢出启动 ADC0 转换
  185.    REF0CN=0x07;   //内部偏压发生器工作,内部电压基准缓冲器工作。内部电压基准提供从 VREF引脚输出,内部温度传感器工作
  186.    AMX0SL=0x00;   //开始在通道0
  187.    ADC0CF=(SYSCLK/2500000)<<3;
  188.    ADC0CF&=~0x07;
  189.    EIE2&=~0x02;    //ADC0转换结束中断
  190.    AD0EN=1;     //ADC0 使能。ADC0 处于活动状态,并准备转换数据
  191. }  
  192. //-------------------------------------------------------------
  193. //程序结束
  194. //-----------------------------------------------------
复制代码

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值