count_one_bit

#include<stdio.h>
int count_one_bit(unsigned value)
{
	int ones;
	for( ones=0; value!=0; value=value>>1 )//移位是最好的除法
		if( value%2!=0 )
			ones=ones+1;
		//return ones;
		printf("%d",ones);
		return 0;
}

int main()
{
	count_one_bit(10);
	return 0;
}

解释这段代码:module e_one_mux( input clk_in, input mb_clk_en, //2048khz input [7:0] l_nrz_data1, //ʱ϶1ӳ�����źţ�8bit�������� input [7:0] l_nrz_data2, //ʱ϶2ӳ�����źţ�8bit�������� input [7:0] l_nrz_data3, //ʱ϶13ӳ�����źţ�8bit�������� output reg e_one_data, //֡�ź����� output reg e_one_fs, //֡�źű�־ output reg test1, output reg test2, output reg test3, output reg test4 ); /////////////////////////////////////////////////////////////////////////////////////// //1֡��32��ʱ϶��ÿʱ϶8bit,ÿ֡256bit // // reg [7:0] data1_reg; reg [7:0] data2_reg; reg [7:0] data3_reg; reg [255:0] e_one_data_reg; reg [7:0] count; wire [7:0] sync_code; assign sync_code = 8'h72; //8'b0111_0010 reg e_one_fs_1bs; always@(posedge clk_in) begin if(e_one_fs_1bs ==1) begin data1_reg <= l_nrz_data1; data2_reg <= l_nrz_data2; data3_reg <= l_nrz_data3; end if(mb_clk_en ==1) begin count <= count + 1'b1; //256��BITΪ���� if(count == 0) begin e_one_fs_1bs <= 1'b1; //ÿ256��bit����1�α�־ end else begin e_one_fs_1bs <= 1'b0; end if(e_one_fs_1bs == 1'b1) begin //ÿ256��bit����һ������ e_one_data_reg <= {sync_code,data1_reg,data2_reg,data3_reg,112'b0,112'h0}; end else begin e_one_data_reg <= {e_one_data_reg[254:0],1'b0}; end e_one_data <= e_one_data_reg[255]; end if(mb_clk_en ==1) begin if(e_one_fs_1bs) begin e_one_fs <= 1'b1; end else begin e_one_fs <= 1'b0; end end else begin e_one_fs <= 1'b0; end end ////////////////////////////////////////////////////////////////// always@(posedge clk_in) begin if(mb_clk_en ==1) begin test1 <= e_one_fs_1bs; test2 <= test1; test3 <= 1'b0; test4 <= 1'b0; end end endmodule
05-30
#include <reg51.h> /************************** * 引脚定义(严格对应Proteus图) **************************/ // P0口:数码管段选(共阴数码管,直接接P0) #define SEG_PORT P0 // P2口:数码管位选 + 红绿灯控制 sbit BIT_NORTH = P2^0; // 北侧数码管位选 sbit BIT_SOUTH = P2^1; // 南侧数码管位选 sbit BIT_WEST = P2^2; // 西侧数码管位选 sbit BIT_EAST = P2^3; // 东侧数码管位选 // P1口:红绿灯控制(对应Proteus图的LED引脚) sbit LED_NORTH_RED = P1^0; sbit LED_NORTH_YELLOW= P1^1; sbit LED_NORTH_GREEN = P1^2; sbit LED_SOUTH_RED = P1^3; sbit LED_SOUTH_YELLOW= P1^4; sbit LED_SOUTH_GREEN = P1^5; sbit LED_WEST_RED = P1^6; sbit LED_WEST_YELLOW = P1^7; sbit LED_WEST_GREEN = P3^0; // 注意:Proteus图中西侧绿灯可能接P3口,需确认! sbit LED_EAST_RED = P3^1; sbit LED_EAST_YELLOW = P3^2; sbit LED_EAST_GREEN = P3^3; /************************** * 数码管段选表(共阴数码管) * 0~9的段选码,直接对应P0口输出 **************************/ unsigned char code SEG_TABLE[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F // 9 }; /************************** * 延时函数(1ms延时,适配12MHz晶振) **************************/ void Delay_ms(unsigned int ms) { unsigned int i, j; for(i=0; i<ms; i++) for(j=0; j<120; j++); // 12MHz晶振下约1ms延时 } /************************** * 单个数码管显示函数 * bit_sel:选择哪个数码管(NORTH/SOUTH/WEST/EAST) * num:要显示的数字(0~9) **************************/ void Display_One(unsigned char bit_sel, unsigned char num) { SEG_PORT = SEG_TABLE[num]; // 输出段选码 // 选通对应位选引脚 switch(bit_sel) { case 0: BIT_NORTH = 0; break; case 1: BIT_SOUTH = 0; break; case 2: BIT_WEST = 0; break; case 3: BIT_EAST = 0; break; } Delay_ms(1); // 保持显示1ms SEG_PORT = 0x00; // 消影 // 关闭位选引脚 switch(bit_sel) { case 0: BIT_NORTH = 1; break; case 1: BIT_SOUTH = 1; break; case 2: BIT_WEST = 1; break; case 3: BIT_EAST = 1; break; } } /************************** * 两位数码管显示函数(处理倒计时) * 同时显示十位和个位 **************************/ void Display_Two(unsigned char bit_sel_high, unsigned char bit_sel_low, unsigned char num) { Display_One(bit_sel_high, num / 10); // 十位 Display_One(bit_sel_low, num % 10); // 个位 } /************************** * 红绿灯主逻辑函数 * 实现:南北绿灯30秒 → 黄灯3秒 → 红灯30秒 * 东西红灯30秒 → 绿灯30秒 → 黄灯3秒 **************************/ void TrafficLight_Logic() { unsigned char count; // 1. 南北绿灯亮,东西红灯亮(30秒倒计时) LED_NORTH_GREEN = 1; LED_SOUTH_GREEN = 1; LED_WEST_RED = 1; LED_EAST_RED = 1; // 其他灯熄灭 LED_NORTH_RED = 0; LED_NORTH_YELLOW= 0; LED_SOUTH_RED = 0; LED_SOUTH_YELLOW= 0; LED_WEST_YELLOW = 0; LED_WEST_GREEN = 0; LED_EAST_YELLOW = 0; LED_EAST_GREEN = 0; for(count=30; count>0; count--) { // 南北数码管显示倒计时(北侧+南侧) Display_Two(0, 1, count); // 东西数码管显示倒计时(西侧+东侧) Display_Two(2, 3, count); Delay_ms(1000); // 1秒延时 } // 2. 南北黄灯亮(3秒过渡) LED_NORTH_GREEN = 0; LED_SOUTH_GREEN = 0; LED_NORTH_YELLOW= 1; LED_SOUTH_YELLOW= 1; for(count=3; count>0; count--) { Display_Two(0, 1, count); Display_Two(2, 3, count); Delay_ms(1000); } LED_NORTH_YELLOW= 0; LED_SOUTH_YELLOW= 0; // 3. 南北红灯亮,东西绿灯亮(30秒倒计时) LED_NORTH_RED = 1; LED_SOUTH_RED = 1; LED_WEST_GREEN = 1; LED_EAST_GREEN = 1; // 其他灯熄灭 LED_NORTH_GREEN = 0; LED_NORTH_YELLOW= 0; LED_SOUTH_GREEN = 0; LED_SOUTH_YELLOW= 0; LED_WEST_RED = 0; LED_WEST_YELLOW = 0; LED_EAST_RED = 0; LED_EAST_YELLOW = 0; for(count=30; count>0; count--) { Display_Two(0, 1, count); Display_Two(2, 3, count); Delay_ms(1000); } // 4. 东西黄灯亮(3秒过渡) LED_WEST_GREEN = 0; LED_EAST_GREEN = 0; LED_WEST_YELLOW = 1; LED_EAST_YELLOW = 1; for(count=3; count>0; count--) { Display_Two(0, 1, count); Display_Two(2, 3, count); Delay_ms(1000); } LED_WEST_YELLOW = 0; LED_EAST_YELLOW = 0; } /************************** * 主函数 **************************/ void main() { // 初始化:所有位选引脚置高(关闭数码管) BIT_NORTH = 1; BIT_SOUTH = 1; BIT_WEST = 1; BIT_EAST = 1; // 初始化:所有灯熄灭 P1 = 0x00; P3 = 0x00; while(1) { TrafficLight_Logic(); // 循环执行红绿灯逻辑 } }
06-11
请帮忙检查下面的RF433 数据读取子程序逻辑,TM0 中断时间是200US,用于计时,重点检查进位步逻辑的正确性,谢谢!======;-------------------------------------------- L_EX_INT: btrss INTF,C_INT_EXT0_Bit ; If INT0IF is 1, then skip next instruction goto L_RET2Main;L_PBX_INT movia ~C_INT_EXT0 ; movar INTF ; Clear INT0IF(External interrupt flag bit) ;---------------RF433 DATA----------- DATA_0_MIN EQU 2;0X03 ; 数据0最小(0.2ms) DATA_0_MAX EQU 3;0X06 ; 数据0最大(0.6ms) DATA_1_MIN EQU 4;0X09 ; 数据1最小(0.8ms) DATA_1_MAX EQU 7;0X0E ; 数据1最大(1.4ms) BTRSS RF_START_FLAG ;; 检查是否已经开始接收 GOTO CLR_DATA_TIME_R ; BTRSS PORTB,0 ; 检测PB.0 高电平,RF IN PIN GOTO CLR_DATA_TIME_R ; Check_One: INCR DATA_24_BIT_COUNT_R,1 MOVR TM0_DATA_TIME_COUNT_0_R,0 ;TM0:1=200uS SUBIA DATA_1_MIN; ; ;C=0时,加法运算无进位或减法运算有借位。 ;C=1时,加法运算有进位或减法运算无借位. BTRSC STATUS,0 ; GOTO Check_Zero MOVR TM0_DATA_TIME_COUNT_0_R,0 SUBIA DATA_1_MAX; ; BTRSS STATUS,0 ; GOTO Check_Zero ; BCR STATUS,0 ; GOTO Shift_Data Check_Zero: MOVR TM0_DATA_TIME_COUNT_0_R,0 SUBIA DATA_0_MIN; ; BTRSC STATUS,0 ; GOTO Data_Error MOVR TM0_DATA_TIME_COUNT_0_R,0 SUBIA DATA_0_MAX;7 ; BTRSS STATUS,0 ; GOTO Data_Error ; BSR STATUS,0 ; Shift_Data: RLR Data_In_L,1 RLR Data_In_M,1 RLR Data_In_H,1 Check_Complete: ; 完成检测 MOVIA 24 ;; 加载位计数器 XORAR DATA_24_BIT_COUNT_R,0 ; ; 检查是否满24位;//Z=1时,算术或逻辑运算的结果是零。 BTRSS STATUS,2 ;Z ;; 判断是否完成 GOTO CLR_DATA_TIME_R ;; 未完成继续接收 NOP BTRSC RF_END ;T0SN RF_END GOTO CLR_DATA_TIME_R BSR RF_END ; 数据存储与校验 ; CALL DELAY_40MS MOVR Data_In_L,0 MOVAR current_RF_ID_R0 ;.0-7 ; 存储低8位 MOVR Data_In_M,0 MOVAR current_RF_ID_R1 MOVR Data_In_H,0 MOVAR current_RF_ID_R2 BTRSC FIRST_ID_SVAE_FLAG GOTO SVAE_ID ;首次遥控地址记录 MOVR current_RF_ID_R0,0 MOVAR DTAT_SAVE_R0 MOVR current_RF_ID_R1,0 MOVAR DTAT_SAVE_R1 MOVR current_RF_ID_R2,0 MOVAR DTAT_SAVE_R2 BSR FIRST_ID_SVAE_FLAG SVAE_ID: BSR RF_END BCR RF_Start_FLAG ; 清除接收开始标志 ; SET1 cooling_time_FLAG;;冷却时间500MS ; CLEAR TEMP_COUNT_1_R ;冷却时间500MS GOTO CLR_DATA_TIME_R Data_Error: ; 错误处理 CLRR DATA_24_BIT_COUNT_R ; 复位位计数器 CLRR TM0_DATA_TIME_COUNT_0_R CLRR TM0_SYNC_TIME_L_LVEVL_R BCR RF_Start_FLAG ; 清除接收开始标志 CLRR Data_In_H CLRR Data_In_M CLRR Data_In_L CLR_DATA_TIME_R: ; RF中断清除 CLRR TM0_DATA_TIME_COUNT_0_R ; 重置200us计时器 ;------------------------------------ L_RET2Main: movr R_StatusBuf,C_SaveToAcc movar STATUS ; Restore STATUS value swapr R_AccBuf,C_SaveToAcc ; Restore ACC value retie ; Return from interrupt and enable interrupt globally
最新发布
10-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值