标题: AVR单片机ATmega8/16内部晶振校准 源程序 [打印本页]

作者: 凡尘痴儿FF    时间: 2021-2-3 14:14
标题: AVR单片机ATmega8/16内部晶振校准 源程序
AVR单片机ATmega8/16内部晶振校准,本例程适用于内部8M  波特率38400。使用方法:

下载到单片机后打开串口(波特率38400)自动发送十六进制55,成功时串口收到OK指令。

单片机源程序如下:
  1. #define F_CPU 4000000UL
  2. #include <avr/io.h>
  3. #include <string.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6. #define INT8U unsigned char
  7. #define INT16U unsigned int

  8. INT8U flag=0,flag1=0;
  9. INT8U DataBuf;

  10. //初始化
  11. void Init_USART()
  12. {
  13.         UCSRB=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
  14.         UCSRC=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);
  15.         UBRRL=(F_CPU/38400/8-1)%256;
  16.         UBRRH=(F_CPU/38400/8-1)/256;
  17.         UCSRA|=_BV(U2X);
  18. }
  19. //发送一个字符
  20. void PutChar(char c)
  21. {        
  22.         UDR=c;
  23.         while(!(UCSRA&_BV(UDRE)));
  24. }

  25. void tx(char *s) //发送一个字符串
  26. {
  27.         INT8U i=0;
  28.         while(s[i]!='\0') PutChar(s[i++]);
  29. }
  30. void EepromWrite(INT16U uiAddress,INT8U ucData)
  31. {
  32.         while(EECR&(1<<EEWE));
  33.         EEAR=uiAddress;
  34.         EEDR=ucData;
  35.         EECR|=(1<<EEMWE);
  36.         EECR|=(1<<EEWE);
  37. }
  38. /******************************************/
  39. /******************************************/
  40. INT8U EepromRead(INT16U uiAddress)
  41. {
  42.         while(EECR&(1<<EEWE));
  43.         EEAR=uiAddress;
  44.         EECR|=(1<<EERE);
  45.         return (EEDR);
  46. }


  47. int main()
  48. {
  49.         DDRC=0xFF;// 输出低
  50.         PORTC=0x00;//气阀,测试开关
  51.         
  52.         DDRB=0x00;//下载输入弱上拉
  53.         PORTB=0xFF;//传感器
  54.         
  55.         DDRD=0x02;// D0输入上拉D1输出高
  56.         PORTD=0xFF;//按键  检测
  57.         Init_USART();
  58.         sei();
  59.         OSCCAL=0x00;
  60.         /**************** 晶振修正 **************************
  61.         DataBuf=EepromRead(0x0F);
  62.         PutChar(DataBuf);
  63.         if(DataBuf!=0xFF)
  64.         OSCCAL=DataBuf;
  65.         _delay_ms(500);
  66.         ***************************************************/                                       
  67.         while (1)
  68.         {
  69.                                        
  70.         }
  71. }
  72. ISR (USART_RXC_vect)
  73. {
  74.         static INT8U i=0;
  75.         INT8U a;
  76.         a=UDR;
  77.                
  78.         if(a==0x55)
  79.         {
  80.                 //PutChar(a);
  81.                 i++;
  82.                 if (i==50)
  83.                 {
  84.                         UCSRB&=0x7F;
  85.                         EepromWrite(0x0F,OSCCAL);
  86.                         tx("OK");
  87.                 }
  88.         }
  89.         else
  90.         OSCCAL++;        
  91. }
  92. /*串口接受中断
  93. ISR (USART_RXC_vect)
  94. {
  95.         static INT8U i=0;
  96.         INT8U a;
  97.         a=UDR;
  98.         PutChar(a);        
  99.         if(a=0x55)
  100.         {
  101.                 PutChar('0');
  102.                 i++;
  103.                 if (i==50)
  104.                 {                        
  105.                         UCSRB&=0x7F;                        
  106.                         EepromWrite(0x03,a);
  107.                         tx("OK");
  108.                 }
  109.         }
  110.         else
  111.         OSCCAL++;
  112. }*/
  113.                         
复制代码


作者: axjuan    时间: 2022-6-3 13:58
这个是8m的吗?
作者: shuiquan3    时间: 2024-2-1 13:27
这个是8m的吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1