单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:5044|回复:2

AVR单片机ATmega8/16内部晶振校准 源程序

[复制链接]
ID:882468发表于 2021-2-3 14:14|显示全部楼层
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.                 
复制代码

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

ID:656419发表于 2022-6-3 13:58来自手机|显示全部楼层
这个是8m的吗?
ID:163139发表于 2024-2-1 13:27|显示全部楼层
这个是8m的吗?

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

Powered by 单片机教程网