找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3336|回复: 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.                         
复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
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 单片机教程网

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