*本文及代碼參閱彭偉《單片機C語言程序設計實訓100例》
一,打開文件(可以隨文下載放置在文檔中打開)。(如下圖1所示)
1.png (651.87 KB, 下載次數: 82)
下載附件
2020-7-12 09:32 上傳
圖1
二,調整原理圖大小,適合可視,另存工程文件。(如下圖2,3,4所示)
2.png (236.02 KB, 下載次數: 63)
下載附件
2020-7-12 09:32 上傳
圖2
3.png (253.52 KB, 下載次數: 56)
下載附件
2020-7-12 09:32 上傳
圖3
4.png (288.36 KB, 下載次數: 59)
下載附件
2020-7-12 09:32 上傳
圖4
三,點擊Source Code標簽。(如下圖5所示)
5.png (170.54 KB, 下載次數: 68)
下載附件
2020-7-12 09:32 上傳
圖5
四,編輯main.c Proteus8.9 VSM Studio WINAVR編譯器仿真ATmega16系列a25_Flash程序空間中數據訪問 (如下圖6所示)
6.png (229.04 KB, 下載次數: 65)
下載附件
2020-7-12 09:32 上傳
圖6
五,Main.c 代碼:
//-----------------------------------------------------------------
// 名稱: Flash程序空間的數據訪問
//-----------------------------------------------------------------
// 說明: 本例運行時,按下K1將讀取并顯示存放于Flash程序內存中的
// 320個字節數據及60個字數據.
//
//-----------------------------------------------------------------
#include "myfunc01.h"
//------------------------------------------------------------------
// 主程序
//------------------------------------------------------------------
int main()
{
INT8U Mem_byte;
INT16U Mem_word, i, j= 0;
char s[6];
Init_USART(51);
put_s("\n\n Press K1 to Start Read Date From Program Flash Memory...");
DDRB= 0x00; PORTB= 0xff;
DDRD= 0xff;
while(1) {
if(K1_DOWN()) {
put_s("\n AVR Program Memory Date Demo......\n");
put_s("\n ---------------------------------------------------------\n ");
for(i= 0, j= 0; i< sizeof(Flash_Byte_Array); i++) {
Mem_byte= pgm_read_byte(&Flash_Byte_Array);
sprintf(s, "% 02X ", Mem_byte); put_s(s);
if(++j== 20) {
j= 0; put_s("\n ");
}
}
put_s("\n ---------------------------------------------------------\n ");
for(i= 0, j= 0; i< sizeof(Flash_Byte_Array); i++) {
Mem_byte= pgm_read_byte(&Flash_Byte_Array);
sprintf(s, "% 04X ", Mem_word); put_s(s);
if(++j== 10) {
j= 0; put_s("\n ");
}
}
}
}
}
myfunc01.h
//******************************************************************************************
#ifndef _MYFUNC01_H_
#define _MYFUNC01_H_
//#define F_CPU 4000000UL //4M晶振
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdio.h>
#define INT8U unsigned char
#define INT16U unsigned int
//按鍵定義
#define K1_DOWN() (PINB & _BV(PB0)) == 0x00
//存放于Flash程序內存中的字節數據(16*20 = 320個字節)
static INT8U Flash_Byte_Array[] =
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
};
//存放于Flash程序內存中的字數據(10*6 = 60個字)
static INT16U Flash_Word_Array[] =
{
0x00AC,0x0198,0x0233,0x03BC,0x0480,0x0598,0x06BE,0x07F8,0x0899,0x09A0,
0x0ACC,0xFF1D,0xF2F3,0xF4F5,0xF6F7,0xF8F9,0xFAFB,0xFCFD,0xFEFF,0xD0D1,
0xD2D3,0xD4D5,0xD6D7,0xD8D9,0xDADB,0xDCDD,0xDEDF,0xE0E1,0xE2E3,0xE4E5,
0xE6E7,0xE8E9,0xEAEB,0xECED,0xEEF0,0xA1A2,0xA3A4,0xA5A6,0xA7A8,0xA9AA,
0xABAC,0xADAE,0xAF80,0x8182,0x8384,0x8586,0x8788,0x898A,0x8B8C,0x8D8E,
0x8F90,0x9192,0x9394,0x9596,0x9798,0xDADB,0xDCDD,0xDEDF,0xE0E1,0xE2E3
};
void Init_USART(INT16U baud);
void put_c(char c);
#endif
六,點擊構建工程按鈕,編譯工程。(如下圖7所示)
7.png (196.31 KB, 下載次數: 74)
下載附件
2020-7-12 09:32 上傳
圖7
七,點擊窗口左下方仿真按鈕,可見信息在虛擬串口顯示屏顯示。 (如下圖8,9,10所示)
8.png (252.13 KB, 下載次數: 72)
下載附件
2020-7-12 09:32 上傳
圖8
9.png (296.19 KB, 下載次數: 64)
下載附件
2020-7-12 09:32 上傳
圖9
10.png (192.72 KB, 下載次數: 59)
下載附件
2020-7-12 09:32 上傳
圖10
八,選擇release,點擊構建工程按鈕,編譯工程生成Hex文件。(如下圖11所示)
11.png (207.77 KB, 下載次數: 68)
下載附件
2020-7-12 09:32 上傳
圖11
附件Proteus8.9 VSM Studio WINAVR編譯器仿真ATmega16系列a25_Flash程序空間中數據訪問在已安裝Proteus8.9的計算機文件夾中打開即可
需要進一步了解,請加入QQ群:976235464
|