找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7654|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

AVR單片機ATmega8/16內(nèi)部晶振校準(zhǔn) 源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:882468 發(fā)表于 2021-2-3 14:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
AVR單片機ATmega8/16內(nèi)部晶振校準(zhǔn),本例程適用于內(nèi)部8M  波特率38400。使用方法:

下載到單片機后打開串口(波特率38400)自動發(fā)送十六進(jìn)制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. //發(fā)送一個字符
  20. void PutChar(char c)
  21. {        
  22.         UDR=c;
  23.         while(!(UCSRA&_BV(UDRE)));
  24. }

  25. void tx(char *s) //發(fā)送一個字符串
  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;//氣閥,測試開關(guān)
  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.                         
復(fù)制代碼

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:656419 發(fā)表于 2022-6-3 13:58 來自手機 | 只看該作者
這個是8m的嗎?
回復(fù)

使用道具 舉報

板凳
ID:163139 發(fā)表于 2024-2-1 13:27 | 只看該作者
這個是8m的嗎?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表