/*
有客户反映使用Flash做EEPROM时,若同时使用UART口会导致UART口发送的数据不正确。。。。。。。。
本测试范例是通过两个按键进行计数,计数值实时显示在数码管上并保存在EEPROM中(利用Flash做EEPROM)。
一个键用于计数加操作,另一个按键用于计数减操作。每次计数值改变时将改变后的计数值通过串口发送出去。
结论:
1)经过程序测试,没有发生客户所描述的问题。
2)UART串口通信与EEPROM操作功能均正常。
*/
#include "MC96F8316.h"
#define CRYSTAL 1
#define KEY_DELAY_NUM 2
#define SET(x, y) ((x) |= (0x01<<(y))) // 寄存器位置1宏定义
#define CLR(x, y) ((x) &= ~(0x01<<(y))) // 寄存器位清0宏定义
#define TEST_BIT(x, y) ((x) & (0x01<<(y))) // 寄存器位判断宏定义
/*############### @4MHz U2X=0下 UARTBD对应常用波特率 #############*/
#if 0
#define BAUD_4800 51
#define BAUD_9600 25
#define BAUD_19200 12
#endif
/*############### @8MHz U2X=0下 UARTBD对应常用波特率 #############*/
#if 1
#define BAUD_4800 103
#define BAUD_9600 51
#define BAUD_19200 25
#endif
unsigned int keysw2_count, keysw2_pull_count;
unsigned int keysw3_count, keysw3_pull_count;
// ################################################################################
// 标志位定义
// ################################################################################
unsigned char bdata flag1;
sbit keysw2_begin = flag1^7;
sbit keysw2_end = flag1^6;
sbit keysw2_pull = flag1^5;
sbit keysw2_pull_begin = flag1^4;
sbit keysw2_pull_end = flag1^3;
sbit keysw2_flag = flag1^2;
sbit keysw3_begin = flag1^1;
sbit keysw3_end = flag1^0;
unsigned char bdata flag2;
sbit keysw3_pull = flag2^7;
sbit keysw3_pull_begin = flag2^6;
sbit keysw3_pull_end = flag2^5;
sbit keysw3_flag = flag2^4;
sbit flag_4ms = flag2^3;
/* ################################################################################
共阴数码管字符编码表
##################################################################################*/
unsigned char code disp_table[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x40
};
unsigned char count;
unsigned char write_data[32]={8,9}; // 要写入的数据
//################################ 函数声明 ##################################//
void UART_init(int baud, char check_bit, char data_bit, char stop_bit);
void process_keysw2(void);
void sw2key_scanf(void);
void process_keysw3(void);
void sw3key_scanf(void);
void delay4ms(void);
void delay20ms(void);
void delay1s(void);
void display(void);
void init_sysclock(void);
extern void eeprom_wr_flag_endable(unsigned char enable);
extern unsigned char eeprom_page_write_data(unsigned int ROMadr,unsigned char *dat);
extern void eeprom_page_read_data(unsigned int code *eep_address, unsigned char *dat);
/*#################################################################################
主程序
##################################################################################*/
void main(void)
{
init_sysclock(); // 初始化系统时钟
delay1s(); // 延时1秒钟
UART_init(9600, 'N', 8, 1); // UART串口初始化操作
P1IO |= 0xFF; // P1口全部设置成输出模式
P2IO |= 0x0F; // P20~P23设置成输出模式
BITCR = 0x4E; // BIT定时器初始化
IE3 |= (0x01<<4); // 开启BIT定时器中断控制位
EA = 1; // 开总中断
eeprom_wr_flag_endable(1); // EEPROM操作标志变量使能
eeprom_page_read_data(0x3FC0, write_data); // 从Flash存储器0x3FC0处读取数据
eeprom_wr_flag_endable(0); // EEPROM操作标志变量清除
count = write_data[0];
while(1)
{
sw2key_scanf();
process_keysw2();
sw3key_scanf();
process_keysw3();
display();
}
}
/*#############################################################################
函数名称: init_UART
实现功能: UART初始化操作
输入参数: int baud --波特率
char check_bit --校验位,'N'(无校验),'O'(奇校验),'E'(偶校验)
char data_bit
char stop_bit --1(1个停止位),2(2个停止位)
返回参数: 无
#############################################################################*/
void UART_init(int baud, char check_bit, char data_bit, char stop_bit)
{
P3FSR |= 0x01; // Pin9作为TXD引脚使用
P3IO &= ~(0x01<<1); // P31口作为输入口
switch(baud)
{
case 9600:
UARTBD = BAUD_9600;
break;
case 19200:
UARTBD = BAUD_19200;
break;
case 4800:
UARTBD = BAUD_4800;
break;
default: break;
}
switch(check_bit)
{
case 'N':
UARTCR1 &= ~((0x01<<5)|(0x01<<4));
break;
case 'E':
UARTCR1 |= (0x01<<5);
UARTCR1 &= ~(0x01<<4);
break;
case 'O':
UARTCR1 |= (0x01<<5)|(0x01<<4);
break;
default: break;
}
if (8 == data_bit)
{
UARTCR1 |= (0x01<<2)|(0x01<<1);
}
else
{
UARTCR1 |= (0x01<<2);
}
if (1 == stop_bit)
{
UARTCR3 &= ~(0x01<<2);
}
else
{
UARTCR3 |= (0x01<<2);
}
UARTCR2 = 0x2E; // 接收完成中断使能、发送使能、接收使能、激活UART、正常倍速
// IE1 |= (0x01<<3); // UART串口接收中断打开
// EA = 1; // 开启总中断
UARTCR3 = 0;
}
/*#############################################################################
初始化系统时钟
#############################################################################*/
void init_sysclock(void)
{
#if CRYSTAL
P3FSR |= (1<<7)|(1<<6); // P37口选择XOUT功能,P36口选择XIN功能
OSCCR |= (1<<1)|(1<<0); // 开启外部主时钟,开启副时钟
delay20ms();
SCCR = 0x01; // 选择外部时钟作为系统时钟
OSCCR |= (1<<2); // 关闭内部RC振荡器
#else
OSCCR = 0x20; // 内部RC振荡器,fx=8MHz
BITCR = 0x4E;
delay20ms();
#endif
LVRCR = 0x10;
}
//###################### BIT定时器中断服务程序 ########################
void BIT_timer_isp(void) interrupt 22 using 1
{
flag_4ms = 1;
}
/*#############################################################################
函数名称: display
实现功能: 数码管显示程序
入口参数: 无
返回参数: 无
#############################################################################*/
void display(void)
{
P1 = disp_table[count/10];
P20 = 0; P21 = 1; P22 = 1; P23 = 1;
delay4ms();
P1 = disp_table[count%10];
P20 = 1; P21 = 0; P22 = 1; P23 = 1;
delay4ms();
}
/*#############################################################################
函数名称: delay4ms
实现功能: 延时4ms
入口参数: 无
返回参数: 无
#############################################################################*/
void delay4ms(void)
{
unsigned char a, b;
for(b=205;b>0;b--)
for(a=18;a>0;a--);
}
/*############################################################################
函数名称: delay20ms
实现功能: 延时20ms
入口参数: 无
返回参数: 无
#############################################################################*/
void delay20ms(void)
{
unsigned char a,b;
for(b=95;b>0;b--)
for(a=209;a>0;a--);
}
/*############################################################################
函数名称: delay1s
实现功能: 延时1秒钟
入口参数: 无
返回参数: 无
#############
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
MC96F8208S 是一款有8K字节FLASH的 8位 CMOS单片机. 本芯片是一款可以为许多嵌入式控制应用提供高效灵活低成本解决方案的微控器. 该芯片有以下特点: 8k 字节 FLASH, 256 字节 IRAM, 256 字节 XRAM , 通用 I/O, 基本间隔定时器, 8/16位定时器/计数器, 16位 PPG 输出, 8位 PWM 输出, watch timer, 蜂鸣器驱动口, SPI, UART, I2C,12-bit A/D 转换器, 片内 POR, LVR, LVI, 片内振荡和时钟电路. C96F8208S 也支持节电模式以减少电量消耗
资源推荐
资源详情
资源评论
格式:pdf 资源大小:3.8MB 页数:127
格式:pdf 资源大小:3.5MB 页数:141
格式:rar 资源大小:859.0B
收起资源包目录
MC96F8208_EEPROM.rar (21个子文件)
MC96F8208_EEPROM
eeprom_uart_test 19KB
eeprom_uart_test.uvgui_Administrator.bak 137KB
eeprom_uart_test.plg 455B
eeprom_uart_test.uvgui.Administrator 137KB
eeprom_uart_test.lnp 142B
STARTUP.OBJ 835B
eeprom_uart_test.uvopt 8KB
MC96F8316.h 8KB
eeprom_uart_test.OBJ 15KB
eeprom.LST 14KB
STARTUP.A51 6KB
eeprom_uart_test.M51 28KB
ExtDll.iex 19B
eeprom.OBJ 7KB
eeprom_uart_test.bin 1KB
eeprom_uart_test.LST 20KB
eeprom_uart_test.uvproj 14KB
STARTUP.LST 14KB
eeprom_uart_test.hex 4KB
eeprom_uart_test.c 12KB
eeprom.c 9KB共 21 条
- 1
资源评论
wmdszmr
- 粉丝: 186
上传资源 快速赚钱
我的内容管理
展开
我的资源
快来上传第一个资源
我的收益 登录查看自己的收益
我的积分
登录查看自己的积分
我的C币
登录后查看C币余额
我的收藏
我的下载
下载帮助
前往需求广场,查看用户热搜最新资源
- 基于物联网技术智能附着式脚手架智能控制保护系统的研究.docx
- 中小企业组建无线网络方案.docx
- 信用评软件设计方案方法的比较分析研究.doc
- 人力资源管理课程项目管理化设计.doc
- 互联网环境下中国电影市场在发展中存在的问题分析.docx
- 通信工程专业毕业论文.doc
- 认识计算机课件.ppt
- 智能交通系统中的计算机视觉技术应用研究.docx
- Web2.0-时代下的西藏旅游目的地形象建设初探.doc
- 浅析计算机存储器分层结构.docx
- 三级电子商务标准答案.docx
- 浅议中职计算机应用基础课程在非计算机专业教学中的改革与创新.docx
- sa算法及安全性分析.ppt
- 面向土木专业人才培养的《计算机程序设计》学习课程改革实践与探索.doc
- 新时期高校管理的信息化建设及国际化发展.docx
- 多媒体技术在中职计算机教学中的应用.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功