資源簡介
使用STC的12C5A60S2單片機
因為要測試IIC通信協議,研究了好久終于改出來了,本程序適用于AT24c64 E2PROM芯片

代碼片段和文件信息
/*
本程序基于郭天祥《51單片機C語言教程》第188頁改寫,使用STC的12C5A60S2單片機
因為要測試IIC通信協議,研究了好久終于改出來了,本程序適用于AT24c64?E2PROM芯片
需要注意的是:
??????????????24C64與24C02的地址指針長度不同,是16位的指針,而24C02是8位指針
??????????其次就是12c5a60s2的速度很快,需要修改延時函數(經示波器測試)
??????????使用的是11.0592MHZ的晶振,SDA為P3.4???SCL為P3.5引腳
??????????地址是000??即A0?A1?A2都接地???串口波特率為9600可自行修改
功能:隨便往串口發送一個數據(內容無所謂,只要產生串口中斷就行)會返回你寫入EEPROM中的數據
于山西農業大學信息學院雙體系Cat‘s?lab.
?????15.7.9
?如果可以的話本程序使用GPL授權:)
*/
#include?<12c5a60s2.h>
#define?uchar?unsigned?char
#define?uint?unsigned?int
sbit?sda=P3^4;
sbit?scl=P3^5;
uchar?Rx_flag=0;?//串口接收標志
uint??RecData;???//串口接收到的數據
uint??SendData;?//串口需要發送的數據
void?delay()?//12c5a60s2單片機?11.0592MHZ時延時4-5us
{
????uchar?ab;
????for(b=1;b>0;b--)
????????for(a=9;a>0;a--);
}
void?start()//IIC起始信號
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void?stop()//IIC停止信號
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void?respons()?//IIC應答信號
{
uchar?i?;
scl=1;
delay();
while?((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void?init() ?//IIC初始化
{
sda=1;
delay();
scl=1;
delay();
}
void?write_byte(uchar?date) //在任意地址?寫一個字節的數據
{
uchar?itemp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar?read_byte() ? //在任意地址?讀一個字節的數據
{
uchar?ik;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return?k;
}
void?write_add(uchar?addresshuchar?addressluchar?date)//寫地址,參數為地址高八位和地址低八位還有數據內容
{
start();
write_byte(0xa0);
respons();
write_byte(addressh);
respons();
write_byte(addressl);
respons();
write_byte(date);
respons();
stop();
}
uchar?read_add(uchar?addresshuchar?addressl)//讀地址,參數為地址高八位和地址低八位
{
uchar?date;
start();
write_byte(0xa0);
respons();
write_byte(addressh);
respons();
write_byte(addressl);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return?date;
}
void?Uart_init(void)
{
???TMOD?=?0x20;???????//T1?方式2
???PCON?=?0x00;???????//SMOD?=?0
???SCON?=?0x50; ??????//方式1?8個數據位???
???TH1=0xfd;??????????//波特率為9600?11.0592Mhz
???TL1=0xfd;
???TR1?=?1; ??????????//啟動定時器1
???ES=1;??????????????//開串口中斷
???EA=1;??????????????//開總中斷???????
}
void?main()
{
delay();
init();
Uart_init();?//串口初始化
delay();
write_add(020xAA);?//向EEPROM的0x0002地址寫數據,內容為0xAA可自行修改<----會向上位機串口助手返回的數據
delay();
while(1)
{
/*sda=1; ??//示波器測試延時時間用
delay();
sda=0;
delay();*/
SendData=read_add(02);//Senddata是要發送給上位機的數據
if(Rx_flag)
????{
?SBUF=SendData;???//將數據放入緩沖區
?while(!TI);??????//等待發送完畢
?TI=0;???????????//清中斷
?Rx_flag=0;??????//清除接收標志
}?
}?
}
void?Uart_rec(void)?interrupt?4?using?1 ?//串口中斷服務程序
{
?if(RI)???????????????//接收中斷標志被置位說明串口已經接收到數據
??{
???RI=0;??????????????//清除中斷標志
???RecData=
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????17731??2014-05-20?13:09??12c5a60s2.h
?????文件???????9062??2015-07-09?10:06??at24c64
?????文件???????3607??2015-07-09?10:09??at24c64.c
?????文件???????1533??2015-07-09?10:06??at24c64.hex
?????文件?????????47??2015-07-09?10:06??at24c64.lnp
?????文件???????8100??2015-07-09?10:06??at24c64.LST
?????文件??????14224??2015-07-09?10:06??at24c64.M51
?????文件???????9761??2015-07-09?10:06??at24c64.OBJ
?????文件????????401??2015-07-09?10:06??at24c64.plg
????.......?????55634??2015-07-09?10:10??at24c64.uvopt
????.......?????13399??2015-07-09?10:10??at24c64.uvproj
????.......??????5624??2015-07-09?10:06??at24c64_uvopt.bak
????.......?????13429??2015-07-09?10:06??at24c64_uvproj.bak
?????文件???????6376??2009-05-07?14:37??STARTUP.A51
?????文件??????14048??2015-07-09?10:06??STARTUP.LST
?????文件????????749??2015-07-09?10:06??STARTUP.OBJ
????.......?????71272??2015-07-09?10:06??at24c64.uvgui.Administrator
-----------?---------??----------?-----??----
???????????????244997????????????????????17
- 上一篇:七個RBF神經網絡的源程序
- 下一篇:西安交通大學 數理統計 施雨 版 課后題答案
評論
共有 條評論