#include typedef enum { false, true }bool; #if 0 sbit Test_CLK = P0^3; //接收 腳定義 #endif bit RxdOrTxd = 0; //指示當前狀態為接收還是發送 //通過嵌套宏定義,制作一張包括0~255各個數字中包含1的個數,其中包含偶數個1,則ParityTable256[i]=0,否則ParityTable256[i]=1; void SET_3v5v() void RST_SET(BitAction ResetState) PIN_RST = ResetState; void SET_CMVCC() uint16_t USART_ReceiveData(USART_TypeDef* USARTx) #if 1 static unsigned char cnt = 0; //位接收或發送計數 if (RxdOrTxd) #else void InterruptTimer0() interrupt 1{ static unsigned char cnt = 0; //位接收或發送計數
#include "main.h"
#include "smartcard.h"
#include "stdio.h"
sbit PIN_RXD = P1^0; //接收發送同一個引腳定義
sbit PIN_TXD = P1^0; //接收發送同一個發送引腳定義
sbit PIN_CLK = P3^1; //智能卡時鐘引腳定義
sbit PIN_3v5v = P3^2; //智能卡3v_5v引腳定義
sbit PIN_RST = P3^3; //智能卡復位引腳定義
sbit PIN_CMDVCC = P3^4; //智能卡CMD引腳定義
#else
// test Parity
sbit PIN_RXD = P1^0; //接收 腳定義
sbit PIN_TXD = P1^2; //發送 腳定義
sbit PIN_CLK = P3^5; //智能卡時鐘引腳定義
sbit PIN_3v5v = P3^2; //智能卡3v_5v引腳定義
sbit PIN_RST = P3^3; //智能卡復位引腳定義
sbit PIN_CMDVCC = P3^4; //智能卡CMD引腳定義
bit RxdEnd = 0; //接收結束標志
bit TxdEnd = 0; //發送結束標志
uint8_t RxdBuf = 0; //接收緩沖器
uint8_t TxdBuf = 0; //發送緩沖器
void ConfigUART(unsigned int baud);
void StartTXD(unsigned char dat);
void StartRXD();
void test_IO();
static const bool ParityTable256[256] =
{
#define P2(n) n, n^1, n^1, n
#define P4(n) P2(n), P2(n^1), P2(n^1), P2(n)
#define P6(n) P4(n), P4(n^1), P4(n^1), P4(n)
P6(0), P6(1), P6(1), P6(0)
};
void mainb(){
EA = 1; //開總中斷
ConfigUART(9600);//配置波特率為 9600
while (1){
while (PIN_RXD); //等待接收引腳出現低電平,即起始位
StartRXD(); //啟動接收
while (!RxdEnd); //等待接收完成
StartTXD(RxdBuf+1); //接收到的數據+1 后,發送回去
while (!TxdEnd); //等待發送完成
}
return;
}
{
PIN_3v5v=1;
}
void RESET_3v5v()
{
PIN_3v5v=0;
}
{
}
{
PIN_CMDVCC =1;
}
void RESET_CMVCC()
{
PIN_CMDVCC =0;
}
/* 串口配置函數,baud-通信波特率 */
void ConfigUART(unsigned int baud){
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x02; //配置 T0 為模式 2
// TH0 = 256 - (11059200/6)/baud; //計算 T0 重載值
TH0 = 256 - (FOSC/12)/baud; //計算 T0 重載值
}
/* 啟動串行接收 */
void StartRXD(){
while (PIN_RXD);
//printf("PIN_RXD2=0x%02Xrn", (int)PIN_RXD);
TL0 = 256 - ((256-TH0)>>1); //接收啟動時的 T0 定時為半個波特率周期
ET0 = 1; //使能 T0 中斷
TR0 = 1; //啟動 T0
RxdEnd = 0; //清零接收結束標志
RxdOrTxd = 0; //設置當前狀態為接收
}
/* 啟動串行發送,dat-待發送字節數據 */
void StartTXD(uint8_t dat){
TxdBuf = dat; //待發送數據保存到發送緩沖器
TL0 = TH0; //T0 計數初值為重載值
ET0 = 1; //使能 T0 中斷
TR0 = 1; //啟動 T0
PIN_TXD = 0; //發送起始位
TxdEnd = 0; //清零發送結束標志
RxdOrTxd = 1; //設置當前狀態為發送
}
{
/* Check the parameters */
// assert_param(IS_USART_ALL_PERIPH(USARTx));
/* Receive Data */
#if 0
uint16_t tt= USARTx->SR ;
USARTx->SR = tt & (uint16_t)0x3df; //wuhh add ,remove later
return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
#endif
return (uint16_t) RxdBuf;
}
void USART_SendData(USART_TypeDef* USARTx, uint8_t Data)
{
StartTXD(Data);
}
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
FlagStatus bitstatus = RESET;
if (USART_FLAG== USART_FLAG_TC)
if (TxdEnd)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
if (USART_FLAG== USART_FLAG_RXNE)
if (RxdEnd)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
static bit polarity = 0; //輸出智能卡時鐘極性
/* T0 中斷服務函數,處理串行發送和接收 */
void InterruptTimer0() interrupt 1{
Test_CLK = !Test_CLK;
{ //串行發送處理
cnt++;
if (cnt <= 8){ //低位在先依次發送 8bit 數據位
PIN_TXD = TxdBuf & 0x01;
TxdBuf >>= 1;
}else
if (cnt == 9)
{ //發送停止位
PIN_TXD = 1;
}
else{ //發送結束
cnt = 0; //復位 bit 計數器
TR0 = 0; //關閉 T0
TxdEnd = 1; //置發送結束標志
}
}
else{ //串行接收處理
if (cnt == 0){ //處理起始位
if (!PIN_RXD){ //起始位為 0 時,清零接收緩沖器,準備接收數據位
RxdBuf = 0;
cnt++;
}
else{ //起始位不為 0 時,中止接收
TR0 = 0; //關閉 T0
}
}else if (cnt <= 8){ //處理 8 位數據位
RxdBuf >>= 1; //低位在先,所以將之前接收的位向右移
//接收腳為 1 時,緩沖器最高位置 1,
//而為 0 時不處理即仍保持移位后的 0
if (PIN_RXD){
RxdBuf |= 0x80;
}
cnt++;
}else{ //停止位處理
cnt = 0; //復位 bit 計數器
TR0 = 0; //關閉 T0
if (PIN_RXD){ //停止位為 1 時,方能認為數據有效
RxdEnd = 1; //置接收結束標志
}
}
}
}
/* T0 中斷服務函數,處理串行發送和接收 */
//test_IO();
#if 0
PIN_TXD = !PIN_TXD;
#else
if (RxdOrTxd){ //串行發送處理
cnt++;
if (cnt <= 8){ //低位在先依次發送 8bit 數據位
PIN_TXD = TxdBuf & 0x01;
TxdBuf >>= 1;
}else if (cnt == 9){ //奇偶位
PIN_TXD=ParityTable256[TxdBuf];
}else if (cnt == 10){ //發送停止位1 智能卡協議共兩個停止位
PIN_TXD = 1;
}else if (cnt == 11){ //發送停止位2
PIN_TXD = 1;
}else{ //發送結束
cnt = 0; //復位 bit 計數器
TR0 = 0; //關閉 T0
TxdEnd = 1; //置發送結束標志
}
}else{ //串行接收處理
if (cnt == 0){ //處理起始位
if (!PIN_RXD){ //起始位為 0 時,清零接收緩沖器,準備接收數據位
RxdBuf = 0;
cnt++;
//printf("InterruptTimer 0n");
} else{ //起始位不為 0 時,中止接收
TR0 = 0; //關閉 T0
printf("InterruptTimer closen");
}
}
else if (cnt <= 8){ //處理 8 位數據位
RxdBuf >>= 1; //低位在先,所以將之前接收的位向右移
//接收腳為 1 時,緩沖器最高位置 1,
//而為 0 時不處理即仍保持移位后的 0
if (PIN_RXD){
RxdBuf |= 0x80;
}
printf("RxdBuf=0x%02Xrn", (int)RxdBuf);
cnt++;
}else{ //停止位處理
cnt = 0; //復位 bit 計數器
TR0 = 0; //關閉 T0
if (PIN_RXD){ //停止位為 1 時,方能認為數據有效
RxdEnd = 1; //置接收結束標志
}
}
}
#endif
}
#endif
上一篇:軟件模擬串行通信——UART協議實現
下一篇:基于STC15單片機芯片的直流電機PID控制轉速源碼
推薦閱讀
史海拾趣
Ho Chien Electronics Group Inc公司發展故事
故事一:創立與全球化布局
Ho Chien Electronics Group Inc.(以下簡稱“Ho Chien”)創立于1974年,其全球總部位于美國波士頓。自成立以來,Ho Chien迅速在全球范圍內擴展其業務,先后在中國、新加坡、德國、巴西、加拿大和墨西哥等地設立了超過40個分部。這一布局不僅加強了公司的市場滲透力,還為其提供了豐富的資源支持,助力其在電子行業細分市場中穩步前行。Ho Chien特別專注于互連與機電產品領域,通過為原始設備制造商和合約制造商提供高質量的產品和服務,逐步在行業內建立了良好的聲譽。
故事二:亞太市場的拓展
2012年12月,Ho Chien正式啟動其亞太業務,并將亞太區總部設在香港。為了更好地服務亞太地區的客戶,Ho Chien不僅設立了銷售部,還構建了區域配送中心和增值服務中心。經過數年的努力,Ho Chien亞太區已開設24個分部和3處倉庫,極大地提升了其在該地區的運營效率和服務質量。這一舉措不僅加深了Ho Chien在亞太市場的影響力,還為其未來的全球擴張奠定了堅實的基礎。
故事三:產品線的豐富與拓展
Ho Chien致力于為電子行業各細分市場的客戶提供全面支持,其產品線涵蓋了25個不同元器件類別。主要分銷產品包括互連器件、繼電器、風扇、開關、散熱解決方案、套管和線束產品、晶體與振蕩器、緊固件與五金件以及傳感器等。隨著市場的不斷變化和技術的飛速發展,Ho Chien不斷調整和優化其產品線,以滿足客戶日益增長的需求。這一策略不僅幫助Ho Chien保持了其在行業內的競爭力,還為其帶來了穩定的收入來源。
故事四:創新與研發
作為電子行業的領軍企業之一,Ho Chien深知創新對于公司發展的重要性。因此,公司不斷加大在研發方面的投入,致力于新技術、新產品的開發和應用。通過引進先進的研發設備和優秀人才,Ho Chien在多個領域取得了重大突破,并成功推出了一系列具有自主知識產權的產品。這些創新成果不僅提升了Ho Chien的品牌價值,還為其在全球市場上的拓展提供了有力支持。
故事五:人才培養與企業文化
在快速發展的過程中,Ho Chien深刻認識到人才對于公司持續發展的關鍵作用。因此,公司始終堅持“以員工為中心”的管理思想,努力為員工創造寬松的工作氛圍和良好的發展機會。Ho Chien不僅提供優厚的福利待遇和豐富的培訓資源,還鼓勵員工積極發揮自己的才華和潛能。在這種企業文化的影響下,Ho Chien匯聚了一大批優秀的專業人才和管理精英,為公司的快速發展提供了強有力的智力支持。同時,這種積極向上的企業文化也進一步提升了Ho Chien的品牌形象和社會影響力。
隨著公司規模的擴大和市場份額的提升,AZ Displays開始實施全球化戰略。公司在全球范圍內建立銷售網絡和分支機構,積極開拓國際市場。通過與國際知名企業的合作,AZ Displays成功將產品打入國際市場,進一步提升了公司的品牌影響力和市場競爭力。
背景:近年來,隨著全球對可持續發展和數字化轉型的重視,霍尼韋爾積極調整戰略方向。
發展:公司加大了在可持續技術和數字化轉型領域的投入,推出了一系列創新的產品和解決方案。例如,在能源轉型領域,霍尼韋爾與多家中國合作伙伴共同推動可持續航空燃料生產基地的建設;在智慧建筑領域,與騰訊云合作打造聯合解決方案等。
關鍵事件:這些舉措不僅體現了霍尼韋爾對可持續發展的承諾和責任擔當,也展示了公司在數字化轉型方面的前瞻性和創新能力。同時,這些合作也進一步鞏固了霍尼韋爾在全球電子行業的領先地位。
American Custom Components公司自創立之初,就致力于電子元器件的創新研發。在一次技術研討會上,公司的研發團隊發現了一種新型的半導體材料,具有出色的導電性和穩定性。經過數月的實驗和驗證,團隊成功地將這種材料應用于新產品中,推出了一款性能卓越的集成電路。這一創新技術不僅提升了公司的產品質量,還贏得了市場的廣泛認可,為公司的發展奠定了堅實基礎。
背景:隨著中國經濟的快速發展和消費者對電子產品需求的不斷增加,Galaxy公司敏銳地捕捉到這一市場機遇。
行動:在2003年初,Galaxy以縝密的市場調研為基礎,全力部署進入大陸市場。同年6月,公司推出了以“影馳”命名的Geforce家族系列產品,迅速吸引了眾多游戲發燒友和電子產品愛好者的關注。隨后,公司又在多個城市設立了銷售和服務網點,為消費者提供更加便捷的產品體驗和服務。
成果:經過多年的深耕細作,Galaxy在大陸市場取得了顯著成績,品牌影響力不斷增強,市場份額穩步提升。
深圳市東通電子有限公司(以下簡稱“東通電子”)成立于1998年5月,最初主要涉足電子元器件的生產和銷售。隨著市場的不斷變化和技術的飛速發展,公司意識到僅僅依靠傳統業務已無法滿足市場需求。于是,在2002年,東通電子決定將重心轉向有機薄膜電容器的研發和生產。這一轉型為公司的后續發展奠定了堅實的基礎。
手頭上有2個西門子MC75通信模塊。但無法啟動。設計的原理圖在附件。 現象是:其中一個模塊,如果不插sim卡,可以正常啟動,串口中也可以看到啟動信息,發AT指令沒有問題。但是如果插上SIM卡,則串口沒有任何信息,AT指 ...… 查看全部問答∨ |
|
listview (ownerdraw)中背景圖片怎么能不平鋪? 我這邊設置的背景圖片,再拉動滾動條的時候,背景也滾動的,背景圖片是平鋪的? 有沒有辦法不平鋪,改成固定背景? 謝謝?!? 查看全部問答∨ |
|
序列檢測器的邏輯功能描述:10010 的序列檢碼器,狀態轉移圖如下圖所示: 我我有一點不明白, 在狀態B的情況下要是輸入1的話,直接進入A狀態不行么?G狀態下如果輸入1的話也可以直接進入A狀態啊,我就是這樣做 ...… 查看全部問答∨ |
|
最近折騰 matlab 和c28通訊,程序下進DSP后一直出現跑飛的現象。 經過N次的折騰,終于在裝了另一個版本的ccs3.3后成功了。 不知有大俠也碰到過這樣的問題不。 .matlab 和ccs 是否有安裝先后的問題。我實在是懶得再去試了,已經試的吐血了,裝了 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 有獎直播 | 德州儀器基于 Arm 的 AM62 處理器簡介
- 最后一周:免費獲取Pasternack《RF產品選型指南》2018 印刷版!
- 有獎直播|如何借助Mentor Xpedition AMS對汽車CAN總線進行仿真優化分析?
- 如何用3個關鍵步驟,來確保下一代設計安全性,深入解讀嵌入式設備DeepCover加密控制器,看視頻答題贏好禮!
- 好書共讀:《硬件設計指南:從器件認知到手機基帶設計》
- 【預約有禮】全球測量圈大咖直播:驗證5G核心網,確保最佳性能
- 中秋“國宴“ :拍攝板卡上的國產元器件,抽開心小禮品
- Keysight教你如何提高測試精度,答對問題還有禮品相送,速速參與!
- TI 培訓推薦有禮活動
- 【分享成長,10月有獎】EEWORLD優秀主題/回復第15期活動開始啦?。?!