我想驱动单片机数码管,我的 程序不晓得如何才能写对/------------------------------- // MCS51-Study.C //------------------------------ // [文件包含] 程序中用到哪些C51标准函数,就需要把该函数对应的头文件包含进来 //-----#include #include #include //----------------------------------- // 为提高书写效率做以下宏定义 //------------------------------- #define uchar unsigned char #define uint unsigned int #define ulong unsigned long
#define CLOSE 1//为了逻辑清晰 #define OPEN 0
sbit SECOND_L =P2^0;//数码管公共端控制位管脚 sbit SECOND_H =P2^1;
//============================================= //======================全局变量============= uchar timer_50ms; uchar hour; uchar minute; uchar second;
uchar leddata[]={0xC7, //"0" 0xFA, //"1" 0xAB, //"2" 0xB7, //"3" 0x9A, //"4" 0x98, //"5" 0x88, //"6" 0xF9, //"7" 0x87, //"8" 0x97, //"9" }; //------------------------------------------ // 键盘扫描相关的全局变量 //----------------------------------------- uchar key_value_previous; uchar key_press_counter; uchar key_value_main; //------------------------------------- // 函数声明 //------------------------------------------ void init_cpu(void); void show_time(uchar hour_data,uchar minute_data,uchar second_data); uchar key_scan(void); //=============================== //===================== ====== //===================== 主程序== //===================== ======= //======================================== void main (void) { init_cpu(); second = 0;
wqyloop: show_time(hour,minute,second); goto wqyloop; } //########################## 主程序结束 ######## //########################## 子程序开始 ######## // 函数功能:CPU初始化函数 // 串口波特率可以由T1或T2产生,本例中用T1产生波特率 // T1用于50毫秒精确定时
//================================================= void init_cpu(void) { TMOD=0x10;//T1为16位计数器
TH1=0x4c;//11.0592M晶振时T1定时时间长度为50毫秒 TL1=0x00; TR1=1;//T1开始定时
ET1=1; EA=1;//CPU中断开放 } //======================================= void show_time(uchar hour_data,uchar minute_data,uchar second_data) { uchar hour_data_h; uchar hour_data_l; uchar minute_data_h; uchar minute_data_l; uchar second_data_h; uchar second_data_l;
hour_data_h = hour_data/10; hour_data_l = hour_data%10; minute_data_h = minute_data/10; minute_data_l = minute_data%10; second_data_h = second_data/10; second_data_l = second_data%10;
//扫描显示
P0 = leddata[second_data_h]; SECOND_H=OPEN; SECOND_L=CLOSE;
P0 = leddata[second_data_l]; SECOND_H=CLOSE; SECOND_L=OPEN; } //=====================================中断===== // T1中断服务程序 //============================================ void T1_interrupt(void) interrupt 3 { TH1=0x4c;//11.0592M晶振时T1定时时间长度为50毫秒 TL1=0x00; timer_50ms++;//50毫秒中断一次 if(timer_50ms==20) {second = second+1; if(second==60) {second=0; } } } //======================================
|